我有一个 Zope 服务器(只是一个长时间运行的 Python 进程),它往往会在几天后耗尽我服务器上的所有 RAM。我不想每晚都重新启动它 - 也许最好限制此进程的 RAM,看看它是否可以正常工作。
那么,我该如何限制此过程使用的 RAM 不超过 256MB?
服务器是一台运行 Centos 5.3 的 64 位 Intel 机器。我听说过 ulimit 可以限制 bash 进程,但是如何限制 python 进程呢?
更新:
谢谢你的想法!我将使用混合方法解决我的问题:
- 我将使用 ulimit 启动该服务,这样它只能使用 256MB RAM
- 由于我的系统由 Nagios 监控,我将使用 nagios-check 命令来验证我的进程使用的内存不超过 192MB。
- 如果我的进程使用超过 192MB,那么将自动启动平滑重启。
- 如果我的进程使用超过 220MB 或者进程根本不运行,则会通过短信/电子邮件通知管理员(我自己),因此我将手动处理该问题。
这样一来,我想我就比较安全了:需要时自动平稳重启(通过 nagios),并在 RAM 使用量突然达到峰值时强制停止服务(通过 ulimit)
答案1
ulimit 就像一把锤子,当进程达到极限时,它会强制杀死该进程。
您可能需要一些不那么激进的东西。(可以正常重启的东西)看看 monit。 http://mmonit.com/monit/
这是 zope 的一个示例配置。 http://mmonit.com/wiki/Monit/ConfigurationExamples#zope
查看使用 mem 或 totalmem 选项来触发重启。
祝你好运。
答案2
这resource
模块是 Python 中的 等效项ulimit
。
答案3
其他回复者似乎已经了解您的主要问题,但在我看来,您的问题似乎是治标不治本。为什么应用程序内存泄漏如此严重?如果您能找到原因,那么限制就没有必要了。
答案4
使用Cgroups限制内存。
cgroup 将内存限制为可配置的数量,而不是像 ulimit 那样的硬锤。它不会因 OOM 而终止进程。它会将进程所需的剩余内存分页到磁盘。