如何调查与Apache和PHP内存泄漏?

我们正在运行一个沉重的Drupal网站,执行财务build模。 我们似乎遇到了某种内存泄漏,因为在apache进程数量保持稳定的情况下,apache使用的内存超时,

在这里输入图像描述

在这里输入图像描述

我们知道内存问题来自apache / PHP,因为每当我们发出一个/etc/init.d/httpd reload内存使用下降(见上面的截图和下面的CLI输出):

在httpd之前重新加载

 $免费
             caching总共使用的空闲共享缓冲区
 Mem:49447692 45926468 3521224 0 191100 22609728
 -  / + buffers / cache:23125640 26322052
交换:2097144 536552 1560592

在httpd重新加载之后

 $免费
             caching总共使用的空闲共享缓冲区
 Mem:49447692 28905752 20541940 0 191360 22598428
 -  / + buffers / cache:6115964 43331728
交换:2097144 536552 1560592

每个apache线程被分配一个512MB的PHP memory_limit ,这就解释了高内存使用率会导致请求数量不足,并且max_execution_time为120秒,这应该会终止执行时间更长的线程,因此应该防止内存使用的持续增长看到了。

问:我们如何调查是什么导致了这种内存泄漏?

理想情况下,我正在寻找我可以在系统上执行的故障排除步骤,而不必打扰开发团队。

附加信息:

 OS: RHEL 5.6 PHP: 5.3 Drupal: 6.x MySQL: 5.6 

仅供参考,我们意识到我们正在单独研究的交换问题,而且与交换开始前我们观察到的内存泄漏无关。

我们知道内存问题来自apache / PHP,因为每当我们发出一个/etc/init.d/httpd重新加载内存使用下降

不 – 这只是意味着它与networkingstream量有关。 你已经提到,你正在运行mysql的 – 大概是pipe理networking服务器的数据 – 它可能就是这里的罪魁祸首。 正如其他服务您的webstack使用,你没有提到。

每个apache线程都分配了一个512MB的PHP memory_limit,

不,不。 您报告的平均值为7,最多为25个繁忙的服务器,但您的内存图显示的是25Gb左右的增量。

真的,你应该重新开始基本的HTTP调整 – 你似乎运行一个恒定的256 httpds,但是你的峰值使用率是25 – 这简直是愚蠢的。

和一个120秒的max_execution_time应该终止执行花费更长时间的线程

否 – 只有当执行的线程在PHP解释器中时 – 如果PHP被阻塞的话。

执行财务build模

(叹)

如果您提供了有关如何configurationApache,线程化或prefork,什么版本,如何调用PHP(module,cgi,fastcgi),是否使用持久连接,是否使用存储过程的详细信息,这将会很有帮助。

我build议你先把mysql移到单独的机器上,并停止使用持续连接(如果你正在使用它们)。 将内存限制设置更低,并在每个脚本的基础上重写此限制。 确保你已经安装和configuration了循环引用垃圾回收器。

显然,这是PHP的工作方式 – 如果你在做分配对象的长循环,谁知道你是否也通过引用传递它们,那么处理它的唯一方法就是在每个PHP进程的N个请求之后停止它。 如果以CGI的身份运行PHP,每个请求都会使其重新生成 – 所以不会出现内存泄漏,性能下降可能不会太大。 你也可以运行fast-cgi,例如每1000个请求php-fcgi进程就会被终止并释放内存 – 也不会发生内存泄漏。 如果以模块mod_php的身份运行PHP,则可以尝试在httpd.conf中设置maxrequests以查看是否有帮助。 我会尝试安装例如10 – 如果要工作,性能下降不会很高,但是应该没有内存泄漏,即使在所有的250个httpds正在使用(10 * 250 = 2500 – 每个10MB的内存使用量是25GB – 所以也许如果你没有128GB的RAM也尝试降低进程的httpd数量,例如50)。

你现在可能已经解决了你的问题。 作为一个临时保持服务器交换/颠簸我每隔一小时从cron运行以下命令:

 #!/bin/sh sync; echo 3 > /proc/sys/vm/drop_caches 

我并不是说这是一个解决scheme,只是一种保持运行的方式,并且当你投入内存泄漏的实际原因时,将最小化的压力降到最低。

更多细节可以在这里find。

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/

检查全局php.ini文件中的内存。 不要像1 G等简单的decalre valure …我强烈build议将一个本地php.ini带入该帐户,以免影响整个服务器。 我build议将全局php.ini限制设置为64M左右,因为这通常足以满足大多数帐户的需求

检查你的Apache设置了