如何用Go Trace定位Go程序中耗时5秒的卡顿函数
Go程序子进程阻塞定位问题解决
问题原因
当你通过exec.Command执行sleep 5时,Go会启动独立子进程,当前线程会进入阻塞等待子进程退出的状态。默认Trace视图仅展示线程整体耗时,不会自动展开阻塞时的栈追踪,所以看不到bar()函数的调用链。
可行的排查方案
方案1:利用Trace的阻塞分析视图
- 执行
go tool trace trace.out打开可视化界面 - 顶部菜单选择Block Profile(阻塞分析)
- 找到耗时5秒的阻塞事件,点击即可查看完整栈追踪,包含
bar()的调用上下文
方案2:使用pprof阻塞profile
- 生成阻塞profile文件:
curl -o block.out http://localhost:8080/debug/pprof/block?seconds=20 - 进入pprof交互模式:
go tool pprof block.out - 输入
top查看耗时最高的阻塞点,输入web生成调用图,直接定位到bar()内的exec.Command调用
方案3:Trace的Goroutine分析视图
- 在Trace界面选择Goroutine Analysis
- 筛选出对应时间段内状态为
blocked的Goroutine,点击详情即可查看阻塞时的栈信息,找到bar()的调用链
补充提示
如果你的代码中是通过Run()或Wait()等待子进程,这个等待操作属于线程阻塞,Trace和pprof都能捕获,但必须切换到对应的分析视图,默认概览视图不会展示栈追踪细节。
内容的提问来源于stack exchange,提问作者Gillespie
相关产品推荐
相关产品推荐

