在具有8GB内存的四核服务器上,我有apache进程使用高达2.3GB的RES内存和2.6GB的VIRT内存。 以下是top -c command的副本:
有没有办法来减less这些Apache进程的内存使用量?
这些是我的httpd.conf设置:
Timeout 160 TraceEnable Off ServerSignature Off ServerTokens ProductOnly FileETag None StartServers 6 <IfModule prefork.c> MinSpareServers 4 MaxSpareServers 16 </IfModule> ServerLimit 400 MaxClients 320 MaxRequestsPerChild 10000 KeepAlive On KeepAliveTimeout 4 MaxKeepAliveRequests 80
注意 :似乎有一些连接延迟。 另外,如果16个连接使用8GB或RAM。 我有点担心,如果我的服务器获得300个连接,它将脱机。 同样在Munin,我可以看到承诺的内存在两周内从几GB增加到80GB。 随着每一个Apache重新启动下降到几GB
Apache中的内存由模块和模块使用的内存使用。 禁用未使用的模块,并查看您需要调整哪个剩余的模块,使用pmap <PID>来查看内存是如何分配的。 使用dmalloc和valgrind来debugging剩余的内存分配问题。
这是非常高的内存使用率。 有可能是内存泄漏 。
现在,尝试更新您的Apache2安装(包括模块),并减lessMaxRequestsPerChild的数量,即500.后者的设置本质上减less了“处理请求”方面的Apache2subprocess的最大生命周期。 也就是说,如果有内存泄漏,它们将不会显着地增加。
去除不必要的模块是解决这个问题的基本方法,但是你必须运行一大堆模块来获得一个需要2GB内存的Apache进程。 更有可能的是,你有dynamic的代码模块(如mod_php )运行讨厌的,泄漏的代码,或者是一个编码不好的模块,并且泄漏内存本身。
你可以把MaxRequestsPerChild放到很小的东西上,或者你可以正确地做这个工作,find内存泄漏。 一个中间立场是至less将dynamic代码执行推出到一个单独的进程(使用suPHP,suexec,php-fpm等),无论如何出于安全目的,这是一个好主意。
我不知道你看到什么样的stream量会需要这样的设置,但似乎你的设置可以降低,以更好地利用资源,因为它似乎是你过度承担阿帕奇从开始&没有它configuration为现实的网站stream量。 除非你可以提供一些网站统计数据,certificate初始configuration的数量很高。
关键是MaxRequestsPerChild ,它将通过更频繁地重新生成父进程来帮助防止内存泄漏。 另外,我降低了ServerLimit & MaxClients因为这与多less个客户端连接到PER SECOND有关。 所以,如果有人从你的网站抓取一个页面,并在1秒内呈现,猜猜是什么? 服务器已经完成了它的工作。 相关的,我降低MaxKeepAliveRequests和KeepAliveTimeout再次更加实际。 我也降低了一般Timeout因为120秒是2分钟。 如果客户花费2分钟时间从您那里获取内容,那么在服务器超时之前,要花费大量时间才能提供内容。 我喜欢保持这个数字,以防万一高stream量的情况出现。
记住:Web服务器不保持服务器和客户端之间的连接。 客户端发出请求,服务器发送页面,就是这样。 所以记住这一点。 此外, 请阅读我提供给另一个担心他们的Web服务器上的内存使用的海报的其他答案 。
Timeout 120 TraceEnable Off ServerSignature Off ServerTokens ProductOnly FileETag None StartServers 6 <IfModule prefork.c> MinSpareServers 4 MaxSpareServers 16 </IfModule> ServerLimit 80 MaxClients 60 MaxRequestsPerChild 2000 KeepAlive On KeepAliveTimeout 2 MaxKeepAliveRequests 30