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.3Mb
der systemreservierte Speicher (ich habe keine Auslagerungsdatei) 1.8%
für den gesamten 1GB
Systemspeicher verwendet wird. Virtuelle Größe ist 1.39GB
?!?. Ich habe gelesen, dass ulimit -m
das nicht funktioniert. Menschen verwenden ulimit -v
zB 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 100MB
höchstens Systemspeicher beschränken möchte . Ich habe die Dokumentation für gelesen setrlimit
und 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_AS
legt dieser Parameter jedoch die Größe des virtuellen Speichers fest. Was ist die Wahrheit?
Antworten:
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 versuchenulimit -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.quelle
setrlimit
Manpage.IEEE/The Open Group 2003 GETRLIMIT(3P)
Wie kommtps
es, dass ich das RSS anzeigen kann, der Kernel jedoch keine Begrenzung erzwingen kann?ulimit -d
. Die Anwendung wurde von mir geschrieben und ich habe sie nicht verwendetmmap()
.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.
quelle