httpd进程占用大量内存,居高不下
一、前言
Apache进程动辄占用内存几百兆,而且剧烈浮动,变化无常,有时甚至耗掉上G内存。在访问者那里的表现就是网站速度极不稳定,间歇性抽风,有时甚至会无法打开网页。这种情况一般都是Apache配置不合理所致。
在编译apache的时候,有一个参数叫做--with-mpm=,等号后边用于指定那种模式,可选的有beos|event|worker|prefork|mpmt_os2。
值得注意得是,如果你没有指定--with-mpm=,那么Apache 2.4之前版本会默认为prefork,而2.4已经变为event模式。
我们可以使用apachectl -l命令查看加载了哪种模式,它们一般这样显示:
prefork.c
worker.c
event.c
二、mpm参数介绍
首先需要加载MPM配置,在apache的配置文件中:
vim conf/httpd.conf
#取消该行注释
Include conf/extra/httpd-mpm.conf
mpm一般在apache/extra/httpd-mpm.conf
文件中这样定义:
<IfModule mpm_prefork _module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
- StartServer:数量的服务器进程开始
- MinSpareServers:最小数量的服务器进程,保存备用
- MaxSpareServers:最大数量的服务器进程,保存备用
- MinSpareThreads:最小数量的工作线程,保存备用
- MaxSpareThreads:最大数量的工作线程,保存备用
- ThreadsPerChild:固定数量的工作线程在每个服务器进程。
- MaxRequestWorkers:最大数量的服务器进程允许开始,在apache2.3.13以前的版本MaxRequestWorkers被称为MaxClients 。
- MaxConnectionsPerChild:最大连接数的一个服务器进程服务
三、问题分析
在上面的参数中,大多数保持默认即可,不合理的地方在于MaxConnectionsPerChild,它指的是每个httpd进程可以处理的最多请求次数,达到次数之后这个进程就会退出,然后重新开启新的进程。
虽然该值为零表示无限,不会因为不断终止、启动子进程降低访问效率,但这也说明它会一直增长,占用大量的内存,无法释放,这对于内存小的服务器来说是不可能承受的。
官方参考手册中不建议设置为0, 主要基于两点考虑:
- 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存;
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
因此,这个参数的值更大程度上取决于服务器的内存,如果内存比较大的话可以设置为0或很大的数字,否则设置一个小的数值。需要注意的是,如果这个值设置得太小的话会造成httpd频繁重启。
内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出。