it-swarm.com.de

Speicherbegrenzungslösungen für gierige Anwendungen, die das Betriebssystem zum Absturz bringen können?

Ich benutze meinen Computer für die wissenschaftliche Programmierung. Es hat einen gesunden 8GB von RAM und 12GB von Swap Space. Da meine Probleme größer geworden sind, überschreite ich häufig den gesamten verfügbaren Arbeitsspeicher. Anstatt abzustürzen (was zu bevorzugen wäre), scheint Ubuntu alles in Swap zu laden, einschließlich Unity und alle offenen Terminals. Wenn ich ein weggelaufenes Programm nicht rechtzeitig finde, kann ich nur warten - es dauert 4-5 Minuten, um zu einer Eingabeaufforderung zu wechseln, z. Ctrl-Alt-F2 wo ich den störenden Prozess beenden kann.

Da meine eigene Dummheit außerhalb des Rahmens dieses Forums liegt, Wie kann ich verhindern, dass Ubuntu durch Thrashing abstürzt, wenn ich den gesamten verfügbaren Speicher eines einzelnen fehlerhaften Programms verbrauche?

Experiment zu Hause *!

Öffnen Sie ein Terminal, starten Sie python und wenn Sie numpy installiert haben, versuchen Sie Folgendes:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Warnung: Kann nachteilige Auswirkungen haben. Überwachen Sie den Prozess mit iotop oder top, um ihn rechtzeitig zu beenden. Wenn nicht, sehen wir uns nach dem Neustart.

32
Hooked

Mit der integrierten Shell ulimit können Sie Ressourcen einschränken. Verwenden Sie in Ihrem Fall ulimit -v, um die Speichernutzung in der Shell (und ihren untergeordneten Elementen) zu begrenzen.

Demonstration, die ein Speicherlimit von 100 MB (100000 KB) festlegt:

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Mit ps uww -C script-name-here wird festgestellt, dass python mindestens 29 MB Speicher benötigt (VSZ-Spalte). Das RSS-Limit wächst, da Ihr python -Skript mehr Speicher benötigt. Passen Sie diese Spalte an.

20
Lekensteyn

Mit Cgroups können Sie die Speichernutzung pro Prozess begrenzen.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Wissenschaftliches Rechnen ist bekanntermaßen speicherintensiv. Durch das Sandboxen Ihrer App in einer C-Gruppe sollten die übrigen Prozesse nicht zum Opfer fallen, da der Speicherdruck verringert wird.

Alternativ könnte ein VM als eine Art harte Grenze verwendet werden, da die App nur den an die virtuelle Maschine delegierten Speicher verwenden kann, natürlich auf Kosten der Leistung. Ein VM ist jedoch viel einfacher für Nichtinitiierte zu konfigurieren als das Einrichten und Verwalten einer C-Gruppe.

Entscheidungen Entscheidungen :) Viel Glück!

12
ppetraki