服务器内存占用优化实录:Apache占用系统内存过多解决

发布于 18 天前  29 次阅读


最近老被腾讯云短信告警轰炸内存占用超过百分之90, 所以下定决心来进行一下性能优化。

被告警短信轰炸的一周

step1:查找内存占用最大的进程

最简单的就是使用top指令,查看占用内存最大的进程。

在我的top中我发现占用内存最大的进程是httpd(也就是apache服务器),足足占用了百分之二十的内存。并且还存在多个apache进程,因为服务器上有多个虚拟主机。

step2:解决apache内存占用过多问题

在Google搜索了一些apache内存占用过多问题的解决,大多数解决方案都指向了apache MPM(多处理模块)。而其中,apache又有三种工作模式

因此我们需要找到自己服务器使用的工作模式:

使用如下命令

httpd -V

得到结果:

Server version: Apache/2.4.46 (Unix)
Server built: Mar 14 2021 15:29:30
Server's Module Magic Number: 20120211:93
Server loaded: APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)

说明本机是event模式。

然后找到mpm的配置文件httpd-mpm.conf,并找到event模式对应的配置部分。

有如下内容

<IfModule mpm_event_module>
StartServers             3 
MinSpareThreads         75 
MaxSpareThreads        250 
ThreadsPerChild         25 
MaxRequestWorkers      400 
MaxConnectionsPerChild  0
<IfModule>

各个参数的具体作用见apache官方文档

我们这里需要修改的是参数MaxConnectionsPerChild,其设定了单个子进程所处理的最大连接数,当该子进程处理了这个数值的连接后会自动死亡。默认值为0,即不会释放子进程。在内存大的主机中,子进程不自动释放可以保证服务稳定,但是响应的,该进程占用的内存则会越来越大。

在内存较小的机器中,我们一般将这个值设置为50左右的小数字。

保存设置后重启apache服务就能看到文章一开始的优化效果。