go调度和性能分析利器之trace

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 - 简书
 

猜你喜欢

转载自blog.csdn.net/xia_2017/article/details/128468544