尽管限制了 MaxRequestsPerChild,Apache 进程仍在增长

尽管限制了 MaxRequestsPerChild,Apache 进程仍在增长

服务器版本:Apache/2.2.27 (Unix) mod_ssl/2.2.27 OpenSSL/1.0.1e-fips DAV/2 mod_bwlimited/1.4 PHP/5.4.27 mod_perl/2.0.6 Perl/v5.8.8 CENTOS 6.6 PHP 处理程序 - DSO

服务器正在使用 prefork 模块运行。Apache 子进程从大约 10mb 开始,然后逐渐增长(超过 100mb)。我开始寻找内存泄漏 - 但在此期间,我将 MaxRequestsPerChild 减少到 500(从 10000 减少),因为我的理解是,这会提前终止子进程并从 10mb 开始。然而,事实上,内存仍在继续增加(几天后它增长到 23mb。这让我觉得我没有正确理解某些事情。

我假设子进程正在死亡,因为我看到新的 PID 被创建,并且可以在 Apache 状态页面中看到每个子进程的访问次数在增长。

这是否可能与缓存有关?我已启用 eAccelerator for PHP,最大内存分配为 16mb(目前使用约 3mb)。我意识到我对如何管理缓存内存了解不够(我假设它是与每个子进程共享而不是复制的)。

补充一下...子进程增长几天后,内存占用量会在没有干预的情况下回落到较小的值。例如,在达到 100mb 的峰值后,有一天会下降到大约 25mb(没有重新启动 Apache)。这也许只是正常行为?

答案1

一旦新的进程启动,它可能会立即处理几个请求,从而从 10x MB 增长到 2x MB,让您产生错误的比例感。

不幸的是,仅通过查看 top 或 /proc 数据,您无法获得完整的画面。您可能被实时数字误导了。通过某些监控工具收集统计数据可以让您更好地了解到底发生了什么。

关于 MaxRequestsPerChild 设置 - 您做对了,此设置告诉 apache 在处理了多少请求后应回收该进程(例如:终止并替换为新进程)。但是,这不能保证进程将保持在 10MB 限制附近,因为即使是第一个请求也会将共享内容加载到内存中,这些内容将继续使用,直到该特定 PID 死亡。我建议您将其进一步降低 - 降低到 50。您基本上是在用 CPU 换取内存 - 例如,降低数字,将使用更多 CPU 周期来终止现有进程并分叉新的 apache 进程。如今,服务器往往拥有过剩的 CPU 能力,因此在这种情况下将 CPU 换成 RAM 通常是安全的。

另外,当您谈论内存使用情况时,您没有说明如何计算每个进程的使用情况?您是否计算了“比例集大小 (PSS)”,以排除所有 apache 进程之间共享的内存段?看看 smem。

相关内容