news 2026/8/29 6:00:57

Go1.26 新特性:10年,Goroutine 调度指标终于来了!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go1.26 新特性:10年,Goroutine 调度指标终于来了!

大家好,我是煎鱼。

今天给大家分享的是 Go1.26 即将引入的一个重磅特性—— Goroutine 调度指标。

这个特性看似不起眼,但对生产环境的可观测性来说,非常重要。值得升级。

背景

说起 Go 的 runtime/metrics 包,相信做过性能调优的同学都不陌生。

这个包从 Go1.16 就开始提供各种运行时的统计数据,像内存分配、GC 情况等。

很无奈的是,这么多年过去了,关于 Goroutine 调度器的 metrics 指标一直是空白的。

一些痛点

我们来看看实际开发中的痛点。

如果线上服务突然变慢了,打开 Grafana 监控一看:

  • CPU 使用率正常。

  • 内存也没问题。

  • GC 次数也在合理范围。

问题出在哪?

很可能是 Goroutine 调度出了问题,从而引发了一些异常点。 但你没法直接观测到:

  • 到底创建了多少个 Goroutine?

  • 有多少 Goroutine 在排队等待执行?

  • 有没有 Goroutine 卡在系统调用里出不来?

  • 线程数是不是爆了?

“新” 提案

这就很尴尬了。早在 2016 年,就有开发者在 issue #15490 中提出这个需求。在即将 2026 年倒是实现了。

描述的需求很简单:“MemStats 提供了一种监控内存分配和 GC 的方式,我们也需要一个类似的工具来监控 Goroutine 调度器。”

简单来讲,提案的诉求就是需要能看到:

  • 总共创建了多少 Goroutine。

  • 当前有多少 Goroutine。

  • 启动了多少线程。

  • Goroutine 从就绪到运行的延迟情况。

这个提案一提就是快 10 年,Go 核心团队终于在 Go1.26 要把它落地了。

新的 Goroutine 调度指标

接下来我们看下具体新增了哪些指标。

Go1.26 在 runtime/metrics 包中新增了 6 个关于 Goroutine 和线程的指标:

  1. 从程序启动到现在总共创建的 Goroutine 数量:/sched/goroutines-created:goroutines

  2. 处于系统调用或 cgo 调用中的 Goroutine 数量(近似值):/sched/goroutines/not-in-go:goroutines

  3. 已就绪但还没执行的 Goroutine 数量(近似值):/sched/goroutines/runnable:goroutines

  4. 正在执行的 Goroutine 数量(近似值):/sched/goroutines/running:goroutines

  5. 等待某个资源的 Goroutine 数量(近似值),例如等 I/O:/sched/goroutines/waiting:goroutines

  6. 当前 Go runtime 拥有的活跃线程数:/sched/threads/total:threads

这里有几个点需要注意:

1、按状态统计的 Goroutine 数量都标注了近似值。

为什么是近似的?因为 Goroutine 的状态切换非常频繁,Go runtime 不可能为了统计精确值而加锁,那样会严重影响性能。

所以这些数字可能有一点点偏差,但对监控来说已经足够了。

2、按状态分类的数量加起来,不一定等于当前存活的 Goroutine 总数(/sched/goroutines:goroutines)。这也是因为采样时机的问题。

3、所有指标都使用 uint64 类型的计数器。

使用例子

后面新版本发布后,我们来看下怎么用这些新指标。

假设我们写了一个简单的程序,启动了一些 Goroutine 做各种事情:

package main import ( "fmt" "runtime/metrics" "time" ) func main() { // 启动一些 Goroutine 模拟真实场景 go work() // 等待 100ms 让 Goroutine 跑一会儿 time.Sleep(100 * time.Millisecond) // 打印 Goroutine 相关指标 fmt.Println("Goroutine 调度指标:") printMetric("/sched/goroutines-created:goroutines", "累计创建") printMetric("/sched/goroutines:goroutines", "当前存活") printMetric("/sched/goroutines/not-in-go:goroutines", "系统调用/CGO") printMetric("/sched/goroutines/runnable:goroutines", "等待执行") printMetric("/sched/goroutines/running:goroutines", "正在执行") printMetric("/sched/goroutines/waiting:goroutines", "等待资源") // 打印线程相关指标 fmt.Println("\n线程指标:") printMetric("/sched/gomaxprocs:threads", "最大 P 数量") printMetric("/sched/threads/total:threads", "当前线程数") } func printMetric(name string, descr string) { sample := []metrics.Sample{{Name: name}} metrics.Read(sample) // 这里为了演示简化了错误处理 // 实际生产环境要检查 sample[0].Value.Kind fmt.Printf(" %s: %v\n", descr, sample[0].Value.Uint64()) } func work() { // 这里省略具体的工作逻辑 // 可能是网络请求、计算任务等 }

运行后输出大概是这样:

Goroutine 调度指标: 累计创建: 52 当前存活: 12 系统调用/CGO: 0 等待执行: 0 正在执行: 4 等待资源: 8 线程指标: 最大 P 数量: 8 当前线程数: 4

可以看到,程序累计创建了 52 个 Goroutine,当前还存活 12 个。

其中 4 个正在执行,8 个在等待某些资源(可能是 channel、锁、或者 I/O),没有 Goroutine 卡在系统调用里,也没有 Goroutine 在排队等待执行。

读取这些指标的方式和之前的runtime/metrics完全一样,都是通过metrics.Read来获取。使用上基本没有难度。

总结

这个提案从 2016 年提出到现在,社区一直呼声很高。

Go 核心团队成员 Michael Knyszek 最终在 2024 年底推动了这个特性的实现,相关的 CL(Change List)已经提交。

这个特性虽然 API 很简单,但对生产环境的可观测性意义重大。有了这些指标,我们终于能直接观测到 Goroutine 的调度状态,不用再猜来猜去了。

等 Go1.26 正式发布后,大家可以第一时间把这些指标用起来,相信会对大家定位生产问题有不小的帮助。

关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

原创不易 点赞支持

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 18:13:42

小瓶RPA终极指南:告别重复劳动的免费自动化神器

小瓶RPA终极指南:告别重复劳动的免费自动化神器 【免费下载链接】小瓶RPA 小瓶RPA,专业用户的专业RPAAI软件。 长难业务自动化流程专精,轻量级简单全能的RPA软件,显著降本增效 & 工作100%准确 & 非侵入式集成。同时支持浏…

作者头像 李华
网站建设 2026/8/28 15:09:48

FaceFusion模型压缩与加速:更适合边缘设备的轻量化版本来了

FaceFusion模型压缩与加速:更适合边缘设备的轻量化版本来了 在智能手机、智能眼镜和嵌入式摄像头日益普及的今天,用户对“即时换脸”这类视觉特效的需求不再满足于云端服务——延迟高、依赖网络、隐私风险大。越来越多的应用场景要求人脸融合&#xff08…

作者头像 李华
网站建设 2026/8/27 12:57:17

Markdown Page:终极简单的网页制作工具

Markdown Page:终极简单的网页制作工具 【免费下载链接】md-page 📝 create a webpage with just markdown 项目地址: https://gitcode.com/gh_mirrors/md/md-page 想要快速创建网页却不想学习复杂的前端技术?Markdown Page 正是你需要…

作者头像 李华
网站建设 2026/8/25 14:22:39

小智AI音箱JSON配置解析实战

小智AI音箱JSON配置解析实战在智能音箱这类资源受限的嵌入式设备上,如何用最小代价实现最大灵活性?这个问题困扰过不少开发团队。我们曾遇到这样一个场景:某批次小智AI音箱因海外部署需要临时更改时区和语音唤醒词,若按传统方式修…

作者头像 李华
网站建设 2026/8/27 3:44:06

Langchain-Chatchat能否用于法律文书智能检索?案例分享

Langchain-Chatchat能否用于法律文书智能检索?案例分享 在律师事务所的某个深夜,一位年轻律师正为第二天的庭审准备材料。他需要确认“民间借贷利率保护上限”是否有新的司法解释出台,于是打开电脑,在一堆PDF文件、内部备忘录和历…

作者头像 李华
网站建设 2026/8/29 3:07:37

多传感器数据对齐与空间特征融合技术解析

多传感器数据对齐与空间特征融合技术解析 【免费下载链接】OpenPCDet 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPCDet 在自动驾驶3D感知系统中,激光雷达与摄像头的数据融合是提升检测性能的关键环节。OpenPCDet工具箱通过精心设计的坐标转换机制&…

作者头像 李华