有一台服务器 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工作模式
配置如下:
|
当重启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 |
需要对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