2010-06-15 8 views
16

Das folgende Problem tritt auf einem Computer auf, auf dem Ubuntu 10.04 mit dem generischen 2.6.32-22-Kernel ausgeführt wird: Festlegen eines Limits für die Resident Set Size (RSS) eines Prozesses nicht scheinen irgendeinen Effekt zu haben. Ich zur Zeit die Grenze in Python mit dem folgenden Code ein:Resident Set Size (RSS) -Grenzwert hat keine Auswirkung

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 es jedes Mal. Wenn ich RSS-Nutzung mit Top überprüfe, kann ich leicht den Prozess dazu bringen, 1 GB RAM zu verwenden, was bedeutet, dass das Limit nicht funktioniert. Funktionieren RSS-Limits nicht mit diesem Kernel oder Distro? Wenn es hilft, funktioniert resource.RLIMIT_NPROC (Benutzerprozesslimit).

Antwort

12

Formular 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, dies ist einfach nicht 2.6 auf Linux-Kernel unterstützt.

+1

Ich hatte die Manpage unzählige Male gegoogelt, aber vermisste diejenigen, die diese Bestimmung hatten. Ein simpler "Mannstrollimit" an meiner Maschine hätte ausgereicht. Vielen Dank! – BrainCore

19

Sie können dies mit Cgroups erreichen. Die lange Version ist auf meiner blog, aber die kurze Version (getestet auf Ubuntu 11.04) ist:

  • Installieren Sie das cgroup-bin Paket.

  • Bearbeiten Sie /etc/cgconfig.config und erstellen Sie eine Gruppe mit begrenztem Speicher. Für Beispiel fügte ich hinzu:

    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 
    

ich meinen Prozess mit einem RSS-von 93M beobachtet, wenn ich es nur gefragt 50M zu verwenden, aber das war kein Problem für mich, da mein Ziel nur war, das Programm auf Seite zu bekommen.

cgclassify können Sie auch an einen laufenden Prozess Beschränkungen anhängen. Anmerkung für RSS gilt dies nur für den Speicher, der zugewiesen wird, nachdem die Einschränkung in Kraft tritt.

+1

Auf Ubuntu 11.10 Der Speicherort der Konfigurationsdatei wurde geändert in: '/ etc/cgconfig.conf' – maxschlepzig

+2

Unter Ubuntu 10.04 bekomme ich nur die Fehlermeldung' restart: Unbekannter Job: cgconfig', wenn ich versuche, den Befehl 'sudo restart cgconfig' auszuführen. :( – zrajm

+0

Ich habe keine root. Kann ich immer noch diese verwenden? – gerrit

3

Ein verwandter Grenzwert - virtueller Speicher oder Adressraum (RLIMIT_AS) - funktioniert. Dies ermöglicht es, den Python-Prozess zu begrenzen und den Speicher ohne externe Tools zu verarbeiten.

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

Vom man page:

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

Hier ist eine gute Erklärung für den Unterschied zwischen dem Resident Set und der VM-Größe - What is RSS and VSZ in Linux memory management.

+1

Wenn ich versuche, 'RLIMIT_AS' zu verwenden, bekomme ich einen' MemoryError', auch wenn (viel) weniger als das Limit zugewiesen. [Siehe diese Frage] (http: //stackoverflow.com/q/39755928/974555). – gerrit

Verwandte Themen