使用valgrind进行后台服务器的性能优化

来源:互联网 发布:nba竞猜软件 编辑:程序博客网 时间:2024/06/04 19:42

使用valgrind进行后台服务器的性能优化

2008-04-30

一.        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提供的性能数据,手工计算此函数性能是否有了提升。如可以计算优化函数在总的业务流程中所占用的时间比。

 

五.        附录:

附录1:valgrind使用说明(英文)

http://valgrind.org/docs/manual/manual.html

附录2:valgrind使用说明(中文):

--------------------------------------------------------------------------------------------------------------------------------------------------

一: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个请求后,就退出,如下图:

2012年08月05日 - 无影 - 激情、专注、坚持、思考

 

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

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

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

 

2012年08月05日 - 无影 - 激情、专注、坚持、思考 

为什么会有这么多文件?

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

2012年08月05日 - 无影 - 激情、专注、坚持、思考

 

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

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 0
原创粉丝点击