服务器性能调优

来源:互联网 发布:python 守护线程 编辑:程序博客网 时间:2024/05/16 19:37

内存:使用jemalloc或者tcmalloc(现在效率不够)替换现有的malloc实现。


性能指标 (避免空间浪费,空间时间互换):

  响应时间 = 服务器响应时间 + 客户端响应时间 + 网络传输时间

  吞吐量

  资源利用率

  并发用户数

  点击数

测试目的:  性能是否达标;识别瓶颈;优化配置。

测试分类:

   负载测试;  压力测试;  稳定性测试;  并发测试;  基准测试;  可恢复性测试;


分析瓶颈:

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 --leak-check=full --show-leak-kinds=all 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)分别打开这些文件,找到我们需要的结果.

注意:   该工具分析出来的时间为使用的CPU时间,因此,如果使用了sleep,那么sleep的时间不会计算在内;

 

3.Massif----堆内存监测器,可用在降低应用程序内存的分析上

基本介绍:
 Massif 用于堆内存分析,可以查看到哪些模块持有内存,默认只统计堆内存 malloc, calloc, realloc, memalign, new, new[];

 不会监测mmap, mremap, and brk;  若使用 --pages-as-heap=yes 选项,工具会使用底层监测器,监测mmap级别的,不可以与 --stacks=yes共同使用;

基本用法:
 valgrind --tool=massif program
 ms_print massif.out.pid   将数据格式化


Eg: 没有显示具体信息的是正常的,所以只有很少信息,这些snapshot不用关注
--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
  1      2,541,456               24               16             8            0
  2      2,675,616            2,560            2,338           222            0
  3      2,786,042            6,368            6,027           341            0
  4      2,878,572           11,080           10,510           570            0
  5      2,981,584           12,248           11,598           650            0
 
 
http://valgrind.org/docs/manual/ms-manual.html

 

 

 

 

注释:

valgrind 中尝试使用setrlimit会抛出EMFILE问题;

原文:

* Implement an emulated soft limit for file descriptors in addition to
  the current reserved area, which effectively acts as a hard limit. The
  setrlimit system call now simply updates the emulated limits as best
  as possible - the hard limit is not allowed to move at all and just
  returns EPERM if you try and change it.  This should stop reductions
  in the soft limit causing assertions when valgrind tries to allocate
  descriptors from the reserved area.
  (This actually came from bug #83998).

http://valgrind.org/docs/manual/dist.news.old.html


 





0 0
原创粉丝点击