trace 这个工具跟踪采集一段时间的信息,然后 dump 成文件,最后调用 go tool trace 分析 dump 文件,并且支持将分析结果以 web 的形式打开。
它适合如下场景:
- 找出程序在一段时间内做什么?
trace dump文件生成方式有3种:
- 运行 go test 的时候,带上
-trace
参数标记:go test -trace=trace.out - 从 pprof 中获取实时的 trace dump 文件
curl http://127.0.0.1:6060/debug/pprof/trace?seconds=10 > trace.out
- 在代码中编码嵌入写入trace dump 文件
package main import ( "io/ioutil" "log" "os" "runtime/trace" "sync" ) func main() { // 1. 创建trace持久化的文件句柄 f, err := os.Create("trace.out") if err != nil { log.Fatalf("failed to create trace output file: %v", err) } defer func() { if err := f.Close(); err != nil { log.Fatalf("failed to close trace file: %v", err) } }() // 2. trace绑定文件句柄 if err := trace.Start(f); err != nil { log.Fatalf("failed to start trace: %v", err) } defer trace.Stop() // 下面就是你的程序代码 var wg sync.WaitGroup wg.Add(2) // 一个协程用来读文件 go func() { defer wg.Done() ioutil.ReadFile(`code.txt`) }() // 写文件协程 go func() { defer wg.Done() ioutil.WriteFile(`code2.txt`, []byte(`hello world`), 0644) }() wg.Wait() }
生成trace dump文件后,我们可以使用go tool trace trace.out -http=127.0.0.1:62155
:
页面上的内容如下:
- View trace:查看跟踪
- Goroutine analysis:Goroutine 分析
- Network blocking profile:网络阻塞概况
- Synchronization blocking profile:同步阻塞概况
- Syscall blocking profile:系统调用阻塞概况
- Scheduler latency profile:调度延迟概况
- User defined tasks:用户自定义任务
- User defined regions:用户自定义区域
- Minimum mutator utilization:最低 Mutator 利用率
网友评论