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

32

Ich benutze meinen Computer für die wissenschaftliche Programmierung. Es hat eine gesunde 8GBRAM und 12GBSwap Space. Da meine Probleme immer größer werden, ü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-F2wo kann ich den Prozess der Beleidigung töten.

Wie kann ich verhindern, dass Ubuntu durch Thrashing abstürzt, wenn ich den gesamten verfügbaren Speicher eines einzelnen fehlerhaften Programms verbrauche, da meine eigene Dummheit in diesem Forum nicht vorkommt ?

Experiment zu Hause *!

Öffnen Sie ein Terminal, starten pythonSie es numpyund versuchen Sie es , wenn Sie es installiert haben:

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

* Warnung: kann nachteilige Auswirkungen haben, überwachen Sie den Prozess über iotopoder toptöten Sie ihn rechtzeitig ab. Wenn nicht, sehen wir uns nach dem Neustart.

Süchtig
quelle

Antworten:

21

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

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

Die Verwendung von ps uww -C script-name-herePython erfordert mindestens 29 MB Speicher (VSZ-Spalte). Das RSS-Limit steigt, da Ihr Python-Skript mehr Speicher benötigt. Passen Sie diese Spalte an.

Lekensteyn
quelle
1
Schade, dass wir nicht wissen, wie die eigentliche App aussieht. Das gezeigte ulimit wirkt sich auf alle Prozesse aus, die Kinder dieser Shell sind. Wir wissen nicht einmal, ob es als Daemon ausgeführt wird oder ob es viele Kinder hat, die die Dinge weiter erschweren würden. Siehe coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki
1
Gibt es kein benutzerfreundliches Frontend für ulimit und cgroups ? Wenn das Betriebssystem unter Windows fast keinen RAM mehr hat, konnte ich durch ein Popup-Fenster immer ein Einfrieren des Systems vermeiden. Muss ich in Ubuntu die Speichernutzung ständig im Auge behalten?
Dan Dascalescu
1
@DanDascalescu Wenn Sie eine Auslagerungsdatei konfiguriert haben, treten längere Verzögerungen auf, Sie können jedoch weiterhin arbeiten. Sobald Sie feststellen, dass der Austausch beginnt, können Sie den Systemmonitor auf RAM-Auslastung überprüfen. Sollte Ihrem System wirklich der Speicher ausgehen, wird der OOM-Killer (Out-of-Memory) aufgerufen, der einen Prozess mit der höchsten "Badness" -Bewertung (normalerweise der Prozess, der den meisten Speicher verbraucht) beendet.
Lekensteyn
12

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 eine VM als eine Art harte Grenze verwendet werden, da die App den an die virtuelle Maschine delegierten Speicher nur auf Kosten der Leistung nutzen kann. Die Konfiguration einer VM für Nichtinitiierte ist jedoch viel einfacher als das Einrichten und Verwalten einer cgroup.

Entscheidungen Entscheidungen :) Viel Glück!

ppetraki
quelle
1
Gibt es kein benutzerfreundliches Frontend für ulimit und cgroups? Wenn das Betriebssystem unter Windows fast keinen RAM mehr hat, konnte ich durch ein Popup-Fenster immer ein Einfrieren des Systems vermeiden. Muss ich in Ubuntu die Speichernutzung immer im Auge behalten?
Dan Dascalescu
Nee. Auch Ihr Betriebssystem sollte nicht einfrieren, das ist ein separates Problem. Das Pop-up-Fenster ist zunächst nur ein Bandaid. Wenn Sie eine Menge Speicher verwenden, sollten Sie vielleicht untersuchen, warum? Zum Beispiel können moderne Browser mit ihrem Sanboxing leicht 70-150 MB PRO TAB verbrauchen. Durch Deaktivieren oder Optimieren kann ein beträchtlicher Speicher freigegeben werden, der von einem Endbenutzer regelmäßig verwendet wird. Scheduler sollten selten verwendete Programme auslagern, um Speicherplatz zu sparen. Wenn sie jedoch mehr aufwachen, als sie sollten, müssen Sie sie reparieren, oder wenn Ihre primäre Aufgabe speicherintensiv ist (Web), wird mehr RAM benötigt.
ppetraki
8
Ich weiß, was den Speicher verbraucht - Chrome. Das Betriebssystem sollte seine Stabilität jedoch vor Anwendungen schützen, die dennoch Amok laufen.
Dan Dascalescu
1
Ich verstehe, woher Sie als Benutzer kommen. Was Sie jedoch verlangen, bedeutet, eine allgemeine Computerplattform in eine Appliance zu verwandeln. Als die am wenigsten komplexe (fehleranfällige) Methode, die ein Betriebssystemingenieur implementieren muss, um diese Sicherheitsvorkehrungen zu treffen, müssen dramatisch fundierte Entscheidungen darüber getroffen werden, wie der gesamte Computer ausgeführt wird. Dies geht in der Regel zu Lasten der Flexibilität des Endbenutzers. Beispiele dafür sehen Sie im Tablet-Computing. Bei Desktops bleibt die Flexibilität jedoch erhalten.
ppetraki