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.
quelle
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?sar
ziemlich cool. Danke für die Empfehlung. Neigen dazu , sie zu verwendenhtop
oder regelmäßig zu verwendentop
, obwohl sie an einem guten Tag ressourcenhungrig sind, also ... vielleicht nicht das beste Werkzeug für den Job. : PAntworten:
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
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_level
dem Sie Benachrichtigungen erhalten möchten. Diese Meldungen können seinlow
,medium
odercritical
. 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.quelle