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

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...