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.

È stato utile?

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

pagina man :

  

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top