valgrind+kcachegrind分析程序性能瓶颈

来源:互联网 发布:翻墙推荐 知乎 编辑:程序博客网 时间:2024/05/01 04:43

一:Valgrind的安装

1. 解压valgrind-3.7.0.tar.bz2tar jxf valgrind-3.7.0.tar.bz2

2. 进入解压的目录,运行如下命令

a) ./configure

b) Make

c) Make install

二:Valgrind介绍

valgrind安装完毕后,会附带如下几个强大的工具:

1Memcheck检查程序的内存管理情况,所有的内存读写都将被检查,对malloc/new/free/delete调用都将被截取。

它可以检测如下几种情况:

1.1 访问不该访问的内存(比如越界访问)

1.2内存泄漏 (比如new后没有delete操作)

1.3堆的错误释放

1.4memcpy()和相关函数传递重叠的源和目的内存块

1.5不对静态数组(分配在栈上)进行边界检查

使用:   valgrind --tool=memcheck --leak-check=yes your_program

2Callgrind分析程序运行过程中,各个函数的调用情况以及所占整个程序运行期间的百分比

这两个工具是我们在程序的开发过程中所经常用到的。

注意:

1、我们在编译自己的程序的时候,不要忘记加-g选项,这样,使用这些工具我们将会看到所对应的代码行

2、使用valgrind时,程序可以用daemon的方式运行;

3valgrind本身是一个模拟器,所以性能不高,做server性能测试时,发请求应该慢一点,比如50/s的请求量,这样可以保证server是可以处理过来的,每一个分支都跑到了。

举例:如果发的太快,那么server处理不过来,server内部都是超时,响应处理线程都接收不到响应,响应处理线程就检测不到了。

4valgrind生成的报告需要我们程序的正常退出,所以不可以使用kill -9 等方式强行退出;如果发现无法正常退出程序的时候,我们可以修改下自己的程序,让自己的程序运行一段时间后,自己退出。(比如我们做Server开发时,可以在接收请求的地方控制接收n个请求后,就退出,如下图:


 

现在让我们来看看使用valgrind中的callgrind工具是如何来分析我们程序的运行情况。使用如下命令,执行程序:

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

执行一段时间后,程序正常退出,将会看到在自己的bin目录下会生成如下几个文件:

 


 

为什么会有这么多文件?

这些文件类似按照线程生成的,接收请求+解包是一个模块,就在一个文件中;调用外部接口的应答处理线程和应答解包就在一个文件中。把这些文件下载到本地,用kcachegrind.exe(直接解压kcachegrind.zip,到网上下载)分别打开这些文件,找到我们需要的结果,如下所示:


 

这里我们看DeCode占用CPU比较多,那么DeCode是否可以有话呢?这个时候你可以分析DeCode,决定是否可以优化,就这样一个一个找出CPU占用率搞的模块和函数,分析其是否可以优化。


http://blog.163.com/xychenbaihu@yeah/blog/static/1322296552012756157532/

0 0