Apache进程空闲和吃内存

时间:2014-11-06 23:19:01

标签: python django apache memory

我试图调试一个不断增长的内存大小的Apache进程。我在带有4GB RAM的虚拟Ubuntu主机上运行带有MPM Prefork的Apache 2.4.6,使用mod_wsgi为Django应用程序提供服务。该应用程序很重,AJAX调用和Apache每分钟300到1000个请求。这就是我所看到的:

  • 一旦我重新启动Apache,第一个子进程(具有最低PID)将继续增加其内存使用量,在6或7分钟内达到一个演出。所有其他Apache进程将使每个进程的内存使用量保持在10MB-50MB之间。
  • 麻烦过程的CPU使用率会有所波动,有时会下降到非常低的水平,其他时候会徘徊在20%或有时会飙升。
  • 麻烦的过程将无限期地运行,直到我重新启动Apache。
  • 我可以在我的Django日志中看到,麻烦的过程正在为多个远程IP提供一些请求(我看到的是我的应用程序主要不喜欢的URL被捕获异常的报告)。
  • Apache错误日志通常(但不总是)显示PID的“IOError:无法写入数据”,有时跨多个IP。
  • Apache访问日志显示与此PID关联的任何请求。
  • 在PID上运行strace除了'restart_syscall(< ...恢复中断的调用...>')之外没有任何结果,即使我在strace运行时可以看到我的app日志中提到的PID。

我尝试设置MaxRequestsPerChild和MaxMemFree的低值,但似乎都没有任何效果。

这可能是什么,或者我如何进一步调试?事实上,我没有看到strace的输出,这使我的应用程序有一个无限循环。如果是这种情况,我怎样才能将PID追溯到它执行的代码路径或引发故障的请求?

1 个答案:

答案 0 :(得分:0)

而不是重新启动Apache,停止并启动Apache。 Apache有一个已知的无修复内存泄漏问题。

另外,考虑使用nginx和gunicorn - 这个设置是一个轻量级,更快,通常被推荐的替代品,可以为您的django应用程序和静态文件提供服务。

的参考文献:

Performance

Memory Usage

Apache/Nginx Comparison