linux启动了大量的httpd进程,占用大量内存 - 小众知识

linux启动了大量的httpd进程,占用大量内存

2013年01月27日 14:18:05 苏内容
  标签: linux/httpd
阅读:7328

买了个阿里云的最低配的服务器,发现内存总是不够用,用free命令看了一下,竟然还剩下6M的内存,汗。。。

2.png

于是查看了一下进程,

1.png

发现有大量的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 的参数配置项: 

<IfModule worker.c> 
ThreadLimit         100 
ServerLimit         256 
StartServers         8 
MaxClients         1200 
MinSpareThreads     100 
MaxSpareThreads     300 
ThreadsPerChild     100 
MaxRequestsPerChild  0 
</IfModule> 

关键的问题出现在 MaxRequestsPerChild 参数。MaxRequestsPerChild这个指令设定一个独立的子进程将能处理的请求数量。 
在处理“MaxRequestsPerChild 数字”个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理。 
如果MaxRequestsPerChild缺省设为0(无限)可以使每个子进程处理更多的请求,不会因为不断终止、启动子进程降低访问效率。 
但如果占用了200~300M内存,即使负载下来时占用的内存也不会减少。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出。 


文章借鉴自:http://ezerg.iteye.com/blog/1098547



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 的参数配置项:

<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_winntworker
兼容性仅用于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
模块preforkworker

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

使用这个指令时要特别当心。如果将ServerLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimit和MaxClients设置成超过系统的处理能力,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



top M结果

Tasks: 129 total,   1 running, 128 sleeping,   0 stopped,   0 zombieCpu(s):  9.3%us,  1.6%sy,  0.0%ni, 88.7%id,  0.0%wa,  0.0%hi,  0.2%si,  0.2%stMem:   8028516k total,  7983756k used,    44760k free,    36444k buffersSwap:  2097144k total,     3328k used,  2093816k free,  7151420k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                            17052 apache    20   0  318m  23m 8140 S  0.0  0.3   0:03.81 httpd                                                                               17184 apache    20   0  318m  22m 7808 S  1.0  0.3   0:01.83 httpd                                                                               17198 apache    20   0  317m  22m 7960 S  2.3  0.3   0:00.40 httpd                                                                               17183 apache    20   0  317m  22m 7640 S  0.0  0.3   0:01.71 httpd                                                                               17124 apache    20   0  316m  21m 7980 S  8.5  0.3   0:03.83 httpd                                                                               17127 apache    20   0  317m  21m 7468 S  1.0  0.3   0:02.36 httpd                                                                               16966 apache    20   0  315m  20m 8260 S  9.1  0.3   0:08.26 httpd                                                                               17193 apache    20   0  316m  20m 7812 S  2.3  0.3   0:00.48 httpd                                                                               17083 apache    20   0  316m  20m 7672 S  0.0  0.3   0:02.48 httpd                                                                               17049 apache    20   0  315m  20m 7940 S  1.3  0.3   0:04.84 httpd                                                                               17176 apache    20   0  315m  20m 7892 S  0.0  0.3   0:01.68 httpd                                                                               17199 apache    20   0  315m  20m 7324 S  0.0  0.3   0:00.92 httpd                                                                               17156 apache    20   0  315m  19m 7444 S  0.0  0.3   0:02.70 httpd                                                                               17186 apache    20   0  315m  19m 7476 S  1.0  0.3   0:01.19 httpd                                                                               17118 apache    20   0  314m  19m 8188 S  0.0  0.3   0:03.42 httpd                                                                               17188 apache    20   0  315m  19m 7440 S  9.1  0.2   0:01.84 httpd                                                                               17076 apache    20   0  314m  19m 7648 S  0.0  0.2   0:03.00 httpd                                                                               17195 apache    20   0  308m  19m 5068 S  1.6  0.2   0:00.74 httpd                                                                               17196 apache    20   0  308m  19m 5292 S  0.0  0.2   0:00.55 httpd                                                                               17177 apache    20   0  313m  17m 7256 S  1.3  0.2   0:00.18 httpd                                                                               17197 apache    20   0  305m  16m 4216 S  1.0  0.2   0:01.11 httpd 

httpd.conf的配置

<IfModule worker.c>
StartServers         4MaxClients         300MinSpareThreads     25MaxSpareThreads     75ThreadsPerChild     25MaxRequestsPerChild  20000</IfModule>

keepalive是off了的
1个小时前清理了内存,还有7G,一个小时过后看又耗干了,请问什么问题呢?没看出那个进程特别占用内存啊,谢谢


扩展阅读