Apache 的 httpd 过程占用大量内存原因及其解决方案
来源:互联网 发布:mcmore php 编辑:程序博客网 时间:2024/05/22 15:06
有一台服务器 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
参见下面的说明
mpm_winnt
, worker
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
参见下面的说明
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
- Apache 的 httpd 过程占用大量内存原因及其解决方案
- linux启动了大量的httpd进程,占用大量内存
- 解决win环境下Apache占用大量内存的问题
- erlang 内存被大量占用,跟踪过程
- erlang 内存被大量占用,跟踪过程
- 真正解决win2003下apache的httpd.exe占用内存的问题
- 如何避免apache的httpd进程占用比较多的内存
- httpd内存占用居高不下的问题
- C#内存占用大量资源的解决办法
- Oracle DBMS占用大量内存的解决方法
- APACHE服务器httpd.exe进程占用cpu100%的解决方法
- APACHE服务器httpd.exe进程占用cpu100%的解决方法
- 80端口被Apache的httpd.exe所占用
- centos中分析java占用大量CPU资源的原因
- centos中分析java占用大量CPU资源的原因
- win10系统出现“服务主机:本地服务(无网络)(6)”占用大量内存和CPU情况的解决方案
- Windows 7内存占用大的原因
- rsync备份海量文件时占用大量内存的解决办法
- MVP模式Demo
- 常用的页面跳转函数
- 学习springmvc的第十三天(自定义类型转换器ConversionServiceFactoryBean)
- 树莓派交叉编译环境搭建 for Mac
- sketch 映客Android 设计
- Apache 的 httpd 过程占用大量内存原因及其解决方案
- win10上使用putty通过ssh连接Linux
- CSS基础知识总结之基本概念
- 今天学习的时候偶然发现了一个有趣的题目,可以用编程实现。
- Linux进程全解1——程序的开始、结束
- c#小程序——画一棵树(v1与v2)
- 2. 掀起接口测试的盖头-HTTP初窥(一)
- C语言基础编程之统计字母,数字和空格
- B/S初识