限制一个进程的RAM数量(Linux)

我有一个Zope服务器(只是一个长期运行的Python进程),这往往会耗尽我的服务器上的所有内存几天后。 我不想每天晚上重新启动它 – 也许最好限制这个进程的内存,看看它是否可以正常工作。

那么,如何限制这个过程使用不超过256MB的内存?

该服务器是运行Centos 5.3的64位Intel机器。 我听说ulimit限制一个bash进程,但我怎么能限制它为一个python进程?

更新:

感谢您的想法! 我将使用混合的方法来解决我的问题:

  • 我将使用ulimit启动服务,所以它只能使用256MB RAM
  • 由于我有我的系统由Nagios监视,我会使用一个nagios-check命令来validation我的进程不超过192MB。
  • 如果我的进程使用超过192MB,则会自动启动正常重启。
  • 如果我的进程使用超过220MB或者进程根本不运行,pipe理员(我)会通过短信/电子邮件通知,所以我会手动处理这个问题。

这样,我想我是在安全的一面:当需要(通过nagios)自动平稳重启,并强制服务停止(通过ulimit),以防内存使用突然高峰

ulimit是一个锤子。 当它达到极限时,将很难杀死这个进程。

你可能想要更不积极的东西。 (这是一个优雅的重新启动)看看monit。 http://mmonit.com/monit/

这里是一个zope的configuration示例。 http://mmonit.com/wiki/Monit/ConfigurationExamples#zope

看看使用mem或totalmem选项来触发你的重启。

祝你好运。

resource模块是ulimit的Python等价物。

其他响应者似乎有你的主要问题,但对我而言,你所要求的似乎是治疗症状,而不是原因。 为什么应用程序泄漏内存如此糟糕? 如果你能跟踪下来,限制并不是真的需要。

由于ulimit影响shell及其subprocess,因此如果可行的话,可以尝试从另一个(ulimit-ed)shell启动Python进程。

使用Python将是类似的东西

 subprocess.Popen('ulimit -v 262144; python_application', shell=True) 

使用Cgroups来限制内存。

cgroup将内存限制在一个可configuration的数量,并不像ulimit这样的硬锤。 这不会OOM杀死进程。 它会将进程所需的其余内存分页到磁盘。