Resident Set Size (RSS) Grenze hat keine Auswirkung
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.
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