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

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

我们知道内存问题来自apache / PHP,因为无论何时我们发出/etc/init.d/httpd重新加载内存使用量下降(参见上面的屏幕截图和CLI输出):

在httpd重新加载之前

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

httpd重载后

$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,这解释了高内存使用量会占用少量请求,并且max_execution_time为120秒,它应该终止执行时间更长的线程,因此应该防止内存使用量不断增长我们我看到了.

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

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

附加信息:

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

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

解决方法

We know the memory problem is coming from apache/PHP because whenever we issue a /etc/init.d/httpd reload the memory usage drops

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

Each apache thread is assigned a PHP memory_limit of 512MB which explains

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

真的,你应该从基本的HTTP调优开始 – 你似乎运行一个恒定的256 httpds,但你的峰值使用率是25 – 这只是简单的愚蠢.

and a max_execution_time of 120 sec which should terminate threads which execution is taking longer

否 – 仅当执行线程在PHP解释器中时 – 如果PHP被阻止则不行.

that performs financial modeling

(叹)

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

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

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...