Resident Set Size (RSS) Limite non ha alcun effetto
Domanda
Il seguente problema si verifica in una macchina con Ubuntu 10.04 con il kernel 2.6.32-22-generic: Impostazione di un limite per il Resident Set Size (RSS) di un processo non sembra avere alcun effetto. Io attualmente impostato il limite in Python con il seguente codice:
import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000 # this should fail
La lista, memory_sink, riesce ogni volta. Quando controllo l'utilizzo RSS con la parte superiore, posso facilmente ottenere il processo di utilizzare 1 GB di RAM, il che significa che il limite non funziona. Do RSS limiti non lavoro con questo kernel o distro? Se aiuta, resource.RLIMIT_NPROC (limite del processo utente) funziona.
Soluzione
Formare la pagina man getrlimit:
RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
Sembra che questo non è solo supportato su Linux kernel 2.6.
Altri suggerimenti
È possibile eseguire questa operazione utilizzando cgroups. La versione lunga è sul mio blog , ma la versione corta (testato su Ubuntu 11.04) è il seguente:
-
Installare il pacchetto
cgroup-bin
. -
Modifica
/etc/cgconfig.config
e creare un gruppo con la memoria limitata. Per esempio, ho aggiunto:group limited { memory { memory.limit_in_bytes = 50M; } }
-
Esegui
$ sudo restart cgconfig $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited $ cgexec -g memory:limited your/program
ho osservato il mio processo con un RSS di 93M, quando ho chiesto di utilizzare solo 50M, ma che non era un problema per me, dal momento che il mio obiettivo era solo per ottenere il programma alla pagina.
cgclassify
consente di collegare le restrizioni a un processo in esecuzione troppo. Nota per RSS questo vale solo per la memoria allocata dopo la restrizione entrata in vigore.
Un limite relativo - di memoria virtuale o spazio di indirizzamento (rlimit_as) - funziona. Ciò consente di limitare la memoria processo pitone e sottoprocessi senza attrezzi esterni.
>>> size = 50*1024*1024 # In bytes
>>> resource.setrlimit(resource.RLIMIT_AS, (size, resource.RLIM_INFINITY))
>>> a = 'a' * size
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
rlimit_as . La dimensione massima della memoria virtuale del processo (spazio di indirizzi) in byte.
Ecco una buona spiegazione della differenza tra il set di Resident e la dimensione VM - Che cos'è RSS e VSZ in Linux la gestione della memoria .
Ho creato uno script per l'utilizzo di memoria limite utilizzando cgroups e direttore cgroup, utilizzabili per i comandi ad hoc e non necessitano di privilegi di root. Vedere https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894