Frage

Das folgende Problem tritt auf einem Computer ausgeführt wird Ubuntu 10.04 mit dem 2.6.32-22-generic-Kernel: eine Grenze für das Resident Set Size (RSS) einen Prozesses scheint keine Wirkung haben einstellen. Ich zur Zeit die Grenze in Python mit dem folgenden Code ein:

import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000   # this should fail

Die Liste gelingt es memory_sink, jedes Mal. Als ich RSS Nutzung mit Top überprüfen, kann ich einfach den Prozess des RAM zu verwenden, 1gb, was bedeutet, dass die Grenze nicht funktioniert. Do RSS schränkt nicht die Arbeit mit diesem Kernel oder Distro? Wenn es hilft, tut resource.RLIMIT_NPROC (Benutzerprozess Grenze) zu arbeiten.

War es hilfreich?

Lösung

Wir bilden das getrlimit manpage:

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.

Es scheint, dies ist einfach nicht 2.6 auf Linux-Kernel unterstützt wird.

Andere Tipps

Sie können diese cgroups mit bewerkstelligen. Die lange Version ist auf meinem Blog , aber die kurze Version (getestet auf Ubuntu 11.04) lautet:

  • Installieren Sie das cgroup-bin Paket.

  • Bearbeiten /etc/cgconfig.config und eine Gruppe mit begrenztem Speicher erstellen. Zum So fügte ich hinzu:

    group limited {
      memory {
        memory.limit_in_bytes = 50M;
      }
    }
    
  • Ausführen

    $ sudo restart cgconfig
    $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited
    $ cgexec -g memory:limited your/program
    

Ich beobachtete meinen Prozess mit einer RSS-von 93M, wenn ich es nur gefragt 50M zu verwenden, aber das war kein Problem für mich, da mein Ziel war einfach, das Programm zu Seite zu gelangen.

cgclassify können Sie Einschränkungen zu einem laufenden Prozess zu befestigen. Hinweis für RSS dies nur in dem Speicher nach der Beschränkung zugewiesen gilt tritt in Kraft.

Ein verwandtes Grenze - die virtuelle Speicher oder Adressraum (RLIMIT_AS) - funktioniert. Auf diese Weise kann die Python-Prozess und Subprozesse Speicher ohne externe Tools zu begrenzen.

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

Von der Manpage :

  

RLIMIT_AS . Die maximale Größe des virtuellen Speichers des Prozesses (Adressraum) in Bytes.

Hier ist eine gute Erklärung für die Differenz zwischen dem Resident Set und der VM-Größe - Was ist RSS und VSZ in Linux-Speicherverwaltung .

habe ich ein Skript zu begrenzen Speichernutzung cgroups und cgroup-Manager, nutzbar für Ad-hoc-Befehle und keine Root-Rechte benötigen. Siehe https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top