Resident Set Size (RSS) Limit hat keine Wirkung

Das folgende Problem tritt auf einer Maschine auf, die Ubuntu 10.04 mit dem 2.6.32-22-generischen Kernel ausführt: Ein Festlegen eines Limits für die Resident Set Size (RSS) eines Prozesses scheint keine Wirkung zu haben. Ich setze derzeit die Grenze in Python mit dem folgenden Code:

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, memory_sink, gelingt jedes Mal. Wenn ich die RSS-Nutzung mit oben überprüfe, kann ich ganz einfach den Prozess verwenden, um 1 GB RAM zu verwenden, was bedeutet, dass die Grenze nicht funktioniert. Sind RSS-Grenzen nicht mit diesem Kernel oder der Distribution zu arbeiten? Wenn es hilft, wird resource.RLIMIT_NPROC (User Process Limit) funktionieren.

  • Zeichnung auf openstreetmap in python
  • Verwenden von Ereignissen mit matplotlib in einer for-Schleife
  • Erstellen von hochauflösenden Bildern in Python
  • Wie zeichne zwei Spalten eines Pandas-Datenrahmens mit Punkten?
  • Erzeugung von Punkten auf einem Kreis
  • Schattierter Bereich zwischen Kurven in Handlung
  • 4 Solutions collect form web for “Resident Set Size (RSS) Limit hat keine Wirkung”

    Form der 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, das wird einfach nicht auf Linux Kernel 2.6 unterstützt.

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

    • Installiere das Paket cgroup-bin .

    • Bearbeiten Sie /etc/cgconfig.config und erstellen Sie eine Gruppe mit eingeschränktem Speicher. Zum Beispiel fügte ich hinzu:

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

       $ Sudo neu starten cgconfig
       $ Sudo chown -R jlebar / sys / fs / cgroup / memory / limited
       $ Cgexec -g Speicher: beschränkte dein / Programm
      

    Ich habe meinen Prozess mit einem RSS von 93M beobachtet, als ich ihn gebeten habe, nur 50M zu benutzen, aber das war kein Problem für mich, denn mein Ziel war nur, um das Programm auf Seite zu bekommen.

    cgclassify können Sie Beschränkungen auch auf einen laufenden Prozess anhängen. Hinweis für RSS gilt dies nur für den Speicher, der nach Inkrafttreten der Beschränkung zugeteilt wird.

    Ich habe ein Skript erstellt, um den Speicherverbrauch mit Cgroups und Cgroup Manager zu beschränken, für Ad-hoc-Befehle zu verwenden und keine Root-Berechtigungen zu benötigen. Siehe https://unix.stackexchange.com/questions/134414/how-to-limit-die-total-resources-memory-of-a-process-and-its-children/174894#174894

    Ein verwandter Limit – virtueller Speicher oder Adressraum (RLIMIT_AS) – funktioniert. Dies ermöglicht die Begrenzung des Pythonprozesses und des Unterprozesses des Speichers ohne externe Werkzeuge.

     >>> 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 Arbeitsspeichers (Adressraum) in Bytes.

    Hier ist eine gute Erklärung für den Unterschied zwischen dem Resident Set und der VM Größe – Was ist RSS und VSZ in Linux Memory Management .

    Python ist die beste Programmiersprache der Welt.