Как мне использовать `setrlimit` для ограничения использования памяти? RLIMIT_AS убивает слишком рано; RLIMIT_DATA, RLIMIT_RSS, RLIMIT_STACK убить совсем не

Я пытаюсь использоватьsetrlimit чтобы ограничить использование моей памяти в системе Linux, чтобы предотвратить сбой машины в процессе (мой код разбивал узлы в высокопроизводительном кластере, потому что ошибка приводила к потреблению памяти, превышающему 100 ГиБ). Я не могу найти правильный ресурс для передачиsetrlimit; Я думаю, что это должен быть резидент, которыйне может быть ограничено с помощью setrlimit, но меня смущает резидент, куча, стек. В коде ниже; если я только раскомментируюRLIMIT_ASкод не работает сMemoryError вnumpy.ones(shape=(1000, 1000, 10), dtype="f8") хотя этот массив должен быть только 80 МБ. Если я только раскомментируюRLIMIT_DATA, RLIMIT_RSS, или жеRLIMIT_STACK оба массива распределены успешно, даже если общее использование памяти составляет 2 ГБ, или вдвое больше желаемого максимума.

Я хотел бы, чтобы моя программа перестала работать (независимо от того, как), как только она пытается выделить слишком много оперативной памяти. Почему ни один изRLIMIT_DATA, RLIMIT_RSS, RLIMIT_STACK а такжеRLIMIT_AS делать то, что я имею в виду, и какой ресурс правильно передатьsetrlimit?

$ cat mwe.py 
#!/usr/bin/env python3.5

import resource
import numpy

#rsrc = resource.RLIMIT_AS
#rsrc = resource.RLIMIT_DATA
#rsrc = resource.RLIMIT_RSS
#rsrc = resource.RLIMIT_STACK

soft, hard = resource.getrlimit(rsrc)
print("Limit starts as:", soft, hard)

resource.setrlimit(rsrc, (1e9, 1e9))

soft, hard = resource.getrlimit(rsrc)
print("Limit is now:", soft, hard)
print("Allocating 80 KB, should certainly work")
M1 = numpy.arange(100*100, dtype="u8")

print("Allocating 80 MB, should work")
M2 = numpy.arange(1000*1000*10, dtype="u8")

print("Allocating 2 GB, should fail")
M3 = numpy.arange(1000*1000*250, dtype="u8")

input("Still here…")

Выход сRLIMIT_AS строка без комментариев:

$ ./mwe.py 
Limit starts as: -1 -1
Limit is now: 1000000000 -1
Allocating 80 KB, should certainly work
Allocating 80 MB, should work
Traceback (most recent call last):
  File "./mwe.py", line 22, in <module>
    M2 = numpy.arange(1000*1000*10, dtype="u8")
MemoryError

Вывод при работе с любым другим без комментариев:

$ ./mwe.py 
Limit starts as: -1 -1
Limit is now: 1000000000 -1
Allocating 80 KB, should certainly work
Allocating 80 MB, should work
Allocating 2 GB, should fail
Still here…

На последней строчкеtop сообщает, что мой процесс использует 379 ГБ VIRT, 2,0 ГБ RES.

Детали системы:

$ uname -a
Linux host.somewhere.ac.uk 2.6.32-573.3.1.el6.x86_64 #1 SMP Mon Aug 10 09:44:54 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.7 (Santiago)

$ free -h
             total       used       free     shared    buffers     cached
Mem:          2.0T       1.9T        37G       1.6G       3.4G       1.8T
-/+ buffers/cache:        88G       1.9T 
Swap:         464G       4.8M       464G 

$ python3.5 --version
Python 3.5.0

$ python3.5 -c "import numpy; print(numpy.__version__)"
1.11.1

Ответы на вопрос(1)

Ваш ответ на вопрос