Wie kann die Verwendung des Anwendungsspeichers begrenzt werden?

10

Ich habe 2 Stunden damit verbracht, Fragen zu diesem Thema zu lesen, und es gibt immer noch einige Missverständnisse.

Ich habe diesen Prozess:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

Dies zeigt, dass 19.3Mbder systemreservierte Speicher (ich habe keine Auslagerungsdatei) 1.8%für den gesamten 1GBSystemspeicher verwendet wird. Virtuelle Größe ist 1.39GB?!?. Ich habe gelesen, dass ulimit -mdas nicht funktioniert. Menschen verwenden ulimit -vzB das Einstellen des virtuellen Speichers für den Prozess. Ist dieser virtuelle Speicher derjenige, mit dem VSZ aufgelistet ist ps? Welchen Wert sollte ich festlegen, wenn ich diesen Prozess auf die Verwendung von 100MBhöchstens Systemspeicher beschränken möchte . Ich habe die Dokumentation für gelesen setrlimitund dies scheint legitim zu sein:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

In anderen Versionen der Dokumentation RLIMIT_ASlegt dieser Parameter jedoch die Größe des virtuellen Speichers fest. Was ist die Wahrheit?

Dragomir Ivanov
quelle
Bitte achten Sie auf die Formatierung der Beiträge.
Rozcietrzewiacz

Antworten:

6

Ja, VSZ ist virtueller Speicher. Wo haben Sie in Bezug auf RLIMIT_AS den oben zitierten Absatz gefunden? Da setrlimit (2) ein Linux-Systemaufruf ist, sehe ich nicht, wie es möglicherweise malloc (3), eine Bibliotheksfunktion, überwachen könnte. Stattdessen kann es nur mit brk (2), sbrk (2) und mmap (2) arbeiten - dies schlägt auch die Manpage (überprüft von Scientific Linux) vor. Die über diese Funktionen angeforderte Gesamtmenge an Speicher ist jedoch virtueller Speicher, sodass RLIMIT_AS den virtuellen Speicher tatsächlich begrenzt. (Dies entspricht wiederum der Manpage setrlimit (2).)

Leider können Sie RSS unter Linux nicht einschränken (dies wäre der Fall ulimit -m). Sie können versuchen ulimit -d(RLIMIT_DATA), dies ignoriert jedoch mmap (2), das normalerweise für große Zuordnungen verwendet wird. Eine andere Möglichkeit wäre, den virtuellen Speicher einzuschränken. Bei einem so großen Unterschied zwischen RSS und VSZ könnte dies jedoch schwierig sein.

Ansgar Esztermann
quelle
Vielen Dank für Ihre Antwort. Der Absatz stammt aus der setrlimitManpage. IEEE/The Open Group 2003 GETRLIMIT(3P)Wie kommt pses, dass ich das RSS anzeigen kann, der Kernel jedoch keine Begrenzung erzwingen kann?
Dragomir Ivanov
6
Laut Alan Cox hat dies historische Gründe: Die Berechnung von RSS war früher teuer, sodass die Durchsetzung des Limits den Kernel stark belasten würde. Quelle: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Siehe auch stackoverflow.com/questions/3043709/…
Ansgar Esztermann
Aha. Ich denke, ich würde dann mitgehen ulimit -d. Die Anwendung wurde von mir geschrieben und ich habe sie nicht verwendet mmap().
Dragomir Ivanov
2
Nein, normalerweise nicht (noch sbrk ()), aber malloc () könnte.
Ansgar Esztermann
Aha. Das ist sehr unglücklich. Die Lösung für diese Frage ist also entweder cgroups oder eine Umfrage zur Speichernutzung mit einer bestimmten Skriptsprache.
Dragomir Ivanov
3

Viele Prozesse teilen einen Teil ihres Speichers mit anderen Prozessen, z. B. wird libc von fast jedem Prozess verwendet, aber nur einmal im Speicher zugeordnet, zählt jedoch für die Nutzung des virtuellen Speichers jedes Prozesses. Die Begrenzung der Speichernutzung, die nur von einem bestimmten Prozess (meistens RSS) verwendet wird, kann mithilfe von cgroups erfolgen. Informationen dazu finden Sie unter Antworten zum Begrenzen der Gesamtressourcen (Speicher) eines Prozesses und seiner untergeordneten Elemente. Dies begrenzt den Gesamtspeicher eines Prozesses und seiner untergeordneten Elemente.

JanKanis
quelle