买了个阿里云的最低配的服务器,发现内存总是不够用,用free命令看了一下,竟然还剩下6M的内存,汗。。。
于是查看了一下进程,
发现有大量的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 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 number |
默认值 | 参见下面的说明 |
作用域 | server config |
状态 | MPM |
模块 | prefork, worker |
对于preforkMPM,这个指令设置了MaxClients最大允许配置的数值。对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。
使用这个指令时要特别当心。如果将ServerLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimit和MaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。
对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
对于workerMPM,只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认值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,一个小时过后看又耗干了,请问什么问题呢?没看出那个进程特别占用内存啊,谢谢