关于大型网站调优的学习总结之ab测试压力

来源:互联网 发布:知乎 广场舞大妈 编辑:程序博客网 时间:2024/05/01 19:03

        根据韩顺平老师讲课笔记整理

        ab.exe 是Apache自带的一款压力测试工具,可以测试并发量的大小和某个页面访问的时间。

      a  准备首先把自己的代码放入Apache的PHP执行目录下(如下代码 名字为ab.php)

<?php for($i = 0 ; $i<1000 ; $i++){  echo $i."</br>";   }?>

        b 在windows .cmd 模式中       >cd E:\wamp\bin\apache\Apache2.2.21\bin\(ab.exe的目录下)

        c  >ab.exe -n 10000 -c 100  http://localhost/ab.php (  ab.exe –n 访问的总次数–c  有多少人访问(并发量)  访问的页面url)

       对结果的分析如下图所示

       

      当我们把-C调整到500的时候,已经不能正常显示返回的结果。服务器已经瘫痪

     会显示如下图片

     


      这时候我们能做的就是优化Apache的配置。要了解Apache的MPM

      多路处理模块,Multi-Processing Modules,MPM。目前主要的(我知道的?)一下三种

     1.      perfork 预处理进程方式

     2.      worker 工作模式

     3.      winnt  这个一般说是windows采用的.

  如何查看当前Apache的工作模式

  无论在Apache 还是 Linux下 可以用httpd -l 查看Apache工作的模式

            prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。servrelimit指系统限制最大的进程数,默认值很小如果MaxClients设的比unix默认servrelimit还大,就无效,返回默认值。因此servrelimit肯定要远大于apacheMaxClients

     

            优点:preforkMPM使用多个子进程,但每个子进程并不包含多线程。每个进程只处理一个链接。在许多系统上它的速度和workerMPM一样快,但是需要          更多的内存。这种无线程的设计在某些情况下优于workerMPM:它可以应用于不具备线程安全的第三方模块(比如php),且在不支持线程调试的平台上易于调试,而且还具有比workerMPM更高的稳定性。

           缺点:耗费内存

            Worker工作模式

           相对于prefork,worker全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。在configure ?with-mpm=worker后,进行make       编译、make install安装。在缺省生成的httpd-mpm.conf中有以下默认配置段:

      StartServers 2 
      MaxClients 150 
      MinSpareThreads 25 
      MaxSpareThreads 75 
      ThreadsPerChild 25 
      MaxRequestsPerChild 0 

        Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients 设置了同时连入的clients最大总数。如果现有子进程 中的线程总数不能满足负载,控制进程将派生新的子进程。MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。 ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于 MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。

        3,winnt

       由于当前在Win下进行测试所以可以再当前情况下优化Apache

       

       (1)   在httpd.conf 文件中 修改

       # Server-pool management (MPM specific)

       Include conf/extra/httpd-mpm.conf

      (2)   确定当前的apahce是什么MPM模式

      进入到 apache/bin

      httpd.exe –l

     说明: 看 mpm_xxx.c 如果xxx是 winnt 说明是winnt  ,另外还可能是 perfork 或者 worker

      (3)   修改httpd-mpm.conf 文件.

     <IfModule mpm_winnt_module>

            ThreadsPerChild      1000 

            MaxRequestsPerChild    0

      </IfModule>

     (4)   重启apahce ,输入 ab.exe -n 10000 -c 5000 http://localhost/ab.exe

     测试发现由于修改了最大并发数,刚才请求瘫痪的情况消失了,可以正常返回了。


     

     参考资料:

     http://blog.chinaunix.net/uid-25266990-id-1753789.html

     传智播客











     





0 0