根据韩顺平老师讲课笔记整理
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肯定要远大于apache的MaxClients
优点:preforkMPM使用多个子进程,但每个子进程并不包含多线程。每个进程只处理一个链接。在许多系统上它的速度和workerMPM一样快,但是需要 更多的内存。这种无线程的设计在某些情况下优于workerMPM:它可以应用于不具备线程安全的第三方模块(比如php),且在不支持线程调试的平台上易于调试,而且还具有比workerMPM更高的稳定性。
缺点:耗费内存
Worker工作模式
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
传智播客