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.

Était-ce utile?

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 -

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top