Apache 的 httpd 过程占用大量内存原因及其解决方案

Apache 的 httpd 进程占用大量内存原因及其解决方案
有一台服务器 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 的参数配置项:


ThreadLimit         100
ServerLimit         250
StartServers         8
MaxClients         25600
MinSpareThreads     100
MaxSpareThreads     300
ThreadsPerChild     100
MaxRequestsPerChild  0


关键的问题出现在 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_winntworker
兼容性 仅用于2.0.41及以后版本的mpm_winnt

这个指令设置了每个子进程可配置的线程数ThreadsPerChild上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。

使用这个指令时要特别当心。如果将ThreadLimit设置成一个高出ThreadsPerChild实际需要很多的值,将会有过多的共享内存被分配。如果将ThreadLimitThreadsPerChild设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。该指令的值应当和ThreadsPerChild可能达到的最大值保持一致。

对于mpm_winntThreadLimit的默认值是1920;对于其他MPM这个值是64

注意

Apache在编译时内部有一个硬性的限制"ThreadLimit 20000"(对于mpm_winnt是"ThreadLimit 15000"),你不能超越这个限制。


ServerLimit 指令

说明 服务器允许配置的进程数上限
语法 ServerLimit number
默认值 参见下面的说明
作用域 server config
状态 MPM
模块 preforkworker

对于preforkMPM,这个指令设置了MaxClients最大允许配置的数值。对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。

使用这个指令时要特别当心。如果将ServerLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimitMaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。

对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。

对于workerMPM,只有在你需要将MaxClientsThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。

注意

Apache在编译时内部有一个硬限制"ServerLimit 20000"(对于preforkMPM为"ServerLimit 200000")。你不能超越这个限制。



按照配置MaxClient 为 2000

不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。

ServerLimit=MaxClient / ThreadPerChild = 2000 / 100 = 20

所以ServerLimit设置不能比20更高

如果将ThreadLimit设置成一个高出ThreadsPerChild实际需要很多的值,将会有过多的共享内存被分配

ThreadLimit设置最好不要超过ThreadsPerChil的值,ThreadPerChild = 100
所以 ThreadLimit设置为100

你可能感兴趣的:(服务器)