Apache 和 mod_perl 在空闲时占用内存

Apache 和 mod_perl 在空闲时占用内存

运行 mod_perl 应用程序的 Apache Web 服务器暴露出异常的内存使用情况 - 在“日负载”停止后,系统内存被 Apache 进程耗尽,并且 oom_killer 被调用。第二天早上负载恢复后,内存使用情况恢复正常 - 可能是因为如果生成了足够数量的命中,Apache 工作进程会定期回收:

系统内存统计图

这是每秒 Apache 点击次数的相关图表: Apache 点击图

整个晚上,剩下的每秒 2 次点击是由 HAProxy 检查引起的 - 它HEAD http://mydomain.example.com/running HTTP/1.0每半秒向服务器运行一次请求“跑步”是静态文件(即不调用任何 perl 代码)。禁用这些检查似乎也能解决内存使用问题,但显然不是解决方案。

所有 3 台配置类似的服务器(HAProxy 后面)都暴露了这种行为。运行的操作系统是 Ubuntu 10.10,Apache 版本 2.2.16。这似乎是内存泄漏,但我不知道如何开始调试它 - 有什么提示吗?

答案1

这是因为 perl 代码中存在内存泄漏。早晨回收可能在 logrotate 时进行。最好的解决方案是使用 fast-cgi 而不是 mod_perl,后者使用例如 30 个工作程序,因此每个工作程序都在消耗内存,因此如果每个工作程序都经常回收,例如 100 个请求而不是 1000 个或 10000 个请求,这无论如何都会消耗内存。因此,如果您设置例如 8、16、32 个 fast-cgi 工作程序(取决于您的 RAM),并且每 100 次页面渲染回收它们一次,这不会消耗那么多 RAM,并且性能不会下降。此外,如果您可以将模块拆分到运行在不同用户上的不同 fast-cgi 工作程序之间,您将获得更高的安全性,并且理想情况下您还设置了 SELinux 来隔离这些帐户。

相关内容