Ich denke, es ist kein so ungewöhnliches Problem: Ein Prozess weist enorme Mengen an Speicher zu (sei es aufgrund eines Speicherverlust-Fehlers, weil Sie versuchen, eine unglaublich große Eingabedatei zu verarbeiten, oder was auch immer). Der RAM füllt sich und irgendwann muss Linux auf Swap umstellen. Nun, manchmal ist dies nur der letzte Ausweg: Wenn ich eine teure Berechnung habe, möchte ich keine Daten verlieren, wenn mir gegen Ende der Arbeitsspeicher ausgeht.
Eher jedoch (meiner Erfahrung nach) ist der Speicherverbrauch jedoch unbegrenzt, und zwar durch einen betrügerischen, möglicherweise fehlerhaften Prozess. Das heißt, ich habe nicht nur weniger dringend benötigte Daten, die zum Auslagern verschoben werden, sondern das Betriebssystem ist gezwungen, viele Daten in Panik auszutauschen. Und das unterbricht leider nicht nur den störenden Prozess erheblich, sondern kann das gesamte System fast zum Stillstand bringen (auf Computern mit SSD ist es nicht mehr ganz so schlimm, aber OTOH macht mir Sorgen, ob das Schreiben von Gigabyte und Gigabyte Mülldaten möglich ist die Langzeitschäden der Blitzzellen).
Bis ich das Problem bemerke und den Prozess manuell abbreche (nachdem es tatsächlich Minuten gedauert hat, bis ich mich überhaupt in ein virtuelles Terminal eingeloggt habe!), Ist die Hälfte meiner laufenden Sitzung im Austausch, und ich muss eine Weile warten, bis das System reibungslos läuft nochmal.
Es gibt eine drakonische Lösung für das Problem: Erzwingen eines Speicherlimits. Aber dies systemweit zu tun, würde manchmal Prozesse beenden, die ich lieber noch brauche, und wenn ich manuell muss, ulimit
bevor ich einen beleidigenden Prozess starte ... nun, ich werde oft vergessen, bis es zu spät ist.
Mögliche Arten von Lösungen, mit denen ich zufriedener wäre:
- Wenn ein Prozess eine bestimmte Speichernutzung überschreitet, wird er künstlich gedrosselt, damit der Rest des Systems reagiert.
- Wenn ein Prozess eine bestimmte Speichernutzung überschreitet, ist er
SIGSTOP
ped, sodass ich Zeit habe, um herauszufinden, was als nächstes zu tun ist. - Wenn sich ein Prozess dem RAM-Limit nähert, erhalte ich eine Warnung, bevor der große Austausch beginnt.
Gibt es eine Möglichkeit, ein solches Verhalten oder ähnliches zu erreichen?
ulimit
ist.Antworten:
niceload --noswap yourprg ist genau für diese Situation gemacht: Es geht um die Austauschaktivität:
Der Prozess wird nicht vor Beginn des Austauschs angehalten, sondern der Austausch wird 1 Sekunde lang ausgeführt, bevor er ausgeführt wird.
niceload --mem 1G yourprg
funktioniert ähnlich: Wenn weniger als 1 GB frei sind, wird youprg ausgesetzt. Wenn mehr als 1 GB frei sind, wird Ihr PRG fortgesetzt.quelle
Ja. Mit praktisch jeder modernen Schale ist das ganz einfach.
Sie können die
-l
Option für gesperrte Speichergrenzen verwenden. Ihr Prozess wird signalisiert, wenn das Limit überschritten wird.quelle
Cronjob zum Löschen des Caches: So löschen Sie den Speichercache unter Linux
Ich habe tatsächlich ähnliche Probleme. Ich habe eine Reihe von Benutzern, die ihre eigenen benutzerdefinierten Skripte ausführen und von Zeit zu Zeit verbrauchen ihre Skripte den gesamten verfügbaren Speicher und bringen den Redhat-Server zum Erliegen. Der Grund für den Massenverbrauch an RAM war, dass ihre Skripte tagelang ausgeführt werden können und nur auf ein Ereignis warten, wodurch Ressourcen beansprucht werden, wenn in Wirklichkeit keine verwendet werden. Also habe ich einfach den Cache mit einem Cronjob erzwungen und seitdem kein Problem mehr gehabt.
Einfach und faul.
quelle