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

Modified on: Tue, 20 Aug 2019 07:20:02 +0800

我们正在运行一个繁重的Drupal网站来执行财务建模。考虑到apache使用的内存增加而apache进程的数量保持稳定,我们似乎遇到了某种内存泄漏:

我们知道内存问题来自apache / PHP,因为每当我们发出/etc/init.d/httpd reload时,内存使用量就会下降(参见上面的屏幕截图和CLI输出): / p>

在httpd重新加载之前

$ free
             total       used       free     shared    buffers     cached
Mem:      49447692   45926468    3521224          0     191100   22609728
-/+ buffers/cache:   23125640   26322052
Swap:      2097144     536552    1560592

httpd reload

之后

$ free
             total       used       free     shared    buffers     cached
Mem:      49447692   28905752   20541940          0     191360   22598428
-/+ buffers/cache:    6115964   43331728
Swap:      2097144     536552    1560592

每个apache线程都分配了一个512MB的PHP memory_limit,这解释了高内存使用量会占用少量请求,以及120秒的max_execution_time应终止线程哪个执行需要更长时间,因此应该防止我们看到的内存使用量不断增长。

问:我们如何调查造成此内存泄漏的原因?

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

其他信息:

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

仅供参考我们知道我们正在单独调查的交换问题,与我们在交换开始之前观察到的内存泄漏无关。

作者:,Max

最佳答案

  

我们知道内存问题来自apache / PHP,因为无论何时我们发出/etc/init.d/httpd重新加载内存使用量下降

不 - 这只是意味着它与网络流量有关。你已经提到你在盒子上运行mysql - 可能是管理网络服务器的数据 - 它可能就像这里的罪魁祸首一样容易。您的webstack使用的其他服务也是如此。

  

为每个apache线程分配一个512MB的PHP memory_limit,解释

不,不。您报告的平均7个服务器和最多25个忙碌服务器 - 但您的内存图表显示大约25Gb的增量。

真的,您应该重新开始使用基本的HTTP调优 - 您似乎正在运行一个恒定的256个httpd,但您的峰值使用率是25 - 这只是简单的愚蠢。

  

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

否 - 仅当执行线程在PHP解释器内时 - 如果PHP被阻止,则不行。

  

执行财务建模

(叹气)

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

我建议你首先将mysql移动到一台单独的机器上并停止使用持久连接(如果你当前正在使用它们)。将内存限制设置为较低,并在每个脚本的基础上覆盖它。确保已安装并配置了循环引用垃圾收集器。

作者:symcbean

相关问答

添加新评论