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

news2024/11/18 19:55:26

🌷🍁 博主猫头虎(🐅🐾)带您 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://www.coloradmin.cn/o/1283268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不瞒各位,不安装软件也能操作Xmind文档

大家好,我是小悟 作为搞技术的一个人群,时不时就要接收产品经理发过来的思维脑图,而此类文档往往是以Xmind编写的,如果你的电脑里面没有安装Xmind的话,不好意思,是打不开这类后缀结尾的文档。 打不开的话…

Web漏洞分析-SQL注入XXE注入(中上)

随着互联网的不断普及和Web应用的广泛应用,网络安全问题愈发引起广泛关注。在网络安全领域中,SQL注入和XXE注入是两个备受关注的话题,也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞,带您探寻背后的原…

隐写2-MISC-bugku-解题步骤

——CTF解题专栏—— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 题目信息: 题目:隐写2 作者:harry 提示:f1g{xxx} 解题附件: 解题思路…

蓝桥杯物联网竞赛_STM32L071_9_按键矩阵扩展模块

原理图: 矩阵按键原理图: 实验板接口原理图: 得到对应图: 扫描按键原理: 按键的COLUMN1、2、3分别制0,每次只允许其中一个为0其他都是1(POW1和POW2正常状况为上拉),当有…

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概6000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

为了让亲戚也能用上chatgpt,我决定建一个代理站点

(本文试着用gpt优化了一下,效果有,但是不多) ChatGPT在编程中的应用 当ChatGPT刚出来的时候,我尝试了几次,感觉它就像是一个高级版的搜索引擎。但在过去的一个月里,我在公司经常使用GPT来查询…

ruby安装(vscode、rubymine)

https://rubyinstaller.org/downloads/ 下载exe安装即可 会弹出 输入3 安装成功 vscode插件市场安装ruby插件 新建一个目录,打开terminal bundle init //进行初始化(如果执行不了,应该是环境变量没生效,重启vscode&#…

Pillow操控图像,Python必备神器全面解析!

更多资料获取 📚 个人网站:ipengtao.com Pillow 是一个强大的 Python 图像处理库,它提供了丰富的功能,能够处理图像的加载、编辑、处理和保存。这个库建立在 Python Imaging Library (PIL) 的基础上,并延续了 PIL 的开…

芯擎科技与芯华章深度合作,软硬件协同开发加速车规级芯片创新

12月4日,系统级验证EDA解决方案提供商芯华章,与国产高端车规芯片设计公司芯擎科技正式建立战略合作。双方强强联手,芯擎科技导入芯华章相关EDA验证工具,赋能车规级芯片和应用软件的协同开发,助力大规模缩短产品上市周期…

预测胶质瘤预后的铜结合蛋白的转录组学特征

今天给同学们分享一篇生信文章“Transcriptomic Characterization of Copper-Binding Proteins for Predicting Prognosis in Glioma”,这篇文章发表在Brain Sci期刊上,影响因子为3.3。 结果解读: 铜结合蛋白的转录组表达 共有85种蛋白质被确…

【驾校管理系统源码】基于Springboot+Vue个人驾校预约管理系统

🍅 简介:500精品计算机源码学习 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 文末获取源码 目录 一、以下学习内容欢迎领取: Eclipse运行教学: Idea运行项目教学: Pycharm调试项目教学&#…

嵌入式rk3399系统问题

1、修改分辨率 修改4k分辨率: 1. 执行命令:cvt 3840 2160 50获得返回结果(2k分辨率为cvt 1920 1080 50),如图中所示: 2.修改文件:sudo vim /usr/share/X11/xorg.conf.d/20-modesetting.conf将获取到的Modeline如图中所…

二值图像分割统一项目

1. 项目文件介绍 本章为二值图像的分割任务做统一实现,下面是项目的实现目录 项目和文章绑定了,之前没用过,不知道行不行 data 文件夹下负责摆放数据的训练集测试集inference 负责放待推理的图片(支持多张图片预测分割)run_results 是网络训…

业务场景中Hive解析Json常用案例

业务场景中Hive解析Json常用案例 json在线工具 json格式转换在线工具 https://tool.lu/json/format格式互转: // 格式化可以合并整行显示 {"name":"John Doe","age":35,"email":"johnexample.com"}// 格式化…

vm net 方式 静态ip配置访问主机IP和外网

1、win 11 安装vm,镜像文件 F:\software\VMwork\CentOS-7-x86_64-Everything-1804.iso 2、配置网络 net 方式 3、右击网络--》属性---》更改适配器设置--》vmnet8 属性 如果没有vm1、vm8 虚拟机编辑---》虚拟机网络编辑器-->还原默认设置 注意:这…

ONLYOFFICE 协作空间 2.0 现已发布:新增公共房间、插件、重新分配数据、RTL 界面等功能

更新后的 ONLYOFFICE 协作空间新增诸多实用功能,全平台实现多项优化功能。请继续阅读,了解所有更新。 ONLYOFFICE 协作空间是什么 ONLYOFFICE 协作空间是一款开源效率平台,让您与同事、团队成员、客户、合作伙伴、承包商、赞助商和其他第三方…

大学生如何搭建自己的网站

这篇是我在大一的时候,写过的一篇文章。 前言 作为一名大学生,我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假,我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路,也附带了一些零零散散的细节。时间跨度…

GVIM 配置 for begin/end class/endclass 等配对

有时候我们的代码很长,或者结构比较复杂,多个if/else 或者begin/end 快嵌套,为了阅读方便,利用gvim插件实现块跳转还是很有实用性的,下面的.vimrc的配置,简单方便。 使用方式: 将光标定位到块头…

全球与中国汽车电力电子市场:增长趋势、竞争格局与前景展望

目前,世界各国都致力于转向更环保、更永续的传统交通替代方案。 电动车满足所有要求,因为它们具有零废气排放、改善空气品质、减少温室气体排放并创造更清洁、更健康的环境。此外,电动车的运作成本比传统内燃机驱动的汽车低,因为…

HTML5+CSS3+Vue小实例:饮料瓶造型文字旋转特效

实例:饮料瓶造型文字旋转特效 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】【JS】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" …