2010-06-15 34 views
16

Le problème suivant se produit sur une machine exécutant Ubuntu 10.04 avec le noyau 2.6.32-22-generic: Définir une limite pour la taille de l'ensemble résident (RSS) d'un processus ne semblent avoir un effet. Je mets actuellement la limite en Python avec le code suivant:La limite Resident Set Size (RSS) n'a aucun effet

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 de RSS avec le dessus, je peux facilement obtenir le processus pour employer 1GB de RAM, qui signifie que la limite ne fonctionne pas. Les limites RSS ne fonctionnent-elles pas avec ce noyau ou cette distribution? Si cela aide, resource.RLIMIT_NPROC (limite de processus utilisateur) fonctionne.

Répondre

12

forme 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.

+1

J'avais googlé la page man maintes fois, mais manqué ceux qui avaient cette disposition. Un simple "man getrlimit" sur ma machine aurait suffi. Merci! – BrainCore

19

Vous pouvez accomplir ceci en utilisant les groupes de contrôle. La version longue est sur mon blog, mais la version courte (testé sur Ubuntu 11.04) est:

  • Installez le package cgroup-bin.

  • Modifiez /etc/cgconfig.config et créez un groupe avec une mémoire limitée. Pour exemple, j'ajouté:

    group limited { 
        memory { 
        memory.limit_in_bytes = 50M; 
        } 
    } 
    
  • Run

     
    $ 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 juste d'obtenir le programme à la page.

cgclassify permet également d'associer des restrictions à un processus en cours. Remarque pour RSS cela ne s'applique qu'à la mémoire allouée après l'entrée en vigueur de la restriction.

+1

Sur Ubuntu 11.10 l'emplacement du fichier de configuration a été changé en:/etc/cgconfig.conf – maxschlepzig

+2

Sur Ubuntu 10.04, je reçois le message d'erreur 'restart: travail inconnu: cgconfig' lorsque j'essaie d'exécuter la commande' sudo restart cgconfig'. :( – zrajm

+0

Je n'ai pas de racine, est-ce que je peux toujours l'utiliser? – gerrit

3

Une limite associée - mémoire virtuelle ou espace d'adressage (RLIMIT_AS) - fonctionne. Cela permet de limiter la mémoire du processus et des sous-processus python sans outils 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 l'man page:

RLIMIT_AS. La taille maximale de la mémoire virtuelle du processus (espace d'adressage) en octets.

Voici une bonne explication de la différence entre l'ensemble résident et la taille de la machine virtuelle - What is RSS and VSZ in Linux memory management.

+1

Lorsque j'utilise 'RLIMIT_AS', j'obtiens un' MemoryError' même quand on alloue (beaucoup) moins que la limite. [Voir cette question] (http: //stackoverflow.com/q/39755928/974555). – gerrit