0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go运行时:4年之后

jf_WZTOguxH 来源:InfoQ 作者:Michael Knyszek 2022-11-30 16:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

自 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 成本以及如何操作它们。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11344

    浏览量

    226056
  • 内存
    +关注

    关注

    9

    文章

    3240

    浏览量

    76534
  • Go
    Go
    +关注

    关注

    0

    文章

    45

    浏览量

    12623

原文标题:Go 运行时:4 年之后

文章出处:【微信号:AI前线,微信公众号:AI前线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Exein设立台湾亚太运营中心:以运行时安全重构物联网全球标准

    近期,全球嵌入式运行时安全领导企业Exein(艾芯软件)正式宣布在台湾设立亚太区运营中心暨台北办公室。这一战略举措标志着Exein在全球化布局中迈出关键一步,台北办公室将作为区域运营与技术研发的双重
    的头像 发表于 04-24 10:46 1308次阅读

    ELF-RV112B RKNN模型加载与运行时初始化

    ELF-RV112B RKNN模型加载与运行时初始化
    的头像 发表于 04-03 16:08 204次阅读
    ELF-RV112B RKNN模型加载与<b class='flag-5'>运行时</b>初始化

    Freertos 任务视图显示运行时值,但配置后百分比错误,为什么?

    我们使用的是 MCUXpresso 25.6.136、FreeRTOS 11.0.1 和 SDK_2.x_MCXA156 25.06.00。我们调整了以下教程来配置 FreeRTOS 的运行时统计
    发表于 04-03 07:12

    S32K322可以在运行时在时钟选项 A 和选项 F (A ↔ F) 之间动态切换吗?

    我正在使用S32K322并使用预定义的时钟选项(当前选项 A)S32K3xx 数据表和参考手册中所述。 我想确认一下是否是支持在运行时在选项 A (PLL @160 MHz) 之间动态切换
    发表于 04-02 07:43

    高压试验变压器运行时,哪些操作不能做?

    /T9641-1999标准和实际案例,跟大家梳理高压试验变压器运行时的禁忌操作,帮你规范操作,规避风险。首先,严禁调压器不在零位时合闸通电。根据JB/T9641-1999第
    的头像 发表于 03-04 11:04 213次阅读
    高压试验变压器<b class='flag-5'>运行时</b>,哪些操作不能做?

    Kubernetes容器运行时containerd与CRI-O如何选择

    Kubernetes 1.24版本正式移除了dockershim,Docker不再是K8s的默认容器运行时。这个变化直接影响了所有K8s集群的运维方式——升级到1.24+必须切换到containerd或CRI-O。
    的头像 发表于 02-26 09:54 466次阅读

    请问如何在运行时调整mcu的主频?

    能不能实现在运行时切换mcu的主频,但不重启mcu?
    发表于 01-16 07:12

    使用Nuclei Studio IDE计算程序运行时

    在使用Nuclei Studio IDE进行程序运行时,我们想知道我们编写的程序运行时间有多长怎么办呢?可以选择调用IDE里面时间记录函数_gettimeofday(),该函数用于记录程序运行到本
    发表于 10-28 08:25

    怎么实现一套容器运行时,并符合OCI规范?

    如题,怎么实现一套容器运行时,并符合OCI规范
    发表于 10-10 07:35

    装置日常运行时的安全防护检查有哪些注意事项?

    装置日常运行时的安全防护检查,核心原则是 “安全优先、不影响生产、快速识别风险”—— 既要避免因检查操作引发触电、停机等事故,也要高效捕捉运行中的动态隐患(如过热、防护松动)。以下是需重点关注的 8
    的头像 发表于 09-23 16:33 1801次阅读

    电能质量在线监测装置重启前,安全防护方面的检查和日常运行时的检查有何不同?

    电能质量在线监测装置重启前的安全防护检查与日常运行时的检查,核心差异源于 检查目标、时机、操作场景的本质不同 : 重启前检查是 “ 事前预防性检查 ”,聚焦 “避免重启操作引发安全事故(如触电、设备
    的头像 发表于 09-23 14:38 749次阅读
    电能质量在线监测装置重启前,安全防护方面的检查和日常<b class='flag-5'>运行时</b>的检查有何不同?

    MTB如何在运行时介入Jlink调试器?

    目前我们的应用程序在运行时会偶发死机现象,有没有办法能够在CYW43907芯片不复位的情况下介入调试器,查看导致死机的问题
    发表于 07-08 07:46

    CYW20706下载固件后,出现无法正常运行时无法启动的问题,怎么解决?

    我正在使用 CYW20706。 下载固件后,出现无法正常运行时无法启动的问题。 我不知道创建问题的场景。 突然间,它无法启动。 因此,当我使用 dump 读取内存时,我发现静态部分的内存中覆盖了奇怪
    发表于 07-01 08:24

    PLC设备运行时间数据采集到运维管理平台如何实现

    工业智能网关通过接入PLC,能够实时采集设备运行时间并通过5G/4G/WIFI/以太网等方式对接到云平台或上位机中,从而全面统计各个设备的运行时间,管理人员能够快速定位处于高负荷或闲置状态的设备,也能了解设备故障率、OEE等数据
    的头像 发表于 06-20 16:02 1010次阅读
    PLC设备<b class='flag-5'>运行时</b>间数据采集到运维管理平台如何实现

    步进电机在高速运行时反电动势波形与其动态响应变化

    步进电机高速运行时,反电动势幅值增大、频率升高,导致电流建立延迟、扭矩下降及动态响应滞后。所以在步进电机高速运行的方案中,我们需要通过优化电机选型(如低电感、适中极数)、升压驱动及BEMF反馈控制,可缓解高速性能衰减,避免PWM饱和导致的扭矩崩溃。
    的头像 发表于 06-10 16:06 2055次阅读
    步进电机在高速<b class='flag-5'>运行时</b>反电动势波形与其动态响应变化