2022年9月26日 Go生态洞察:Go运行时4年后的进展

news/2024/9/20 2:40:32

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁

🦄 博客首页——🐅🐾猫头虎的博客🎐
🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》 🐅 学会Golang语言,畅玩云原生,走遍大小厂~💐

🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:

☁️🐳 Go语言开发者必备技术栈☸️:
🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥


在这里插入图片描述

文章目录

    • 🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
  • 2022年9月26日 Go生态洞察:Go运行时4年后的进展
    • 摘要
    • 引言
    • 正文
      • 🌟 Go运行时的新变化
        • 1. `sync.Pool`的优化
        • 2. 主动回收内存
        • 3. 更灵活的goroutine抢占
        • 4. 更高效的定时器管理
        • 5. `defer`语句的优化
        • 6. 内存分配器的改进
        • 7. 更细致的内存统计API
        • 8. 调度器的CPU时间优化
        • 9. 基于寄存器的调用约定
        • 10. GC内部会计和调度的重新设计
        • 11. 空闲时限制GC的CPU使用
      • 🛠️ 一个新的调节器
      • 📚 结论
    • 总结
    • 下一篇预告
  • 原创声明

  • 原创作者: 猫头虎

  • 作者wx: Libin9iOak

  • 作者公众号: 猫头虎技术团队

在这里插入图片描述

2022年9月26日 Go生态洞察:Go运行时4年后的进展

🐱 猫头虎博主来啦!今天带来的是Go语言的最新动态。如果你是一个Go语言爱好者,那这篇文章一定不容错过!一起来看看自2018年以来Go运行时和Go垃圾收集器(GC)有哪些新的变化吧!🚀

摘要

🔍 在这篇文章中,作为猫头虎博主,我将带大家深入探讨自2018年以来Go运行时的发展。从sync.Pool的优化,内存分配器的改进,到新的软内存限制功能,我们将深入每一个更新,了解它们是如何使Go语言变得更高效。准备好了吗?让我们开始吧!

引言

自2018年我们关于Go GC的上一篇博客以来,Go运行时和Go垃圾收集器(GC)有了稳步的提升。这些改进主要是为了应对现实世界中Go程序的挑战和Go用户面临的实际问题。接下来,让我们一起回顾这些年来的亮点吧!

正文

🌟 Go运行时的新变化

1. sync.Pool的优化
  • Go 1.13版本中,sync.Pool成为了一个对GC更友好的内存重用工具,它的延迟影响更小,并且能更有效地回收内存。
2. 主动回收内存
  • Go运行时现在能更主动地将不需要的内存返还给操作系统,减少了内存消耗,降低了内存不足错误的发生几率。这降低了高达20%的闲置内存消耗。(Go 1.13 和 1.14)
3. 更灵活的goroutine抢占
  • 在许多情况下,Go运行时能更容易地抢占goroutines,减少了长达90%的停止世界(stop-the-world)延迟。点击此处观看Gophercon 2020的演讲。(Go 1.14)
4. 更高效的定时器管理
  • Go运行时比以前更有效地管理定时器,尤其是在多核CPU机器上。(Go 1.14)
5. defer语句的优化
  • 使用defer声明的函数调用现在在大多数情况下的成本与常规函数调用一样低。点击此处观看Gophercon 2020的演讲。(Go 1.14)
6. 内存分配器的改进
  • 内存分配器的慢路径现在能更好地随着CPU核心数量扩展,在高并行程序中提高了高达10%的吞吐量,降低了高达30%的尾延迟。进一步阅读。(Go 1.14 和 1.15)
7. 更细致的内存统计API
  • Go内存统计现在可以通过一个更细致、灵活和高效的API访问,即[runtime/metrics包](https://pkg

.go.dev/runtime/metrics)。这降低了获取运行时统计数据的延迟两个数量级(从毫秒到微秒)。(Go 1.16)

8. 调度器的CPU时间优化
  • Go调度器在寻找新工作时消耗的CPU时间减少了高达30%。(Go 1.17)
9. 基于寄存器的调用约定
  • 在amd64、arm64和ppc64上,Go代码现在遵循一种基于寄存器的调用约定,提高了高达15%的CPU效率。(Go 1.17 和 Go 1.18)
10. GC内部会计和调度的重新设计
  • Go GC的内部会计和调度已经重新设计,解决了一系列长期存在的效率和鲁棒性问题。这对于goroutines栈占据了大量内存使用的应用程序而言,显著降低了应用程序的尾延迟(高达66%)。(Go 1.18)
11. 空闲时限制GC的CPU使用
  • Go GC现在在应用程序空闲时限制了自己的CPU使用。这导致在非常空闲的应用程序中,GC周期期间的CPU利用率降低了75%,减少了可能引起作业形状混淆的CPU峰值。(Go 1.19)

🛠️ 一个新的调节器

随着Go 1.19的发布,一个期待已久的特性终于来了:Go运行时的软内存限制。

多年来,Go GC只有一个调节参数:GOGCGOGC让用户调整由Go GC做出的CPU开销与内存开销之间的权衡。这个“调节器”长期以来服务于Go社区,涵盖了广泛的用例。

为什么要添加一个内存限制调节器呢?

内存与CPU时间不同,不像CPU时间那样总有未来可以等待。但对于内存来说,有一个极限。

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

首先,当应用程序的峰值内存使用不可预测时,仅靠GOGC几乎无法防止内存耗尽。仅有GOGC时,Go运行时根本不知道它能使用多少内存。设置内存限制使得运行时能够抵抗瞬时的、可恢复的负载峰值,通过意识到何时需要更努力地减少内存开销。

其次,为了在不使用内存限制的情况下避免内存不足错误,必须根据峰值内存调整GOGC,即使在应用程序不在峰值内存使用时也保持低内存开销,从而导致更高的GC CPU开销。这在我们这个容器化的世界尤为重要,程序被放置在具有特定和隔离的内存预留的箱子中;我们可能会更好地利用它们!通过提供对负载峰值的保护,设置内存限制允许GOGC在CPU开销方面进行更积极的调整。

内存限制的设计旨在易于采用和鲁棒。例如,它是对应用程序Go部分的整个内存占用的限制,而不仅仅是Go堆,所以用户不必担心计算Go运行时的开销。运行时也会根据内存限制调整其内存清理政策,以便在面对内存压力时更积极地将内存返回给操作系统。

然而,尽管内存限制是一个强大的工具,但在使用时仍需小心。一个重要的注意事项是,它可能导致程序出现GC抖动:程序花费太多时间运行GC,导致无法有效地进行实质性工作。例如,如果为Go程序设置的内存限制过低,不足以满足程序实际所需的内存,那么程序可能会出现抖动。以前,除非GOGC被明确调整为更偏重于内存使用,否则GC抖动是不太可能发生的。作为一种缓解措施,即使这意味着超出内存限制,运行时也会将GC限制在总CPU时间的50%以内。

考虑到这些,我们发布了一份全新的GC指南,其中包含互动式可视化内容,帮助您理解GC成本以及如何操纵它们。

📚 结论

尝试使用内存限制!在生产环境中使用它!阅读GC指南!

我们一直在寻求反馈,以改进Go,但同时也希望听到关于它如何有效工作的故事。发送我们反馈!

特性描述Go版本
sync.Pool优化低延迟影响,高效内存回收Go 1.13
主动回收内存减少内存消耗,降低内存不足错误Go 1.13, 1.14
Goroutine抢占减少停止世界延迟Go 1.14
定时器管理在多核CPU上效率更高Go 1.14
defer优化成本接近常规函数调用Go 1.14
内存分配器更好的CPU核心扩展性Go 1.14, 1.15
内存统计API更快的运行时统计数据访问Go 1.16
调度器CPU优化减少CPU时间消耗Go 1.17
基于寄存器的调用约定提高CPU效率Go 1.17, 1.18
GC内部重设计减少尾延迟,提高效率Go 1.18
限制GC的CPU使用减少CPU利用率Go 1.19

总结

以上就是自2018年以来Go运行时的主要进展。这些改进大多对用户来说是不可见的:他们熟悉和喜爱的Go代码,只需升级Go版本就能运行得更好。

本文被猫头虎的Go生态洞察专栏收录,详情点击这里。

下一篇预告

🔜 下一篇文章我们将探讨《Go语言十三年》——深入Go语言的发展历程,了解它是如何从一个小众语言成长为今天的热门技术。敬请期待! 点击预览

在这里插入图片描述

原创声明

======= ·

  • 原创作者: 猫头虎

  • 作者wx: Libin9iOak
    在这里插入图片描述

  • 作者公众号: 猫头虎技术团队

在这里插入图片描述

学习复习Go生态

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,洞察Go生态,共同成长。


http://lihuaxi.xjx100.cn/news/1863201.html

相关文章

C++ Primer Plus第十三章笔记

目录 基类 构造函数:访问权限的考虑 1.2 派生类和基类之间的特殊关系 继承:is-a关系 多态公有继承 静态联编和动态联编 指针和引用类型的兼容性 虚成员函数和动态联编 虚函数的注意事项 构造函数 析构函数 友元 没有重新定义 重新定义将隐…

Java中CAS底层原理

一、概述 CAS 是 compare and swap 的简写,即比较并交换。通过比较工作内存值(预期值A)和主物理内存的共享值V是否相同,相同则执行规定操作,否则继续比较直到主内存和工作内存的值一致为止。这个过程是原子的。 在 Java 平台上对这种操作进行了包装。在 …

【源码篇】基于SpringBoot+Vue实现的在线考试系统

文章目录 系统说明技术选型成果展示账号地址及其他说明 系统说明 基于SpringBootVue实现的在线考试系统是为高校打造的一款在线考试平台。 系统功能说明 1、系统共有管理员、老师、学生三个角色,管理员拥有系统最高权限。 2、老师拥有考试管理、题库管理、成绩管…

【云备份】客户端模块

33. 客户端数据管理模块实现-数据信息设计 客户端要实现的功能是对指定文件夹中的文件自动进行备份上传。但是并不是所有的文件每次都需要上传,我们需要能够判断,哪些文件需要上传,哪些不需要,因此需要将备份的文件信息给管理起来…

漫谈HBuilderX App-Jenkins热更新构建

漫谈Uniapp App热更新包-Jenkins CI/CD打包工具链的搭建 零、写在前面 HBuilderX是DCloud旗下的IDE产品,目前只提供了Windows和Mac版本使用。本项目组在开发阶段经常需要向测试环境提交热更新包,使用Jenkins进行CD是非常有必要的一步。尽管HBuilderX提…

【vue】vue-slick-carousel插件,实现横向滚动列表手动左右滚动(也可设置为自动滚动)

需求:图片列表横向滚动的时候,隐藏原始滚动条,通过左右箭头控制滚动条往左右按一定的步长移动。 el-carousel走马灯一滚动就是一屏,不适合我的需求 在npm官网搜vue-slick-carousel,查看更详细的配置 vue-slick-caro…

11. 哈希冲突

上一节提到,通常情况下哈希函数的输入空间远大于输出空间,因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一桶索引。 哈希冲突会导致查询结果错误&#…

SSM项目实战-前端-在Index.vue中展示第一页数据

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/schedule.js import request from "../util/request.js";export let getSchedu…