执行跟踪
使用 go tool trace 进行 Goroutine 级别的分析
执行跟踪 是 CoddyKit 上的免费 Go Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
什么是执行追踪
Go 执行追踪器会记录协程调度、GC 事件、系统调用和堆增长的时间线。它能以可视化方式呈现并行性和延迟,这是 CPU 或堆性能分析无法提供的。
捕获追踪
通过 HTTP 端点捕获追踪:
curl http://localhost:6060/debug/pprof/trace?seconds=5 -o trace.out
go tool trace trace.out基于文件的追踪
使用 runtime/trace 以编程方式记录追踪:
f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()
// run workloadgo test -trace
在测试或基准测试运行期间捕获追踪:
go test -trace trace.out -bench=. ./...
go tool trace trace.out追踪查看器
追踪查看器(go tool trace)会在浏览器中打开,显示协程时间线、GC 事件、堆大小,以及任意时刻每个协程的堆栈跟踪。
协程分析
协程分析视图按函数对协程进行分组,并显示每个协程在以下状态中所处的时长:运行、可运行(等待 P)、阻塞(通道、互斥锁或系统调用)以及休眠。
查找调度器延迟
“可运行”时间较长意味着协程已就绪但尚未被调度。这表明有过多协程在争用 GOMAXPROCS 个 P,或者进程 CPU 资源不足。
GC 的影响
GC 的全局暂停会在所有协程上显示为灰色条。暂停时间过长或 GC 过于频繁,通常表示分配过多——请结合堆性能分析来减少分配。
用户注释
使用 trace.WithRegion 和 trace.Log 向追踪中添加自定义区段,为您自己的代码部分添加注释,以便更轻松地进行分析。
trace.WithRegion(ctx, "parse request", func() {
parseRequest(req)
})任务与区域
trace.NewTask 会将相关区域归入命名任务,使您能够测量跨多个协程的逻辑操作的端到端延迟。
ctx, task := trace.NewTask(ctx, "handle request")
defer task.End()追踪与性能分析
CPU 性能分析:哪些函数会随时间消耗 CPU。堆性能分析:哪些函数会分配内存。追踪:协程何时运行、阻塞,以及 GC 如何交错进行——不同工具用于回答不同问题。
快速检查
执行追踪中的“可运行”协程状态表示什么?
回顾:执行追踪
关键要点:
- go tool trace 显示协程时间线、GC 事件和调度情况
- 通过 HTTP 端点或 runtime/trace 包捕获追踪
- 可运行时间 → 调度器竞争;GC 暂停 → 分配过多
- 用户注释(WithRegion、NewTask)用于标记您自己的代码部分
常见问题解答
「执行跟踪」课时是免费的吗?
是的 — 「执行跟踪」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「执行跟踪」这节课中我会学到什么?
使用 go tool trace 进行 Goroutine 级别的分析 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「执行跟踪」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。