最近,我注意到我的apache在我的Linode服务器上使用了荒谬的内存(比以前多了80MB),重新启动apache2似乎解决了这个问题。
我通过Apache运行SVN,以及服务器上的mysql和tomcat,但似乎都没有问题。 如何debuggingapache在丢失内存的地方? 除了SVN之外,它实际上只是托pipe一个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进程在其maxrequests之后按照杀死线程时
<IfModule prefork.c> MaxRequestsPerChild 1000
线程将返回到其本机内存消耗。 这和重新启动apache的效果是一样的,虽然重启涉及暂时的服务丢失(没有任何监听端口80),而MaxRequestsPerChild只控制子线程,确保仍然有一个监听端口80的服务(或者是configuration的任何地方听)。
为了降低Apache的总内存使用量,确保只加载你需要的apache模块,并在运行一个非常大的PHP脚本( ini_set('memory_limit', '128M');然后recursion地将数据加载到数组中ini_set('memory_limit', '128M');监视apache的线程 -应该这样做)。 然后,在真实世界的使用情况下,降低MaxRequestsPerChild值,直到你看到你的apache RES在合理的水平。 不要忘记,这只会降低子线程在“生命”开始时运行一个大脚本的可能性(这样做的孩子越多,apache使用的内存就越多),
以下是一些有用的参数调整文章: