Marcel Mueller <
news.5...@spamgourmet.org>:
> Am 30.10.22 um 01:28 schrieb Andreas Kohlbach:
>> OOM scheint bei Mint schon länger Default deaktiviert zu sein.
>>
>>
>> Es passiert mir trotz meiner üppigen *hüstel* 8 GB RAM, dass
>> ein Programm (in der Regel einer der Browser, oder LibreOffice)
>> Amok läuft, dass zeitweise auch die Uhr in der GUI stehen
>> bleibt (zeigt hier auch Sekunden an, sodass das auffällt), oft
>> auch die Maus einfriert. Ich warte dann, um auf eine TTY zu
>> wechseln, top aufzurufen (was mitunter Minuten dauert, bis top
>> startet), und den Speicher-Hog abzuschießen.
>
> Interessant. Ich habe hier auch 8GB, sogar auf mehreren Kisten
> in der VM sogar nur 6GB, aber das ist noch nicht passiert. Außer
> in der VM bekomme ich den Speicher nicht annäherungsweise voll.
> Allerdings hatte ich an der Arbeit unter Win kürzlich mehrfach
> so ein Problem. Da waren innerhalb von 2 Tagen 38GB
> Speicherlast. Ich konnte den Schuldigen nicht identifizieren,
> aber Firefox war zumindest auf Verdächtigen-Liste. Sollte da
> eine matschige Version im Umlauf gewesen sein?
>
>
>> Da ich diesen Hog eh abschieße, könnte das eh gleich OOM machen. Das
>> Programm dazu heißt vermutlich choom (lese mich gerade ein).
>
> Ich glaube, das ist nur, um das Verhalten bei /laufenden/
> Prozessen zu ändern.
>
[OOM‐Killer]
> Außerdem ist das auch ein Kernel-Feature. Ich glaube gar nicht,
> dass man das abschalten kann, außer indem man Overcommit
> komplett deaktiviert, was unter x64 keine gute Idee ist.
Inwiefern ist, Overcommit abzuschalten, also
printf '%s\n' 'vm.overcommit_memory=2' | sysctl -p -
oder ein vergleichbares Kommando laufen zu lassen, bei X64 keine
gute Idee? Wenn Overcommit abgeschaltet ist, kann kein Prozess
mehr virtuellen Speicher anfordern, als das System noch frei
hat. Für Speicherfresser bedeutet das, dass gleich der
Systemaufruf, der den Speicher reserviert, scheitert und das
System gar nicht erst in einen Zustand gerät, in dem es den den
Prozessen versprochenen virtuellen Speicher nicht liefern kann,
weil es zuvor geschwindelt hat.
Ich halte das für besser als den Fall, dass der OOM‐Killer die
Runde machen muss und schauen, wen er per KILL‐Signal umbringt:
Ein Prozess kann auf einen scheiternden Systemaufruf zur
Speicherreservierung reagieren und Maßnahmen ergreifen: seine von
ihm angelegten Dateien in einen konsistenten Zustand bringen und
sich beenden.
Wenn ein Prozess hingegen ein KILL‐Signal erhält, kann er nicht
mehr reagieren. Sind seine Zustandsdateien zum Zeitpunkt des
Signalerhalts in inkonsistentem Zustand, bleiben sie es auch,
wenn der Prozess abgeschossen ist.
> Aber ich denke die mit Abstand sinnvollste Methode ist, die
> Größe des Swap auf sinnvolle Werte zu begrenzen. Bei Linux ist
> ein bisschen blöd, dass Swap auch für Hibernate herhalten muss.
> Dadurch kann man es nicht beliebig klein machen.
Mach den Swap so groß, wie du virtuellen Speicher brauchst
(beispielsweise genau so groß wie Hauptspeicher verbaut ist,
falls du willst, dass keine Swap‐Orgien auftreten können), und
stell dann das memory overcommit ratio auf 0:
printf '%s\n' 'vm.overcommit_ratio=0' | sysctl -p -
Dann zählt das System den Hauptspeicher nicht zum verfügbaren
Speicher dazu (verwendet ihn aber natürlich trotzdem) und gibt
deshalb nicht mehr Virtuellspeicher heraus als Swap vorhanden
ist. Auf diese Weise passt dann auch beim Winterschlaf
(hibernation) der ganze Virtuellspeicherinhalt in den Swap rein.