Ja, der Linux-Kernel bietet dafür einen Mechanismus:Memory Pressure Notification . Dies ist dokumentiert in https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt, Abschnitt Memory Pressure .
Kurz gesagt, Sie registrieren einen eventfd-Dateideskriptor in /sys/fs/cgroup/memory/memory.pressure_level
auf dem Sie Benachrichtigungen erhalten möchten. Diese Benachrichtigungen können low
sein , medium
, oder critical
. Ein typischer Anwendungsfall wäre, einige oder alle internen Caches in Ihrem Prozess freizugeben, wenn Sie eine Benachrichtigung erhalten, um einen bevorstehenden OOM-Kill zu verhindern.
Was Sie fragen, ist im Grunde ein Kernel-basierter Rückruf bei einer Bedingung mit wenig Arbeitsspeicher, richtig? Wenn dem so ist, glaube ich fest daran, dass der Kernel dies nicht tut einen solchen Mechanismus bereitzustellen, und das aus gutem Grund: Da der Speicher knapp ist, sollte es sofort das einzige ausführen, das etwas Speicher freigeben kann - den OOM-Killer. Alle anderen Programme können die Maschine zum Stillstand bringen.
Wie auch immer, Sie können eine einfache Überwachungslösung im Userspace ausführen. Ich hatte in der Vergangenheit die gleiche Debug-/Aktionsanforderung für wenig Arbeitsspeicher und schrieb eine einfache Bash, die Folgendes tat:
-
Achten Sie 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;
-
Achten Sie auf ein hartes Wasserzeichen: Wenn die Speichernutzung über diesem Schwellenwert liegt, sammeln Sie einige Statistiken und beenden Sie die speicherintensiveren (oder weniger wichtigen) Prozesse und senden Sie dann eine Warn-E-Mail.
Ein solches Skript wäre sehr leicht und kann die Maschine in kleinen Intervallen abfragen (zB:15 Sekunden)