pprof性能优化工具 | 青训营笔记

160 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第5天

pprof使用

基本的使用框架 image.png

运行程序之后,使用go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"可以采集十秒数据,然后进入命令行界面,之后可以输入top来查看相关数据,list 函数名 来查看函数的位置.数据的含义如下:

image.png

如果flat和cum相等,那么表示这个函数没有调用其他函数,如果flat=0那么表示这个函数只调用了其他的函数.

在命令行窗口下输入web也可以直接出现图形化窗口,前提是需要安装graphviz组件,配置环境变量,安装完之后重启IDE就可以使用web命令

浏览器上的菜单栏第一栏view里面是各种视图:

image.png

  • top显示的资源数据,和命令行里给出的top数据类似
  • graph给出的是连接图,图内含有这个函数的资源数据,函数之间的调用关系用箭头表示
  • flame graph是火焰图,函数资源占比越大火焰图的面积越大
  • Source显示源码位置以及该行代码所使用的资源数据
  • diassemble用来反汇编的,不做深入了解
  • peek给出的信息比top更详细,数据格式类似top

sample里面是各种采样的数据类型,用在属性heap上:

image.png

  • alloc_objects表示分配的对象数据
  • alloc_space表示分配的空间
  • inuse前缀表示使用中的,对象或者空间,分配了但是之后释放的不算在这一类

如果想直接进入图形化窗口可以直接使用形式类似下面的命令:

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap" 这条命令查看的heap属性,堆内存的分配情况,可以查出那些函数的内存分配异常.如果想查其他的属性,可以把heap修改为其他的属性,-http是指定浏览器用哪一个端口打开,指定为:8080,冒号不能少.

用浏览器打开http://localhost:6060/debug/pprof可以看到如下画面:

image.png

红色这一栏放大如下:

image.png

可以把上面的heap改成图上的其他属性,某些属性可能需要增加传入的参数,比如profile属性,需要增加seconds参数,可以是这样go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/profile?seconds=10"表示浏览器显示采集CPU10s获得的CPU占比数据

至于每个属性的含义,网站上有清楚的解释

cpu采样原理

image.png

image.png

heap采样原理

  • 采样率:可以自己设置,默认是512K采样一次,可以设置为每一次分配都采样
  • 采样时间:从程序开始一直到采样时间
  • 采样指标:四种采样指标,sample栏中的那四种
  • 计算方式:inuse = alloc - free

goroutine和threadCreate采样原理

两者的原理类似:

image.png

block阻塞和lock锁采样原理:

block采样:

  • 采样率:耗时超过阈值才会被采集,可以在运行前修改参数,设置为每次阻塞都收集

image.png

lock采样:

  • 采样率:只记录固定比例的锁操作,可以在运行之前修改参数,设置为每次加锁都记录

image.png