pprof是Golang自带的一款开箱即用的性能监控和分析工具, 使用非常简单方便。
# 1. pprof使用
runtime/pprofnet/http/pprof
runtime/pprofruntime.StartCPUProfileruntime.StopCPUProfilenet/http/pprofruntime/pprofnet/http/pprof
使用示例如下:
- runtime/pprof
cpu.prof
- net/http/pprof
net/http/pprof
之后就可以通过 http://localhost:8080/debug/pprof/[类型] 获取对应的采样数据。支持的"[类型]"有:
类型 | 描述 |
---|---|
allocs | 内存分配情况的采样信息 |
blocks | 阻塞操作情况的采样信息 |
cmdline | 显示程序启动命令参数及其参数 |
goroutine | 显示当前所有协程的堆栈信息 |
heap | 堆上的内存分配情况的采样信息 |
mutex | 锁竞争情况的采样信息 |
profile | cpu占用情况的采样信息,点击会下载文件 |
threadcreate | 系统线程创建情况的采样信息 |
trace | 程序运行跟踪信息 |
重点我们关注以下几种类型:
goroutinegoroutineruntime.MemProfileRategoroutinegoroutinechannelmutexruntime.SetBlockProfileRategoroutineruntime.SetMutexProfileFraction
# 2. 分析实践
# 2.1 CPU使用分析
通过以下命令分析CPU使用情况。
top
flatsumcum
类型 | 描述 | 举例 |
---|---|---|
flat | 该函数占用CPU的耗时 | selectnbrecv占用CPU的耗时是12.29s |
flat% | 该函数占用CPU的耗时的百分比 | selectnbrecv耗时:12.29s,cpu总耗时:29.14,12.29/29.14=42.18 |
sum% | top命令中排在它上面的函数以及本函数flat%之和 | chanrecv:42.18%+30.47% = 72.65% |
cum | 当前函数加上该函数调用之前的累计CPU耗时 | chanrecv:8.88+0.54=9.42 |
cum% | 当前函数加上该函数调用之前的累计CPU耗时的百分比 | 9.42/29.14=32.33% |
list WirteString
通过代码明细我们可以看到,字符串拼接占用的CPU资源最多,可以针对这行代码进行优化。
# 2.2 内存使用分析
heap
go tool pprof
以上命令会打开一个网页,页面效果如下:
左上的下拉条可以选择不同的可视化方式查看不同的数据:
SAMPLEspaceobjectsinuse_spacealloc_space
VIEW
Top
源码形式
火焰图形式
# 2.3 协程分析
goroutinego tool pprof
goroutine
我们将链接后面的debug=1改为debug=2(以unrecovered panic的格式打印堆栈,可读性更高),可以见到各协程等待时长,可用于分析goroutine泄漏
# 3. 其他总结
alloc_objectsalloc_spaceinuse_objectsinuse_space
其他系统安装参考这里Graphviz Download。