https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs
GODEBUG=schedtrace=1000 godoc -http=:6060
...
SCHED 6016ms: gomaxprocs=4 idleprocs=0 threads=26 spinningthreads=0 idlethreads=20 runqueue=1 [3 4 0 10]
SCHED:调试信息输出标志字符串,代表本行是goroutine调度器相关信息的输出。
6016ms:从程序启动到输出这行日志经过的时间。
gomaxprocs:P的数量。
idleprocs:处于空闲状态的P的数量。通过gomaxprocs和idleprocs的差值,我们就可以知道当前正在执行Go代码的P的数量。
threads:操作系统线程的数量,包含调度器使用的M数量,加上运行时自用的类似sysmon这样的线程的数量。
spinningthreads:处于自旋(spin)状态的操作系统数量。
idlethread:处于空闲状态的操作系统线程的数量。
runqueue=1:Go调度器全局运行队列中G的数量。
[3 4 0 10]:分别为4个P的本地运行队列中的G的数量。
使用objdump工具:objdump -S go二进制文件。
使用gdb disassemble。
使用go tool工具生成汇编代码文件:go build -gcflags '-S ' xx.go > xx.s 2>&1。
将Go代码编译成汇编代码:go tool compile -S xx.go > xx.s。
使用go tool工具反编译Go程序:go tool objdump -S go-binary > xx.s。