Ist es möglich, dem Speicherverbrauch von Prozessen eine weiche Grenze aufzuerlegen?

10

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, ulimitbevor 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 SIGSTOPped, 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?

links herum
quelle
2
Sie können die von einem Prozess oder einer Gruppe von Prozessen verwendete RAM-Größe mithilfe von cgroups begrenzen. stackoverflow.com/questions/3043709/…
Mark Plotnick
2
Dies ist buchstäblich genau das, wofür es ulimitist.
DopeGhoti
1
Ulimit -m wäre die zu verwendende Sache, außer dass es seit 2.4.30 nicht mehr unter Linux funktioniert hat und nur in bestimmten Situationen zuvor funktioniert hat. unix.stackexchange.com/questions/129587/…
Mark Plotnick
niceload --noswap yourprg
Ole Tange

Antworten:

6

niceload --noswap yourprg ist genau für diese Situation gemacht: Es geht um die Austauschaktivität:

  • Beim Auswechseln: Prozess laufen lassen
  • Beim Eintauschen: Prozess laufen lassen
  • Beim Ein- und Auswechseln: Unterbrechen Sie den Vorgang, bis der Austausch beendet ist, und setzen Sie den Vorgang fort, wenn der Austausch beendet wurde

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 yourprgfunktioniert ähnlich: Wenn weniger als 1 GB frei sind, wird youprg ausgesetzt. Wenn mehr als 1 GB frei sind, wird Ihr PRG fortgesetzt.

Ole Tange
quelle
0

Ja. Mit praktisch jeder modernen Schale ist das ganz einfach.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Sie können die -lOption für gesperrte Speichergrenzen verwenden. Ihr Prozess wird signalisiert, wenn das Limit überschritten wird.

mikeserv
quelle
-1

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.

D. Zou
quelle
Hm. Interessanter Vorschlag, obwohl ich befürchte, dass er für die meisten Probleme, die ich habe, nichts bewirkt. Mein Hauptproblem sind einzelne Prozesse (wissenschaftliche Anwendungen), die schnell viele Gigabyte Speicher zuweisen können.
links um den
Das Löschen von Caches führt normalerweise zu Leistungsproblemen. Sehr gelegentlich lösen sie Leistungsprobleme. Sie werden jedoch nicht dazu führen, dass Speicher verfügbar wird, wenn er nicht vorhanden ist.
Gilles 'SO - hör auf böse zu sein'