我的 Apache2 设置是否泄漏内存?

我的 Apache2 设置是否泄漏内存?

最近,我注意到我的 apache 在我的 Linode 服务器上使用了大量内存(比以前多了 80MB),重新启动 apache2 似乎可以解决这个问题。

我在 apache 上运行 SVN,并在服务器上运行 mysql 和 tomcat,但似乎都不是问题所在。我该如何调试 apache 丢失内存的位置?除了 SVN,它实际上只托管一个 wordpress 博客,所以我看不出泄漏可能发生在哪里。我使用了 ubuntu 8.04 存储库中的默认安装。

有什么帮助吗?

答案1

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

您要监视的值是 RES - 这是子线程消耗的最大内存量的大小(在我的例子中,PHP 作为该线程的一部分运行,因此在加载库和数据时会出现“膨胀”)。线程不会释放分配的内存,但是当 apache 进程在其 maxrequests 之后按照以下方式终止线程时

<IfModule prefork.c>
MaxRequestsPerChild  1000

线程将恢复到其本机内存消耗。这与重新启动 Apache 的效果相同,尽管重新启动会导致服务暂时丢失(没有任何服务在端口 80 上监听),而 MaxRequestsPerChild 仅控制子线程,确保仍然有一个服务在端口 80 上监听(或配置为监听的任何位置)。

要降低 apache 的总内存使用量,请确保只加载所需的 apache 模块,并在运行非常大的 PHP 脚本时监视 apache 的线程(ini_set('memory_limit', '128M');然后以递归方式将数据加载到数组中 - 应该可以做到)。然后,在实际使用过程中,降低该MaxRequestsPerChild值,直到您看到 apacheRES处于合理的水平。不要忘记,这只是降低子线程在其“生命”开始时运行大型脚本的可能性(执行此操作的子线程越多,apache 使用的总内存就越多),

以下是一些有用的参数调整文章:

相关内容