您当前的位置:首页 >技术文章

解决 Apache 服务器内存占用高的问题-VPS-肥雀信息技术

我有个配置比较低的搬瓦工 VPS,1G的内存。最近发现服务器内存占用一直很高,重启服务器后,内存占用还是在逐渐上涨,甚至连 swap 都会被占满。

使用 top 命令查看进程内存使用情况,发现 httpd 进程占用内存过高,几乎占掉了系统内存的80%。

使用 top 命令查看进程内存占用

经查找各种资料,发现内存占用过高问题可能是受 httpd.conf 中的 MaxRequestsPerChild 参数影响。

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

是不是有点晕,简单来说就是,如果 MaxRequestsPerChild 参数设置为0,那么将不会终止子进程释放内存。

于是,使用 find 命令搜索该参数的配置文件 httpd-mpm.conf 所在位置。

# find / -name httpd-mpm.conf

发现其位于 /usr/local/apache/conf/extra/httpd-mpm.conf ,首先复制一个配置文件副本备份,以防不测。

继续使用 vi 编辑器打开该文件,找到参数位置。需要注意,该参数名称在 Apache HTTP Server 2.3.9 及更高版本中已经修改为 MaxConnectionsPerChild。

通过 httpd -V 命令查看当前 Apache 运行模式,找到对应运行模式里的参数。可见该参数此时为0,尝试修改其为一个较小数值,我这里修改为50。

重启服务器,测试了1天,效果不错,内存和 swap 的占用率都下来了,成功。

[2019-08-02 10:16]