Ste*_*all 5 linode memory-leak apache-2.2
最近,我注意到我的 apache 在我的 Linode 服务器上使用了大量的内存(比以前多 80MB),重新启动 apache2 似乎可以解决这个问题。
我在 apache 上运行 SVN,在服务器上运行 mysql 和 tomcat,但似乎都不是问题。如何在 apache 丢失内存的情况下进行调试?除了 SVN,它实际上只是托管一个 wordpress 博客,所以我看不出哪里可能发生泄漏。我使用了 ubuntu 8.04 存储库中的默认安装。
有什么帮助吗?
Apache 内存处理的细微差别意味着它似乎总是在消耗越来越多的内存 - 使用时 top 的 VIRT 值通常很高prefork.c
(我假设你是):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10385 apache 15 0 376m 48m 3932 R 20.3 1.2 0:01.34 httpd
10423 apache 16 0 376m 46m 4576 S 15.0 1.2 0:01.09 httpd
10153 apache 15 0 337m 61m 4672 S 11.6 1.6 0:03.94 httpd
10419 apache 15 0 383m 54m 4696 S 11.6 1.4 0:01.00 httpd
Run Code Online (Sandbox Code Playgroud)
您要监视的值是 RES - 这是子线程消耗的最大内存量的大小(在我的情况下,PHP 作为该线程的一部分运行,因此加载库和数据时会“膨胀”) . 线程不会释放分配的内存,但是当 apache 进程按照最大请求数杀死线程时
<IfModule prefork.c>
MaxRequestsPerChild 1000
Run Code Online (Sandbox Code Playgroud)
线程将返回到其本机内存消耗。这与重新启动 apache 的效果相同,尽管重新启动会导致服务暂时中断(没有任何东西在侦听端口 80),而 MaxRequestsPerChild 仅控制子线程,确保仍有服务在侦听端口 80(或任何配置为听)。
要降低 apache 的总内存使用量,请确保仅加载所需的 apache 模块,并在运行非常大的 PHP 脚本时监视 apache 的线程(ini_set('memory_limit', '128M');
然后将数据递归加载到数组中 - 应该这样做)。然后,在实际使用过程中,降低该MaxRequestsPerChild
值,直到您看到 apacheRES
处于合理水平。不要忘记这只是降低了子线程在其“生命”开始时运行大型脚本的可能性(这样做的子线程越多,apache 使用的总内存就越多),
以下是一些有用的参数调整文章: