一. Valgrind安装说明:
先从http://valgrind.org/上将安装包down下来(使用3.2.0及以上版本),然后进行安装:
./configure
make
make install (as "root" if needed)
二. 使用valgrind进行性能瓶颈定位:
1.先将服务器运行环境搭建好,确定服务器程序能正常运行及响应请求。
2.使用valgrind启动服务器进程:(关于valgrind相关详细的参数说明请见最末的附注)
valgrind --tool=callgrind --separate-threads=yes ./tcpd ./main.cfg
(说明:--tool=callgrind,表示使用valgrind提供的性能分析功能,--separate-threads=yes,表示是要查看多线程相关数据)
3.使用另一台服务器向WEB服务器发起请求,一般我们使用ab工具来做性能测试,如:/usr/local/apache2/bin/ab –c100 -n100960 http://10.1.164.18/adsview?c=www&l=QQ_Width3&log=off
4.在启动了valgrind的服务器上dump相关性能数据:
callgrind_control -d -w /usr/local/ads5/bin
(说明:callgrind_control会将所有的线程性能数据dump到/usr/local/ads5/bin目录下面,生成如callgrind.out.23159.1-06这样的文件。可以使用callgrind_control –h命令查看帮助。)
5.查看性能数据:
在dump文件所在的目录下,使用callgrind_annotate --inclusive=yes callgrind.out.23159.1-06命令即可进行查看:
在输出中就可以查看所调用的函数所使用的时间数字
如果要进一步查看某一个函数里又有哪些函数被调用,及调用的时间值,可以使用callgrind_annotate --inclusive=yes --tree=both callgrind.out.23159.1-06命令进行查看。
如在解析的业务处理的函数FindCtreativePlayContent中, snprintf函数占用了大部分的时间,就可以针对此函数进行优化。
三. 进行函数优化:
找到了我们要优化的函数,接下来就是进行代码优化,如在FindCtreativePlayContent中,我们使用memcpy函数来替代snprintf函数。下面是另一个函数优化前后的比较:
优化的方法很多,针对不同的业务,有不同的优化方法。
四. 优化后效果比较:
优化完了之后,可以通过ab的性能测试,测试性能是否有提升,也可以通过valgrind提供的性能数据,手工计算此函数性能是否有了提升。如可以计算优化函数在总的业务流程中所占用的时间比。