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

Modified on: Thu, 10 Oct 2019 04:40:01 +0800

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

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

有任何帮助吗?

最佳答案

Apache内存处理的细微差别意味着它似乎总是占用越来越多的内存 - 当使用prefork.c(我假设你是)时,top的VIRT值通常很高:

  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进程按照

的最大请求后杀死该线程时

<IfModule prefork.c>
MaxRequestsPerChild  1000

线程将返回其本机内存消耗。这与重新启动apache的效果相同,尽管重启涉及暂时的服务丢失(没有任何东西正在侦听端口80)而MaxRequestsPerChild只控制子线程,确保仍然有一个服务侦听端口80(或者它配置到的任何地方)听)。

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

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

作者:Andy

相关问答

添加新评论