Resident Set Size (RSS) limite n'a pas d'effet
Question
Le problème suivant se produit sur une machine exécutant Ubuntu 10.04 avec le noyau 2.6.32-22-générique: Définition d'une limite pour le résident DÉFINIE (RSS) d'un processus ne semble pas avoir d'effet. Je mets actuellement la limite en Python avec le code suivant:
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 liste, memory_sink, réussit à chaque fois. Quand je vérifie l'utilisation RSS avec top, je peux facilement le processus d'utiliser 1Go de RAM, ce qui signifie que la limite ne fonctionne pas. Ne RSS limite pas le travail avec ce noyau ou distro? Si elle aide, resource.RLIMIT_NPROC (limite de processus utilisateur) fonctionne.
La solution
Formez la page de manuel 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.
Il semble que ceci est tout simplement pas pris en charge sur le noyau Linux 2.6.
Autres conseils
Vous pouvez accomplir cela en utilisant cgroups. La version longue est sur mon blog de , mais la version courte (testé sur Ubuntu 11.04) est:
-
Installer le paquet
cgroup-bin
. -
Modifier
/etc/cgconfig.config
et créer un groupe avec une mémoire limitée. Pour par exemple, j'ai ajouté:group limited { memory { memory.limit_in_bytes = 50M; } }
-
Exécuter
$ sudo restart cgconfig $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited $ cgexec -g memory:limited your/program
J'ai observé mon processus avec un flux de 93M quand je l'ai demandé d'utiliser seulement 50M, mais ce ne fut pas un problème pour moi, puisque mon but était d'obtenir le programme à la page.
cgclassify
vous permet d'attacher des restrictions à un processus en cours d'exécution aussi. Note pour les RSS cela ne concerne que la mémoire allouée après la restriction est en vigueur.
Une limite liée - mémoire virtuelle ou espace d'adressage (RLIMIT_AS) - fonctionne. Cela permet de limiter le processus de python et sans outils sous-processus mémoire externes.
>>> 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
De la page man :
RLIMIT_AS . La taille maximale de la mémoire virtuelle du processus (espace d'adresse) en octets.
Voici une bonne explication de la différence entre l'ensemble des résidents et la taille VM -
Je créé un script pour l'utilisation de la mémoire limite en utilisant cgroups et gestionnaire de groupe de contrôle, utilisables pour les commandes ad hoc et ne nécessitant pas les privilèges root. Voir https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894