先解释一下LAMP:
L - linux
A- apache
M-mysql
P- php
(原文链接 http://ddbiz.com/?p=236)
我们的服务多架构在这上面,我们会分别讨论不同部分对整个系统的影响和调优办法。当然最好的指导手册还是应用的原始文档。我们将结合不同的现象,分别讨论各自的解决办法
现象:
近日服务器的web访问变得很慢, 很多图片都要刷新才能显示出来。操作系统为 CentOS 5.x
系统跟踪
查看一下网络连接数据
netstat -anlp | grep ":80" | wc -l
127
只有区区100多个建立的请求。
再看看http进程
ps auxf | grep http | wc -l
48
怎么只有48个进程在服务。
打开配置文件,prefork MPM配置如下
<IfModule prefork.c>
ServerLimit 200
StartServers 30
MinSpareServers 10
MaxSpareServers 50
MaxClients 200
MaxRequestsPerChild 1000
</IfModule>
根据文档(以下内容出自httpd 手册):
ServerLimit
对于preforkMPM,这个指令设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。
使用这个指令时要特别当心。如果将ServerLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimit和MaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。
对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
MaxClients
MaxClients 指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令限制的最大值为止。一旦一个链接被释放,队列中的请求将得到服务。
对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit 。
StartServers
StartServers指令设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。不同的MPM默认值也不一样。对于prefork默认值是"5"。
MaxRequestsPerChild
MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。
在mpm_netware和mpm_winnt上的默认值是"0"。
将MaxRequestsPerChild设置成非零值有两个好处:
- 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
看上去需要调整一下了,结果如下:
# prefork MPM
<IfModule prefork.c>
ServerLimit 2048
#StartServers 60
#MinSpareServers 10
#MaxSpareServers 50
MaxClients 2048
MaxRequestsPerChild 1000
</IfModule>
然后重启服务,客户端访问快了很多(原文链接 http://ddbiz.com/?p=236)