LNMPA内存占用过多该如何处理?

最近一段时间,VPS的内存发生过几次被跑满的情况(2G也能占光 :(),CPU也会跟着飙升到100%,然后就是网页出现502错误。通过top命令查看之后发现apache的几个进程都占用了相当一部分内存,而当时却是空载的,也就是apache内存没有被释放。发现这个问题之后就方便了,只需要修改一个参数即可:MaxRequestsPerChild。

这个 MaxRequestsPerChild 代表的是每一个进程所能够承受的最大请求数量,如果某一个进程超过了这个数量则进程自动释放所有内存然后自杀掉。此值可以设置为0, 0就是说永远不结束, 这样做的弊端是进程占用内存过大而且容易内存溢出。不过对于KeepAlive链接,只有第一个请求会被算进去,KeepAlive有效期类的其他请求将不作数。

这个参数的修改地址在 httpd-mpm.conf 这个文件,目录结构如下:
/usr/local/apache/conf/extra/httpd-mpm.conf

打开 httpd-mpm.conf 这个文件,我们看到设置如下:

<IfModule mpm_prefork_module>
    StartServers          5                //启动时生成的进程数
    MinSpareServers       5           //最小空闲线程数,用于处理可能到来的突发请求
    MaxSpareServers      10         //最大空闲线程数,用于处理可能到来的突发请求
    MaxClients          150             //客户端最大并发连接数
    MaxRequestsPerChild   0      //子进程可处理的请求数,0意味着无限,可能会出现内存溢出,建议不要使用0,根据实际情况进行调整
</IfModule>

果然默认值是0,我们需要修改MaxRequestsPerChild的值为一个适合内存大小的数值,太小太大都不好,这个可以通过试验得出。这里我设置的是1000,为保险起见,我将prefork和worker两种模式下的MaxRequestsPerChild值都改为了1000,设置完毕记得重启LNMPA。

重启之后再用top命令查看一下进程,可以看到内存已经降下来了,CPU也降了。

PS:Apache对内存要求高,维护者需要好好设置以防内存溢出;Nginx对内存要求低,但直接出502错误的概率比较大。

发表评论

电子邮件地址不会被公开。 必填项已用*标注