答:用记事本打开apache2\conf\httpd.conf,
我在centos5上装了kloxo,找了半天 httpd.conf在 /etc/httpd/conf/目录下。
查找MaxRequestsPerChild,将MaxRequestsPerChild 0改成MaxRequestsPerChild 50即可。
影响apache性能的几个重要参数(conf/httpd.conf中设置)
KeepAlive 是否允许持续连接
MaxKeepAliveRequests 允许的持续连接的最大数
KeepAliveTimeout 持续连接在没有请求多少秒后切断
StartServers 最初启动时启动多少个服务器进程
MinSpareServers 空闲服务器进程的最小数
MaxSpareServers 空闲服务器进程的最大数
MaxClients 同时处理的请求数(最重要的参数,要少于ServerLimit)
MaxRequestsPerChild 每个子进程处理的最大请求数
它们之前的关系:
prefork控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和 MaxSpareServers。MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了 “MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。
ServerLimit 2000
StartServers 10
MinSpareServers 10
MaxSpareServers 15
MaxClients 1000
MaxRequestsPerChild 2048
调试过程中用到的指令:
# ps -ef|grep http|wc -l //查看请求总数
# cat /proc/loadavg //查看平均负载(loadavg),loadavg高于1,表明任务队列出现了等待,CPU忙不过来了。超过2以上就会明显感到性能降低了
# netstat -ant | grep :80 | wc -l //查看TCP连接数
# top //查看系统运行情况
====================================================================
apache的内存使用
apache进程在使用内存时,是“渐长”的。也就是说,直到这个进程死掉,使用内存的数量是一直增长而不会减少的。这样的话,apache进程使用内存的多少,就决定于你的应用程序最大使用内存量了。
keepalive参数
KeepAliveTimeout 这个参数决定了,在什么都不做之前,一个http进程能够等待多长时间?设想一下,如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字,apache占用内存会很快的增长。这是因为,一个apache进程完成了一个任务(并达到了一定的内存占用,想一下“渐进”模式),并不会马上退出,而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来,则积累起来的无用的apache进程就会相当多,直到timeout,这些进程才会被杀死。
但是,keepalive的确对于静态的文件,比如图像文件的传送是很有效的,因此,keepalive要设置为on,(off)但是keepalvietimeout要设置的小些,比如5s 15
MaxRequestsPerChild
这个参数是说,apache进程在处理了多少个请求之后,必须退出,重新开始,以免在处理中的内存问题。
对于php脚本来说,把这个参数设置的小一些是有好处的,可以避免程序使用的内存持续增长对apache带来的压力:让这个参数定期释放内存,因为php是在脚本执行完毕后,自动释放只用的资源(内存)的。
比如设置为50?如果太小的话,重新产生一个apache进程也是要消耗资源的,这是一个平衡问题。
有一台服务器 IBM P550 小型机上的 IHS 在连续运行几天后,其中的一个 httpd 进程占用内存接近几百兆。
IHS 其实就是 Apache ,AIX 5.3 下运行在 worker 方式下,它被看作 Apache 未来的主流工作模式,它是一种多进程与多线程混合的模式。
Apache的主流工作模式MPM模式。MPM是Multi-Processing-Modules的简称,意思是多道处理模块。MPM模块有不同的种类。现在用的比较多的MPM种类主要是prefork和worker。prefork的工作方式是多个进程工作,每个进程会在处理一定数量的请求后结束(这个数量可能是无穷),没有线程的概念。worker被看作apache未来的主流工作模式,它是一种多进程与多线程混合的模式。
配置文件 httpd.conf 中 work 的参数配置项:
<IfModule worker.c>
ThreadLimit 100
ServerLimit 250
StartServers 8
MaxClients 25600
MinSpareThreads 100
MaxSpareThreads 300
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
关键的问题出现在 MaxRequestsPerChild 参数。MaxRequestsPerChild这个指令设定一个独立的子进程将能处理的请求数量。
在处理“MaxRequestsPerChild 数字”个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理。
如果MaxRequestsPerChild缺省设为0(无限)可以使每个子进程处理更多的请求,不会因为不断终止、启动子进程降低访问效率。
但如果占用了200~300M内存,即使负载下来时占用的内存也不会减少。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出。
Apache MPM选择下的ServerLimit和ThreadLimit大小
1、环境
编译Apache时选则worker工作模式
配置如下:
StartServers 5 MaxClients 2000 MinSpareThreads 25 MaxSpareThreads 200 ThreadsPerChild 100 MaxRequestsPerChild 0 |
当重启Apache时候出现如下警告:
[root@localhost conf]# /etc/init.d/apachectl restartWARNING: ThreadsPerChild of 100 exceeds ThreadLimit value of 64threads, lowering ThreadsPerChild to 64. To increase, please see the ThreadLimit directive.WARNING: MaxClients (2000) is not an integer multiple of ThreadsPerChild (64), lowering MaxClients to 1984 for a maximum of 31 child processes,WARNING: MaxClients of 1984 would require 31 servers, and would exceed the ServerLimit value of 16. Automatically lowering MaxClients to 1024. To increase, please see the ServerLimit directive. |
需要对ServerLimit和ThreadLimit进行设置
查看手册
ThreadLimit 指令
说明 | 每个子进程可配置的线程数上限 |
---|---|
语法 | ThreadLimit number |
默认值 | 参见下面的说明 |
作用域 | server config |
状态 | MPM |
模块 | mpm_winnt , worker |
兼容性 | 仅用于2.0.41及以后版本的mpm_winnt |
这个指令设置了每个子进程可配置的线程数ThreadsPerChild
上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild
的修改却会生效。
使用这个指令时要特别当心。如果将ThreadLimit
设置成一个高出ThreadsPerChild
实际需要很多的值,将会有过多的共享内存被分配。如果将ThreadLimit
和ThreadsPerChild
设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。该指令的值应当和ThreadsPerChild
可能达到的最大值保持一致。
对于mpm_winnt
,ThreadLimit
的默认值是1920
;对于其他MPM这个值是64
。
注意
Apache在编译时内部有一个硬性的限制"ThreadLimit 20000
"(对于mpm_winnt
是"ThreadLimit 15000
"),你不能超越这个限制。
ServerLimit 指令
说明 | 服务器允许配置的进程数上限 |
---|---|
语法 | ServerLimit number |
默认值 | 参见下面的说明 |
作用域 | server config |
状态 | MPM |
模块 | prefork , worker |
对于prefork
MPM,这个指令设置了MaxClients
最大允许配置的数值。对于worker
MPM,这个指令和ThreadLimit
结合使用设置了MaxClients
最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients
的修改却会生效。
使用这个指令时要特别当心。如果将ServerLimit
设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimit
和MaxClients
设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。
对于prefork
MPM,只有在你需要将MaxClients
设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients
一样。
对于worker
MPM,只有在你需要将MaxClients
和ThreadsPerChild
设置成需要超过默认值16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients
和ThreadsPerChild
需要的子进程数量高。
注意
Apache在编译时内部有一个硬限制"ServerLimit 20000
"(对于prefork
MPM为"ServerLimit 200000
")。你不能超越这个限制。
按照配置MaxClient 为 2000
不要将该指令的值设置的比MaxClients
和ThreadsPerChild
需要的子进程数量高。
ServerLimit=MaxClient / ThreadPerChild = 2000 / 100 = 20
所以ServerLimit设置不能比20更高
如果将ThreadLimit
设置成一个高出ThreadsPerChild
实际需要很多的值,将会有过多的共享内存被分配。
所以 ThreadLimit设置为100