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