Ab +22,04 LTS

Ab +22,04 LTS

Manchmal arbeite ich mit riesigen Datendumps, die ich zur Verarbeitung im Speicher behalten möchte. Manchmal berechne ich die Speichermenge, die mein Programm produzieren wird, falsch, oder ein Debugger multipliziert die Speichernutzung mit einem Faktor, der meinen verfügbaren Speicher übersteigt.

Wenn ich einen speicherhungrigen Prozess starte, erwarte ich von einem vernünftigen Betriebssystem Folgendes: Er versucht, den gesamten freien Speicher aufzubrauchen, fordert dann einige andere, nicht unbedingt erforderliche Prozesse freundlich auf, etwas Speicher freizugeben, den sie nicht benötigen, und schreibt dann in den Swap-Speicher.

Folgendes macht Ubuntu für mich: Es verbraucht den gesamten freien Speicher, fordert das Betriebssystem dann auf, alle wichtigen Dienste (Gnome-Sitzung, Terminal, Tastatur) auszutauschen, friert dann ein und wartet, bis ich den Netzstecker ziehe.

Zwei Fragen:

  1. Wie kann ein Betriebssystem davon ausgehen, dass etwas so wichtig sein könnte, dass es in Ordnung wäre, das Abhören der Benutzereingaben einzustellen?
  2. Wie kann ich Ubuntu anweisen, niemals wichtige Dienste auszutauschen und immer auf Benutzereingaben zu reagieren, selbst wenn ein dummer Prozess versucht, mehr Ressourcen zu verbrauchen, als das System bereitstellt?

Antwort1

Ich habe noch keine Lösung für das Problem, kann aber zwei Workarounds anbieten, die für andere interessant sein könnten:

1)frühmorgens

Dabei handelt es sich um einen Dienst, der die Speichernutzung überwacht und den Prozess beendet, der den meisten Speicher verbraucht, wenn ein bestimmter Schwellenwert erreicht ist (siehe auchDasUndDasFrage zum OOM-Killer im Linux-Kernel)

Ich habe es mit einem Demoprozess getestet, der auf unbestimmte Zeit Speicher in kleinen Stücken anfordert. Hier ist mein erster Eindruck: Wenn ich den Rogue-Prozess starte, frisst er schnell meinen gesamten RAM auf. Dann beginnt das Swapping, das System reagiert nicht mehr. Ein paar Sekunden später ist das System wieder online. Das Protokoll von earlyoom zeigt, dass es den Speicher fressenden Prozess beendet hat, nachdem sowohl die Speicher- als auch die Swap-Nutzung 90 % erreicht hatten.

Es gibt zwar immer noch die lästige Verzögerung, wenn mit dem Swapping begonnen wird und nachdem der Prozess beendet wurde, verbleiben einige Teile anderer Prozesse normalerweise im Swapping, bis sie angefordert werden, aber es ist ein Anfang.

2) einfach Swap deaktivieren

Ich weiß, das ist einkontroverses Thema, aber für Desktop-Systeme und insbesondere Entwicklungsmaschinen, bei denen es von Zeit zu Zeit passieren kann, dass ein Prozess versucht, den gesamten Speicher aufzubrauchen, macht es Sinn: Ohne Swap funktioniert der OOM-Killer einfach wie vorgesehen. Wenn der Speicher knapp wird, findet er denbester Prozess zum Tötenund beseitigt es. Keine Verzögerung, keine Verzögerung.

Sie können den Swap für die aktuelle Sitzung mit sudo swapoff -aoder deaktivieren.Machen Sie die Änderung dauerhaft.


Die richtige Lösung des Problems wäre natürlich, dass das System auch dann noch reagiert, wenn der Hauptspeicher erschöpft ist, und dass es anfängt, Speicher auszulagern, als gäbe es kein Morgen. Doch das scheint in naher Zukunft nicht zu passieren.

Antwort2

Ab +22,04 LTS

Es gibt einen Dienst namens systemd-oomd, der die Speichernutzung automatisch überwacht und versucht, Prozesse zu beenden, wenn nicht genügend Speicher vorhanden ist. Er ist standardmäßig als Teil von systemd installiert. Um den aktuellen Status anzuzeigen, geben Sie ein oomctl. Beispielausgabe:

Dry Run: no
Swap Used Limit: 90.00%
Default Memory Pressure Limit: 60.00%
Default Memory Pressure Duration: 20s
System Context:
        Memory: Used: 4.1G Total: 15.5G
        Swap: Used: 1.0G Total: 3.9G
Swap Monitored CGroups:
        Path: /
                Swap Usage: (see System Context)
Memory Pressure Monitored CGroups:
        Path: /user.slice/user-1000.slice/[email protected]
                Memory Pressure Limit: 50.00%
                Pressure: Avg10: 0.00 Avg60: 0.02 Avg300: 0.00 Total: 9s
                Current Memory Usage: 3.9G
                Memory Min: 0B
                Memory Low: 0B
                Pgscan: 23663084
                Last Pgscan: 23663084

Standardmäßig wird mit der Rückgewinnung bei 90 % Auslastung von Speicher und Swap begonnen. Dabei wird Speicherdruck auf Benutzer-Slices-Kontrollgruppen ausgeübt (d. h.[email geschützt]), wo die meisten Anwendungen erscheinen, aber nicht in der Kontrollgruppe system.slice, die die wichtigsten Komponenten des Systems wie NetworkManager und Gnome Display Manager erzeugt. Kurz gesagt, oomd gibt Benutzerprozesse vor Systemprozessen frei. Um die aktuelle Konfiguration von systemd-oomd anzuzeigen, geben Sie Folgendes ein:

systemd-analyze cat-config systemd/oomd.conf

Beziehen aufdiese Seitefür eine Referenz, was sie tun. Um die OOM-Parameter einer bestimmten systemd-Einheit zu bearbeiten, fügen Sie die angegebenen Variablen hinzu oder bearbeiten Sie sieHierin der Unit-Datei.

Antwort3

Versuchen Sie eines von zwei Dingen:

1) Ändern Sie die Swappiness-Einstellung von der Standardeinstellung 60 auf 10.dh: hinzufügenvm.swappiness = 10zu /etc/sysctl.conf(Geben Sie im Terminal ein sudo gedit /etc/sysctl.conf) und starten Sie dann das System neu. Suchen Sie hier nach „swappiness“, um weitere Informationen dazu zu erhalten.

2) Wenn der Swappiness-Vorgang nicht hilft (auch wenn Sie das vielleicht nicht möchten), erhöhen Sie die Größe Ihrer Swap-Datei auf 1,5 x 16 G und prüfen Sie, ob das hilft.

Halte mich auf dem Laufenden. Grüße, Al

verwandte Informationen