我一直在尝试调试内存大小不断增长的 Apache 进程。我在具有 4GB RAM 的虚拟 Ubuntu 主机上运行带有 MPM Prefork 的 Apache 2.4.6,为带有 mod_wsgi 的 Django 应用程序提供服务。该应用程序大量使用 AJAX 调用,Apache 每分钟收到 300-1000 个请求。这是我看到的:
- 一旦我重新启动 Apache,第一个子进程(具有最低 PID)的内存使用量将不断增加,在 6 或 7 分钟内达到超过 1 次。所有其他 Apache 进程将使每个进程的内存使用量保持在 10MB-50MB 之间。
- 有问题的进程的 CPU 使用率会波动,有时会下降得很低,有时会徘徊在 20% 或有时会飙升。
- 麻烦的进程将无限期运行,直到我重新启动 Apache。
- 我可以在我的 Django 日志中看到麻烦的进程正在为多个远程 IP 提供一些请求(我看到的报告主要是针对我的应用程序不喜欢的 URL 捕获异常)。
- Apache 错误日志经常(但不总是)显示 PID 的“IOError:无法写入数据”,有时会跨越多个 IP。
- Apache 访问日志不显示任何已完成的与此 PID 相关的请求。
- 在 PID 上运行 strace 除了 'restart_syscall(<... resuming interrupted call ...>' 之外没有任何结果,即使在 strace 运行时我可以看到我的应用程序日志中提到的 PID。<
我已经尝试将 MaxRequestsPerChild 和 MaxMemFree 的值设置得较低,但似乎都没有任何效果。
这可能是什么,或者我该如何进一步调试?事实上,我没有看到 strace 的输出,这让我觉得我的应用程序有一个无限循环。如果是这种情况,我如何才能将 PID 追溯到它执行的代码路径或引发问题的请求?
最佳答案
不是重新启动 Apache,而是停止并启动 Apache。 Apache 存在一个已知的未修复内存泄漏问题。
此外,请考虑使用 nginx 和 gunicorn - 这种设置是一种轻量级、更快且经常被推荐的替代方案,可以替代为您的 django 应用程序和静态文件提供服务。
引用资料:
关于python - Apache 进程空闲并占用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26791266/