写点什么

Go 运行时:4 年之后

  • 2022-10-11
    北京
  • 本文字数:1884 字

    阅读完需:约 6 分钟

Go运行时:4年之后

自 2018 年以来,Go GC,以及更广泛的 Go 运行时,一直在稳步改进。近日,Go社区总结了 4 年来 Go 运行时的一些重要变化。


这些重要变化主要是:

  • sync.Pool 是一种 GC 感知的重用内存的工具,具有较低的延迟影响,并且能够比之前更有效地回收内存。(Go 1.13)

  • Go 运行时能够更主动地将不需要的内存返回给操作系统,减少了内存消耗和出现内存不足的可能性。这将减少最高 20%的空闲内存消耗。(Go 1.13 和 1.14)

  • 在许多情况下,Go 运行时能够更容易地抢占 goroutine,最高可减少 90%的 stop-the-world 延迟。(Go 1.14)

  • Go 运行时能够比以前更有效地管理计时器,特别是在拥有多核 CPU 的机器上。(Go 1.14)

  • 在大多数情况下,现在使用 defer 语句的函数调用的开销与常规函数调用一样少。点击这里观看 Gophercon 2020 的相关演讲。(Go 1.14)

  • 内存分配器的慢路径对 CPU 核心的伸缩性更好,将吞吐量提升了最多 10%,并将尾部延迟降低了最多 30%,特别是在高度并行的程序中。(Go 1.14 和 1.15)

  • Go 内存统计数据现在可以通过更细粒度、更灵活、更高效的 API(runtime/metrics 包)来访问。这将获取运行时统计信息的延迟减少了两个数量级(从毫秒到微秒)。(Go 1.16)

  • Go 调度器在寻找新任务时花费的 CPU 时间减少了 30%。(Go 1.17)

  • Go 代码现在在 amd64、arm64 和 ppc64 上遵循基于寄存器的调用约定,将 CPU 效率提升了最多 15%。(Go 1.17 和 1.18)

  • Go GC 的内部审计和调度已经进行了重新设计,解决了长期存在的各种与效率和健壮性相关的问题。对于 goroutine 占内存使用很大一部分的应用程序来说,这显著降低了应用程序的尾部延迟(最高达 66%)。(Go 1.18)

  • Go GC 现在在应用程序空闲时会限制自己的 CPU 使用。这将空闲应用程序的 GC 周期的 CPU 使用降低了 75%,从而减少可能导致作业调度器混淆的 CPU 峰值。(Go 1.19)


这些变化对用户来说大多是看不见的——他们只需要升级 Go,就可以看到他们所熟悉和喜爱的 Go 代码运行得更好了。


一个新的“旋钮”


Go 1.19 带来了一个期待已久的特性,使用这个特性需要做一些额外的工作,但它具备很大的潜力:Go 运行时的软内存限制。


多年来,Go GC 只有一个调优参数——GOGC。GOGC 允许用户在 CPU 开销和内存开销之间做出权衡。多年来,这个“旋钮”为 Go 社区提供了很好的服务,被用在各种各样的场景中。


Go 运行时团队一直不愿意在 Go 运行时中添加新的旋钮,他们的理由很充分——每个新的旋钮代表了配置空间中的一个新的维度,我们需要对其进行测试和维护,而且可能要永远持续下去。旋钮的激增也给 Go 开发人员增加了理解和使用它们的负担,随着旋钮的增多,情况会变得愈加困难。因此,Go 运行时总是倾向于用最小配置实现合理的行为。


那么为什么要添加内存限制旋钮呢?


内存不像 CPU 时间那么具有可互换性。对于 CPU 时间,如果稍等片刻,将来总会得到更多的 CPU 时间。但对于内存,你所拥有的总是有限的。


内存限制解决了两个问题。


首先,当应用程序的内存使用峰值不可预测时,仅靠 GOGC 几乎无法防止内存被耗尽。如果只使用 GOGC,Go 运行时根本不知道它有多少可用的内存。通过设置内存限制,运行时能够意识到什么时候需要更努力地工作以减少内存开销,从而使运行时能够健壮地应对瞬时的、可恢复的负载峰值。


第二是为了避免不使用内存限制时出现的内存不足。我们必须根据内存峰值调优 GOGC,而为了保持较低的内存开销会导致更高的 GC CPU 开销,即使应用程序没有处于内存使用峰值且有足够的可用内存。这在容器化的环境中尤其重要。在容器化的环境中,程序被部署在具有独立预留内存的容器中。设置内存限制可以为峰值负载提供保护,并可以针对 CPU 开销更主动地调优 GOGC。


内存限制的设计旨在易用性和健壮性。例如,它是对应用程序中 Go 部分的整个内存占用的限制,而不仅仅是 Go 的堆,因此用户不需要额外计算 Go 运行时的开销。运行时还会根据内存限制调整其内存清除策略,以便在内存出现压力时更主动地将内存返回给操作系统。


虽然内存限制是一个强大的工具,但在使用时仍然要谨慎。其中一个需要注意的地方是,它会让你的程序陷入 GC 抖动状态——在这种状态下,程序运行 GC 的时间过多,导致没有足够的时间来处理其他任务。例如,如果内存限制设置得比程序实际需要的内存少,Go 程序可能会崩溃。以前不太可能出现 GC 抖动,除非显式对 GOGC 进行了大量调优。我们选择让内存耗尽而不是陷入抖动状态,因此作为一种缓解措施,运行时将 GC 限制为总 CPU 时间的 50%,即使这样会超过内存限制。


所有这些都需要慎重考虑,因此,作为这项工作的一部分,我们发布了一个新的 GC 指南,其中包含了交互式可视化的图表,以帮助你们理解 GC 成本以及如何操作它们。


更多可以查看 GC 指南:https://go.dev/doc/gc-guide


原文链接:https://go.dev/blog/go119runtime

2022-10-11 17:355688

评论

发布
暂无评论
发现更多内容

半年摸爬滚打,我是如何从小白进阶渗透测试工程师

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞分析

Redis学习之Redis概述及原理、基本操作及持久化

Linux服务器开发

redis 分布式 后端 中间件 Linux服务器开发

Hightopo可视化入局“智慧工厂”,助力企业改革创新

一只数据鲸鱼

数据可视化 绿色工业 3D数据可视化 高炉炼铁 智慧工业

DataPipeline实时数据融合平台V3.0里程碑版发布!澎湃新动能

DataPipeline数见科技

大数据 数据融合 数据管理

Mobileye智慧出行再加码,中国市场生态建设取得新进展

E科讯

爆款阿里P5到P7晋升之路,九大源码文档助我超神果然努力幸运并存

Java BAT

MindSpore教程免费学,还有入门奖品

Geek_6cdeb6

人工智能 机器学习 深度学习 自我提升 羊毛

我是如何从设计师转到软件行业的? | 可怜巴巴的程序猿

Python研究所

随笔 话题讨论

免费分享JDBC与MyBatis的优秀图书

Java入门到架构

Java

用好“实时数据管理”助推器,旭辉集团加快数字化转型步伐

DataPipeline数见科技

大数据 数据融合 数据管理

【架构实战营】第 7 模块作业

swordman

架构实战营

越学越有趣:『手把手带你学NLP』系列项目07 ——机器翻译的那些事儿

百度大脑

机器学习 nlp

32岁的我裸辞了,八年Java老鸟,只因薪水被应届生倒挂,在闭关三个月后拿到阿里Offer,定级P7!

Java架构师迁哥

TDengine JDBC整合Druid

山石道人

涛思数据 tdengine Druid Spring MVC taos-jdbc

阿里P8手抄本惨遭泄露,并出现病毒式传播,致28人斩获大厂offer

Java架构师迁哥

技术干货 | 录屏采集实现教程 —— Android端

ZEGO即构

大前端 音视频 录屏采集 Android端

聊聊事务与分布式系统-从零讲到通透

刘绍

sql 分布式 事务 2PC XA

2021年,BAT接连入局!“低代码”为何能备受资本追捧?

优秀

低代码

云南智慧公安研判分析系统搭建,重点人员研判分析平台

接任务时一定要锁定需求啊!(转自小明同学)

BinTools图尔兹

数据库 dba 国产数据库 运维开发

5分钟学会本地Pypi源搭建

Python研究所

Python

北鲲云超算平台——让科技更好地服务于用户

北鲲云

一图读懂DataPipeline实时数据融合平台V3.0

DataPipeline数见科技

大数据 数据融合 数据管理

再获权威认可!DataPipeline实时数据融合平台通过信通院大数据产品能力评测

DataPipeline数见科技

大数据 数据融合 数据管理

构筑智能制造时代“四重护城河”,联想中国开创产业新格局

科技大数据

正式发布!中国首个LF Edge捐赠项目Baetyl 2.2发布

百度开发者中心

物联网 开源技术

一周信创舆情观察(6.28~7.4)

统小信uos

2021百度云智峰会|DataPipeline携手百度赋能实时数据资产构建与应用

DataPipeline数见科技

大数据 数据融合 数据管理

图的应用——拓扑排序

若尘

数据结构 拓扑排序

“用友 • 华为云杯”第三届企业云服务开发者大赛

ToB行业头条

开发者 低代码 用友

“京东商城”亿级高并发秒杀系统到底是怎么设计的?自己做该如何下手?

Java架构师迁哥

Go运行时:4年之后_语言 & 开发_Michael Knyszek_InfoQ精选文章