go 运行时:sysUsed经常在非回收内存上调用

mefy6pfw  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(49)

在处理 #36507 时,我注意到 Darwin 上的回归源之一是 sysUsed ,从 Go 1.14 开始,现在在整个内存分配中调用,即使只有一页实际上被回收。这种行为在 Go 1.11 中已经存在,在 Go 1.12 中消失,现在又回来了。
sysUsed 是无操作且我们依赖于第一次访问“回收”页面的情况下,这没有影响,因为我们已经只回收了实际需要的页面。在像 Darwin 和 Windows 这样具有显式“重新提交”步骤的系统上(即 sysUsed 不是无操作),这可能会对性能产生非平凡的影响,因为内核可能在未回收的页面上走来走去。
这对 #36218 中的性能回归产生了非常小的影响,但不足以阻止 1.14 版本的发布。
这里的修复方法很简单:我们需要降低在拥有完全信息(确切知道哪些页面被回收)的页面分配器中调用 sysUsed 的次数。如果给定的分配有超过 50% 的页面被回收,那么我们可能只需要调用 sysUsed 整个过程来节省一些系统调用开销。这个更改也是有道理的,因为我们已经在页面分配器的相当低级部分执行了 sysUnused ,所以将 sysUsed 降低到那里是有意义的。

6yoyoihd

6yoyoihd1#

你好,mknyszek,感谢你报告这个问题并提供详细信息!鉴于我们还没有在Go1.15上解决这个问题的很多方面,我们还能做些什么,或者我们应该将其移动到Go1.16,然后将修复程序回溯移植到Go1.14和Go1.15吗?谢谢。

zpgglvta

zpgglvta2#

这不是必需的。让我们将其移至1.16版本。也无需回溯,这里的性能回归在实践中非常轻微(即使在专门触发不良行为的微基准测试中),其他改进可能在实践中完全克服了它。值得修复,但不具有任何紧迫性。

k75qkfdt

k75qkfdt3#

感谢您,Michael!将其移动到Go1.16。

plicqrtu

plicqrtu4#

你好,@mknyszek!我们应该推进到Go1.17还是Backlog?谢谢,祝您节日快乐!

相关问题