trace的使用示例
import (
"fmt"
"log"
"os"
"runtime/trace"
"sync"
)
func main() {
//runtime.GOMAXPROCS(1)
// 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() {
fmt.Println(`Hello`)
wg.Done()
}()
go func() {
fmt.Println(`World`)
wg.Done()
}()
wg.Wait()
}
终端先执行 go run main.go
然后执行 go tool trace trace.out ,程序会使用默认浏览器打开一个页面
- View trace:查看跟踪,可以看到本次执行,启动的P(processer)有多少,以及协程分别在哪个P上执行等操作。辅助理解调度模型GMP
- 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 利用率
参考链接:
go 的性能分析工具 trace - 简书