2011-07-02 65 views
3

(原諒我可憐的英語,我不是原生的)Python的資源模塊不工作

我試過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。

+0

可能的重複 - http://stackoverflow.com/questions/3043709/resident-set-size-rss-limit-has-no-effect。該鏈接還提供解決方案。 –

回答

2

根據setrlimit()的文檔,RLIMIT_RSS在Linux 2.4.30和更高版本中不起作用。此外,它只能算作內存標有madvise():進程的駐留集(虛擬頁駐留在RAM數量 )的

RLIMIT_RSS
指定限制(頁)。 此限制僅在Linux 2.4.x,x < 30中有效,並且僅影響指定madvise()的指定 MADV_WILLNEED

所以,如果你真的想限制程序這樣,你必須運行2.4內核和破解Python解釋器,因此呼籲madvise()上分配的內存,這可能會有意想不到的副作用。

+0

是否有其他方法來限制內存使用? – cuihao

+1

@cuihao,你嘗試過'RLIMIT_AS'嗎? –

+0

:)現在我有足夠的徽章來投票你的答案。 – cuihao