在处理 #36507 时,我注意到 Darwin 上的回归源之一是 sysUsed
,从 Go 1.14 开始,现在在整个内存分配中调用,即使只有一页实际上被回收。这种行为在 Go 1.11 中已经存在,在 Go 1.12 中消失,现在又回来了。
在 sysUsed
是无操作且我们依赖于第一次访问“回收”页面的情况下,这没有影响,因为我们已经只回收了实际需要的页面。在像 Darwin 和 Windows 这样具有显式“重新提交”步骤的系统上(即 sysUsed
不是无操作),这可能会对性能产生非平凡的影响,因为内核可能在未回收的页面上走来走去。
这对 #36218 中的性能回归产生了非常小的影响,但不足以阻止 1.14 版本的发布。
这里的修复方法很简单:我们需要降低在拥有完全信息(确切知道哪些页面被回收)的页面分配器中调用 sysUsed
的次数。如果给定的分配有超过 50% 的页面被回收,那么我们可能只需要调用 sysUsed
整个过程来节省一些系统调用开销。这个更改也是有道理的,因为我们已经在页面分配器的相当低级部分执行了 sysUnused
,所以将 sysUsed
降低到那里是有意义的。
4条答案
按热度按时间6yoyoihd1#
你好,mknyszek,感谢你报告这个问题并提供详细信息!鉴于我们还没有在Go1.15上解决这个问题的很多方面,我们还能做些什么,或者我们应该将其移动到Go1.16,然后将修复程序回溯移植到Go1.14和Go1.15吗?谢谢。
zpgglvta2#
这不是必需的。让我们将其移至1.16版本。也无需回溯,这里的性能回归在实践中非常轻微(即使在专门触发不良行为的微基准测试中),其他改进可能在实践中完全克服了它。值得修复,但不具有任何紧迫性。
k75qkfdt3#
感谢您,Michael!将其移动到Go1.16。
plicqrtu4#
你好,@mknyszek!我们应该推进到Go1.17还是Backlog?谢谢,祝您节日快乐!