Python资源模块不起作用

时间:2011-07-02 10:26:40

标签: python linux

(原谅我可怜的英语,我不是本地人)

我尝试使用Python资源模块来限制子进程。

似乎设置RLIMIT_CPU可以成功地限制cputime的数量,但其他像RLIMIT_RSS根本不起作用。

例如,我使用以下脚本调用child.py,并将RSS限制设置为(1024,1024):

import os
import sys
import resource
import subprocess

def setlimits():
    resource.setrlimit(resource.RLIMIT_RSS, (1024, 1024))

p = subprocess.Popen(["./child.py"], preexec_fn=setlimits)
print(p.wait())

child.py:

#!/usr/bin/env python3
import resource

print("RSS limit: ", resource.getrlimit(resource.RLIMIT_RSS))
a=[]
while True:
    a.append(1) # deadloop, until eat up memory

子进程打印“RSS限制:(1024,1024)”然后继续运行直到被杀死。 我可以看到child.py吃了我的记忆,但RLIMIT_RSS没有用。

我的操作系统是最新的Archlinux(2.6.39内核),Python是ver3.2。

1 个答案:

答案 0 :(得分:2)

根据setrlimit()的文档,RLIMIT_RSS在Linux 2.4.30及更高版本中无效。此外,它仅计算标有madvise()的内存:

  

<强> RLIMIT_RSS
  指定进程驻留集的限制(以页为单位)(数字   驻留在RAM中的虚拟页面)。   此限制仅在Linux中有效   2.4.x,x&lt; 30,只影响madvise()指定的调用   MADV_WILLNEED

所以,如果你真的想以这种方式限制进程,你必须运行2.4内核并破解Python解释器,以便在分配的内存上调用madvise(),这可能会产生意想不到的副作用。