[pprof用法简介](Go 语言性能调试与分析工具:pprof 用法简介 | wxsm’s pace)
一、什么是pprof #
1、简介 #
pprof是GoLang程序性能分析工具,可以用于可视化和分析性能数据的工具,prof是profile(画像)的缩写,本文将对下面包进行运用:
- net/http/pprof:对 runtime/pprof 的二次封装,一般用于web server,它一直运行。这个包对提供的http服务进行数据采集分析。
上面的 pprof 开启后,每隔一段时间就会采集当前程序的堆栈信息,获取函数的 cpu、内存等使用情况。通过对采样的数据进行分析,形成一个数据分析报告。
pprof 以profile.proto的格式保存数据,然后根据这个数据可以生成可视化的分析报告,支持文本形式和图形形式报告。profile.proto里具体的数据格式是 protocol buffers。
2、支持的功能 #
- profile:CPU 占用率
- heap:当前时刻的内存使用情况
- allocs:所有时刻的内存使用情况,包括正在使用的及已经回收的
- goroutine:目前的goroutine数量及运行情况
- mutex:锁争用情况
- block:协程阻塞情况
二、net/http/pprof使用介绍 #
1、样例 #
准备炸弹代码: git clone https://github.com/wolfogre/go-pprof-practice.git ,运行代码开始分析问题
2、分析代码 #
处理cpu问题 #
# 采集10秒CPU数据排查问题:
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
输入top命令,查看CPU占用较高的调用,如下图:
-
flat:函数上运行耗时
-
flat%:CPU运行耗时总比例
-
sum%:累积使用CPU总比例
-
cum:函数加上它之上的调用运行总耗时
-
cum%:CPU运行耗时总比例
-
最后一列为函数名称,可以通过这五列得出一个应用程序的运行情况
可以看到主要是tiger.Eat占用较高,使用 list Eat可以查看详情,如图
注释问题代码解决问题
处理内存占用过高 #
# 采集内存数据排查问题
go tool pprof http://localhost:6060/debug/pprof/heap
输入top命令,查看内存占用较高的调用,如下图:
-
flat:函数上占用内存大小
-
flat%:内存占用比例
-
sum%:累积使用内存总比例
-
cum:函数加上它之上的内存总占用
-
cum%:内存总占用比例
可以看到主要是mouse.Steal占用较高,使用 list Steal可以查看详情,如图
注释问题代码解决问题
排查协程泄露问题 #
如下图,可以看到我们程序的协程数有119,因为这只是一个很小的程序,所以这存在问题
# 查看协程情况
go tool pprof "http://localhost:6060/debug/pprof/goroutine"
输入top命令,查看可能存在问题的地方,如下图:
我们可以看到 wolf.(*Wolf).Drink.func1 这个函数占了总goroutine数量的 99.02%,
输入list func1 查看具体详情
可以看到,Drink 方法每次会起10个协程,每个协程会sleep 30 秒再推出,而 Drink 函数又被反复的调用,这才导致了大量的协程泄漏。 我们注释问题代码,重新运行可以看到协程数量已经降低到个位数的水平了。
排查锁问题 #
上面排查了可能出现的资源占用的问题,但是还有可能出现的问题是性能问题
首先能想到的便是不合理的锁争用的问题,比如加锁时间太长等
# 查看锁情况
go tool pprof http://localhost:6060/debug/pprof/mutex
输入top命令,查看锁占用情况,如下图:
输入list Howl.func1查看具体详情
修改代码解决问题
排查阻塞问题 #
在程序中除了锁的竞争会导致阻塞外,还有很多逻辑会导致阻塞。
# 查看阻塞情况
go tool pprof http://localhost:6060/debug/pprof/block
输入top查看阻塞情况
输入list Live查看具体详情 发现是Pee的情况
输入list Pee查看具体情况,如图:可以发现问题
三、总结 #
以上就是本文对于net/http/pprof的简单使用介绍,更多详情可以参考pprof