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, 主要基于两点考虑:

  1. 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存;
  2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

因此,这个参数的值更大程度上取决于服务器的内存,如果内存比较大的话可以设置为0或很大的数字,否则设置一个小的数值。需要注意的是,如果这个值设置得太小的话会造成httpd频繁重启。

内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出。

参考:
Apache Prefork、Worker和Event三种MPM分析 - 虫师 - 博客园

标签: web, 优化, 排障

添加新评论