pprof
性能分析类型
CPU 性能分析
CPU 性能分析(CPU profiling) 是最常见的性能分析类型。
启动 CPU 分析时,运行时(runtime) 将每隔 10ms 中断一次,记录此时正在运行的协程(goroutines) 的堆栈信息。
一个函数在性能分析数据中出现的次数越多,说明执行该函数的代码路径(code path)花费的时间占总运行时间的比重越大。
内存性能分析
内存性能分析(Memory profiling) 记录堆内存分配时的堆栈信息,忽略栈内存分配信息。
内存性能分析启用时,默认每1000次采样1次,这个比例是可以调整的。因为内存性能分析是基于采样的,因此基于内存分析数据来判断程序所有的内存使用情况是很困难的。
阻塞性能分析
阻塞性能分析(block profiling) 是 Go 特有的。
阻塞性能分析用来记录一个协程等待一个共享资源花费的时间。在判断程序的并发瓶颈时会很有用。阻塞的场景包括:
- 在没有缓冲区的信道上发送或接收数据。
- 从空的信道上接收数据,或发送数据到满的信道上。
- 尝试获得一个已经被其他协程锁住的排它锁。
一般情况下,当所有的 CPU 和内存瓶颈解决后,才会考虑这一类分析。
锁性能分析
锁性能分析(mutex profiling) 与阻塞分析类似,但专注于因为锁竞争导致的等待或延时。
CPU 性能分析
记录性能数据会对程序的性能产生影响,建议一次只记录一类数据
命令行交互分析
基础命令
1
go tool pprof http://chatbot-client-common-service:8080/debug/pprof/goroutine
1
go tool pprof http://chatbot-client-common:8080/debug/pprof/heap
| 字段 | 说明 |
|---|---|
| flat | 当前函数占用 cpu 耗时 |
| flat % | 当前函数占用 cpu 耗时百分比 |
| sum% | 函数占用 cpu 时间累积占比,从小到大一直累积到 100% |
| cum | 当前函数加上调用当前函数的函数占用 cpu 的总耗时 |
| %cum | 当前函数加上调用当前函数的函数占用 cpu 的总耗时占比 |
list 命令:可以列出函数最耗时的代码部分,格式:list 函数名
详细命令
1
curl 'http://chatbot-client-common-service:8080/debug/pprof/goroutine?debug=2' > gor.txt
debug 参数的区别
| 值 | 输出格式 | 用途 |
|---|---|---|
debug=0(默认) | 二进制 protobuf | go tool pprof 分析 |
debug=1 | 文本摘要 | 快速查看统计 |
debug=2 | 完整堆栈文本 | 人工阅读、日志分析 |
pprof 图形可视化
安装
1
sudo apt install graphviz
使用
1
go tool pprof -http=:8081 /root/pprof/pprof.chatbot-client-common.alloc_objects.alloc_space.inuse_objects.inuse_space.002.pb.gz





