文章

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 

img

1
go tool pprof http://chatbot-client-common:8080/debug/pprof/heap

image-20260131220531016

字段说明
flat当前函数占用 cpu 耗时
flat %当前函数占用 cpu 耗时百分比
sum%函数占用 cpu 时间累积占比,从小到大一直累积到 100%
cum当前函数加上调用当前函数的函数占用 cpu 的总耗时
%cum当前函数加上调用当前函数的函数占用 cpu 的总耗时占比

list 命令:可以列出函数最耗时的代码部分,格式:list 函数名

img

详细命令

1
curl 'http://chatbot-client-common-service:8080/debug/pprof/goroutine?debug=2' > gor.txt

debug 参数的区别

输出格式用途
debug=0(默认)二进制 protobufgo 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 

image-20260131221029996

web可视化

image-20260131221044246

火焰图 Flame Graph

image-20260131221322883

© 2024- lfj