Wie kann eine Aktion unter Bedingungen mit wenig Speicher unter Linux ausgelöst werden?

7

Daher dachte ich, dies wäre ziemlich einfach zu finden: Ein Service- / Kernel-Modul, das, wenn der Kernel feststellt, dass der Speicher im Userland knapp wird, eine Aktion auslöst (z. B. das Speichern einer Prozessliste in eine Datei, das Pingen eines Netzwerkendpunkts usw.) ) innerhalb eines Prozesses, der über einen eigenen dedizierten Speicher verfügt (damit er nicht versagt () oder unter einem der anderen üblichen OOM-Probleme leidet).

Ich fand den OOM-Killer , von dem ich verstehe, dass er nützlich ist, der aber nicht wirklich das tut, was ich tun müsste.

Wenn mir der Speicher ausgeht, möchte ich im Idealfall wissen, warum. Ich nehme an, ich könnte mein eigenes Programm schreiben, das beim Start ausgeführt wird und eine feste Menge an Speicher verwendet, und dann erst dann etwas tun, wenn der Kernel über zu wenig Speicher informiert wird, aber das wirft seine eigene Frage auf ...

Gibt es überhaupt einen Systemaufruf, um über so etwas informiert zu werden? Eine Möglichkeit, dem Kernel zu sagen: "Hey, weck mich auf, wenn wir nur noch 128 MB Speicher haben."

Ich habe im Internet und hier gesucht, aber nichts gefunden, was zu dieser Beschreibung passt. Es scheint, als würden die meisten Leute die Abfrage zeitverzögert verwenden, aber das offensichtliche Problem dabei ist, dass es weniger wahrscheinlich ist, dass Sie wissen, welche Prozesse das Problem verursacht haben.

Parthian Shot
quelle
Frage: Haben Sie Fernüberwachungsprodukte wie Nagios, LogicMonitor usw. evaluiert? Dies ist die Art von Dingen, für die solche Produkte in den meisten Umgebungen normalerweise gut sind.
Spooler
Ja. Wir haben Nagios. Wir fragen den Speicher in Intervallen von 10 Minuten ab. Das Problem ist manchmal, dass ein Prozess sehr schnell in die Höhe schnellen kann - sogar in nur ein oder zwei Minuten - und es schwierig ist, eine Obduktion durchzuführen, wenn dies geschieht, da sich auf diesen Systemen viele bewegliche Teile befinden.
Parthian Shot
Sicher, und Sie möchten Ihre Maschinen nicht zu Tode überwachen. Das einzige Werkzeug, das ich für diese Art der Auflösung verwendet habe, ist sar, und das kann Ihnen helfen, eine Obduktion durchzuführen. Die kontinuierliche Berichterstattung über diese lokal generierten Daten wäre im Netzwerk jedoch ziemlich teuer. Planen Sie, die Daten lokal (oder über NFS) ähnlich wie kdump zu halten?
Spooler
Halten Sie es vorerst lokal. Wir haben die Protokollierung und Überwachung zentralisiert, aber Informationen mit einer feinen Granularität sind nur dann erforderlich, wenn ein bestimmtes Problem mit einem einzelnen System auftritt. Wir würden uns also sowieso nur anmelden und in diesem System herumstöbern.
Parthian Shot
Ist auch sarziemlich cool. Danke für die Empfehlung. Neigen dazu , sie zu verwenden htopoder regelmäßig zu verwenden top, obwohl sie an einem guten Tag ressourcenhungrig sind, also ... vielleicht nicht das beste Werkzeug für den Job. : P
Parthian Shot

Antworten:

7

Was Sie fragen, ist im Grunde ein kernelbasierter Rückruf bei einem Zustand mit wenig Arbeitsspeicher, oder? Wenn ja, glaube ich, dass der Kernel nicht nicht solchen Mechanismus schaffen, und das aus gutem Grund: wenig Speicher zu sein, sollte es sofort das einzige , was ausführen , die etwas Speicher freigeben können - die OOM Killer. Alle anderen Programme können die Maschine zum Stillstand bringen.

Auf jeden Fall können Sie eine einfache Überwachungslösung im Benutzerbereich ausführen. Ich hatte in der Vergangenheit die gleichen Debug- / Aktionsanforderungen für wenig Speicher und schrieb eine einfache Bash, die Folgendes tat:

  • Überwachung auf ein weiches Wasserzeichen: Wenn die Speichernutzung über diesem Schwellenwert liegt, sammeln Sie einige Statistiken (Prozesse, freier / verwendeter Speicher usw.) und senden Sie eine Warn-E-Mail.

  • Überwachung auf ein hartes Wasserzeichen: Wenn die Speichernutzung über diesem Schwellenwert liegt, sammeln Sie einige Statistiken und beenden Sie die speicherhungrigen (oder weniger wichtigen) Prozesse. Senden Sie dann eine Warn-E-Mail.

Ein solches Skript wäre sehr leicht und kann die Maschine in kleinen Intervallen (dh 15 Sekunden) abfragen.


quelle
9

Ja, der Linux-Kernel bietet hierfür einen Mechanismus: Speicherdruckbenachrichtigung . Dies ist in https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt , Abschnitt Speicherdruck, dokumentiert .

Kurz gesagt, Sie registrieren einen eventfd-Dateideskriptor, in /sys/fs/cgroup/memory/memory.pressure_leveldem Sie Benachrichtigungen erhalten möchten. Diese Meldungen können sein low, mediumoder critical. Ein typischer Anwendungsfall besteht darin, einige oder alle internen Caches in Ihrem Prozess freizugeben, wenn Sie eine Benachrichtigung erhalten, um einen bevorstehenden OOM-Kill zu verhindern.

Niksnut
quelle