pprof

[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