使用valgrind的callgrind工具进行性能分析以及图形化方法

valgrind是一款开源的构建动态分析、性能分析的利器,但它不是linux的原生工具,需要自行安装。

可以直接使用yum等工具直接进行安装,或者使用源码进行安装

yum install valgrind

valgrind自身包含了多个工具:

Memcheck:用于内存泄漏检查、Callgrind:用于性能分析,会收集程序运行时间和调用关系以及CachegrindHelgrind

说到性能分析,可能会想到之前的Tideways和Toolkit对PHP代码进行性能分析,这个是可以分析到PHP的函数执行时间、子调用等信息,但是更为底层一些的它是获取不到的

所以就需要本篇文章所说的valgrindcallgrin工具了,它也是可以生成对应的函数调用图的,下面我们来看一下

使用valgrind来分析性能,必须使用valgrind来启动程序:

valgrind --tool=callgrind php swoole.php

这里的swoole.php就是我们要分析的程序,使用php来执行它

执行完毕后,就会在当前目录下生成一些文件,文件名格式为callgrind.out.进程号,如callgrind.out.10897

当然它还有另外一个参数--separate-threads,是指是否按线程来分别统计

如果你调试的程序是多线程,你也可以在命令行中加一个参数--separate-threads=yes

valgrind --tool=callgrind --separate-threads=yes ./run

这样就会为每个线程单独生成一个性能分析文件,程序执行结束后,生成的文件除了callgrind.out.10897这样以外,还会多出一些子线程的文件,如:callgrind.out.10897-01

但是生成的callgrind.out文件直接分析起来有些困难,必须借助图形化的方式来浏览

图形化方法windows下可以使用kcachegrind,mac下可以使用qcachegrind

使用brew进行安装,同时也会自动安装相关依赖

brew install qcachegrind

安装完成后在终端执行

qcachegrind

就可以打开qcachegrind的图形界面了,左上角文件夹选择我们刚才的callgrind.out.10897打开就可以看到对应的性能分析

valgrind-callgrind

通过图形化,我们可以很直观的知道那段程序执行慢,并且了解相关调用关系

当然也有使用gprof2dot.py脚本,把callgrind生成的性能分析数据转换成dot格式的数据,方便使用dot把数据图形化

#把callgrind生成的性能数据转换成dot格式数据
python gprof2dot.py -f callgrind -n10 -s callgrind.out.10897 > valgrind.dot

#使用dot把数据生成图片
dot -Tpng valgrind.dot -o valgrind.png 

但是我试了几次,生成的图都是错误的,都是空白的小方块…所以最终还是使用了qcachegrind

发表评论

发表评论

*

沙发空缺中,还不快抢~