Модуль ресурсов Python не работает - PullRequest
3 голосов
/ 02 июля 2011

(простите, мой плохой английский, я не родной)

Я пытался использовать ресурсный модуль Python для ограничения дочернего процесса.

Кажется, что установка RLIMIT_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 голосов
/ 02 июля 2011

Согласно документации для setrlimit () , RLIMIT_RSS не действует в Linux 2.4.30 и более поздних версиях. Кроме того, он считает только память, отмеченную madvise () :

RLIMIT_RSS
Определяет ограничение (в страницах) резидентного набора процесса (число виртуальных страниц, находящихся в оперативной памяти). Этот предел действует только в Linux 2.4.x, x <30, и влияет только на вызовы с указанием <code>madvise() MADV_WILLNEED.

Итак, если вы действительно хотите ограничить процессы таким образом, вам придется запустить ядро ​​2.4 и взломать интерпретатор Python, чтобы он вызывал madvise() на выделенной памяти, что, вероятно, будет иметь неожиданные побочные эффекты. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...