【问题标题】:Python resource module not workPython资源模块不起作用
【发布时间】:2011-07-02 10:26:40
【问题描述】:

(原谅我英语不好,我不是本地人)

我尝试了 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 limit: (1024, 1024)”然后继续运行直到被杀死。 我可以看到 child.py 吃掉我的记忆,但 RLIMIT_RSS 不起作用。

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

【问题讨论】:

标签: python linux


【解决方案1】:

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

RLIMIT_RSS
指定进程驻留集的限制(以页为单位)(数量 驻留在 RAM 中的虚拟页面)。 此限制仅在 Linux 中有效 2.4.x,x madvise() 的调用指定 MADV_WILLNEED.

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

【讨论】:

  • 还有其他限制内存使用的方法吗?
  • @cuihao,你试过RLIMIT_AS吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2016-10-01
  • 1970-01-01
  • 2015-01-29
  • 2011-09-30
  • 2021-03-08
相关资源
最近更新 更多