Python资源模块无法工作
(请原谅我的英语不好,我不是母语者)
我尝试使用Python的资源模块来限制子进程。
看起来设置RLIMIT_CPU可以成功限制CPU的使用时间,但像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版本是3.2。
1 个回答
2
根据关于 setrlimit() 的说明,RLIMIT_RSS
在 Linux 2.4.30 及以后的版本中没有效果。而且,它只计算那些用 madvise() 标记的内存:
RLIMIT_RSS
这个参数用来指定进程的常驻集的限制(也就是在内存中实际使用的虚拟页面数量)。 这个限制只在 Linux 2.4.x 版本中有效,并且只对调用madvise()
时指定MADV_WILLNEED
的情况有影响。
所以,如果你真的想通过这种方式限制进程,你就得使用 2.4 内核,并且还要修改 Python 解释器,让它在分配内存时调用 madvise()
,这样做可能会带来一些意想不到的副作用。