valgrind
是一款开源的构建动态分析、性能分析的利器,但它不是linux的原生工具,需要自行安装。
可以直接使用yum等工具直接进行安装,或者使用源码进行安装
yum install valgrind
valgrind
自身包含了多个工具:
Memcheck
:用于内存泄漏检查、Callgrind
:用于性能分析,会收集程序运行时间和调用关系以及Cachegrind
、Helgrind
等
说到性能分析,可能会想到之前的Tideways和Toolkit对PHP代码进行性能分析,这个是可以分析到PHP的函数执行时间、子调用等信息,但是更为底层一些的它是获取不到的
所以就需要本篇文章所说的valgrind
的callgrin
工具了,它也是可以生成对应的函数调用图的,下面我们来看一下
使用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
打开就可以看到对应的性能分析
通过图形化,我们可以很直观的知道那段程序执行慢,并且了解相关调用关系
当然也有使用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
发表评论
沙发空缺中,还不快抢~