这是我参与「第五届青训营 」笔记创作活动的第5天
pprof使用
基本的使用框架
运行程序之后,使用go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"可以采集十秒数据,然后进入命令行界面,之后可以输入top来查看相关数据,list 函数名 来查看函数的位置.数据的含义如下:
如果flat和cum相等,那么表示这个函数没有调用其他函数,如果flat=0那么表示这个函数只调用了其他的函数.
在命令行窗口下输入web也可以直接出现图形化窗口,前提是需要安装graphviz组件,配置环境变量,安装完之后重启IDE就可以使用web命令
浏览器上的菜单栏第一栏view里面是各种视图:
- top显示的资源数据,和命令行里给出的top数据类似
- graph给出的是连接图,图内含有这个函数的资源数据,函数之间的调用关系用箭头表示
- flame graph是火焰图,函数资源占比越大火焰图的面积越大
- Source显示源码位置以及该行代码所使用的资源数据
- diassemble用来反汇编的,不做深入了解
- peek给出的信息比top更详细,数据格式类似top
sample里面是各种采样的数据类型,用在属性heap上:
- 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可以看到如下画面:
红色这一栏放大如下:
可以把上面的heap改成图上的其他属性,某些属性可能需要增加传入的参数,比如profile属性,需要增加seconds参数,可以是这样go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/profile?seconds=10"表示浏览器显示采集CPU10s获得的CPU占比数据
至于每个属性的含义,网站上有清楚的解释
cpu采样原理
heap采样原理
- 采样率:可以自己设置,默认是512K采样一次,可以设置为每一次分配都采样
- 采样时间:从程序开始一直到采样时间
- 采样指标:四种采样指标,sample栏中的那四种
- 计算方式:inuse = alloc - free
goroutine和threadCreate采样原理
两者的原理类似:
block阻塞和lock锁采样原理:
block采样:
- 采样率:耗时超过阈值才会被采集,可以在运行前修改参数,设置为每次阻塞都收集
lock采样:
- 采样率:只记录固定比例的锁操作,可以在运行之前修改参数,设置为每次加锁都记录