BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Go 1.6将进一步改进垃圾收集器

| 作者 Sergio De Simone 关注 17 他的粉丝 ,译者 臧秀涛 关注 4 他的粉丝 发布于 2015年9月12日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

尽管Go 1.5刚刚发布,仍然相对较新,但是Go团队已经在致力于改进其新的低延迟并发垃圾收集器,希望Go更适合新的应用领域。Google工程师Austin ClementsRick Hudson如是

Go 1.5用新的垃圾收集器代替了原来的STW(stop-the-world) GC,解决了延迟问题。当负载较重时,每50ms,新的GC的活动时间可以控制在10ms以下,从而使Go程序在一般情况下能运行得更快些。在更极端的情况下,停顿可以从300ms降到4ms

Go 1.6的目标是进一步稳定GC,并在以下几个方面做出改进:

  • 状态协调(State coordination):Go 1.5 GC有个主要瓶颈是从Go 1.4继承来的,源自其集中式的GC协调器(coordinator),这是一个单独的goroutine,它会将工作进一步分派给worker goroutine去完成。一种解决方案是用去中心化的状态机代替集中式协调器。这样修改有个额外的好处,使得重新设计标记完成屏障(mark completion barrier)成为可能,因为它已经变得非常凌乱,而且性能很差。
  • 信用系统(Credit system):Go 1.5在两个不同的地方使用了一个信用系统:一个是确保清扫(sweeping)在一个GC周期和下一次触发堆操作(the next heap trigger)之间完成,一个是确保扫描(scanning)在触发堆操作(an heap trigger)和随后实现堆处理目标之间完成。改进信用系统的一种建议方法是,使其操作总是在black阶段进行,以避免未完成的分配操作进入下一个GC周期。
  • 标记结束(Mark termination):根据Clements和Hudson的介绍,在Go 1.5中,标记结束阶段是停顿时间的大头。这里的目标是尝试并确保大部分应用可以在10ms停顿的阈值下运行,这也是Go 1.5在很多情况下已经实现了的。希望所做修改的复杂度较低或中等,比如把finalizer扫描从标记结束阶段移到并发扫描,这样对于每1GB大小的堆,应该可以节省1ms,以及去掉一个成本很高的计数循环,对于较大的堆,这个循环占去了标记阶段的另外一半。
  • sweeper和scavenger:某些程序会在sweeper上消耗大量时间,在这上面投入些精力,应该有性能改进。一个非常激进的方案是完全去掉sweeper。还有一个不那么激进的方案,可以在GC阶段最后,尽早释放较大的对象,并且在所有的系统上支持scavenger,不管物理页面是多大。

上面只是对计划所做改进的一个概览,欲全面了解,可以阅读原始文档。文档中还有进一步指向GitHub issues的链接,这些issues记录 了每个改变背后的理由以及建议方案。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT