Verhindern Sie, dass Ubuntu einfriert, auch wenn der Systemspeicher niedrig ist

24

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

Wann immer ich einen speicherhungrigen Prozess starte, ist dies das, was ich von einem vernünftigen Betriebssystem erwarte: Versuchen Sie, den gesamten freien Speicher zu verbrauchen, und bitten Sie dann einige andere nicht wesentliche Prozesse, den nicht benötigten Speicher aufzugeben schreibe um zu tauschen.

Hier ist, was Ubuntu für mich tut: Essen Sie den gesamten freien Speicher, und bitten Sie das Betriebssystem, alle wichtigen Dienste (Gnome-Sitzung, Terminal, Tastatur) auszutauschen. Frieren Sie dann ein und warten Sie, bis ich den Netzstecker gezogen habe.

Zwei Fragen:

  1. Wie kann ein Betriebssystem annehmen, dass irgendetwas so wichtig sein könnte, dass es in Ordnung ist, keine Benutzereingaben mehr abzuhören?
  2. Wie kann ich Ubuntu anweisen, niemals wichtige Dienste auszutauschen und immer auf Benutzereingaben zu reagieren, selbst wenn ein dummer Prozess versucht, mehr Ressourcen aufzuzehren, als das System bereitstellt?
Klamann
quelle
Wie viel RAM haben Sie installiert? Wie groß ist Ihr Swap (im Terminal geben Sie ein, swaponum dies herauszufinden)? Cheers, Al
heynnema
3
16 GB RAM und 16 GB Swap. Aber das ist hier nicht der Punkt, dieses Problem kann nicht durch Hinzufügen von mehr Speicher gelöst werden.
Klamann
1
Versuchen Sie eines von zwei Dingen. 1) Ändern Sie die swappinessEinstellung auf 10, dh vm.swappiness = 10in /etc/sysctl.conf. Suchen Sie hier nach swappiness, um weitere Informationen zu erhalten. 2) Wenn swappiness nicht hilft ... Auch wenn Sie vielleicht nicht möchten ... vergrößern Sie Ihre Swap-Datei auf 1,5x16G und prüfen Sie, ob dies hilft. Halte mich auf dem Laufenden. Cheers, Al
heynnema
1
@Klamann Ich bin damit einverstanden, dass das Hinzufügen von mehr Swap das Problem nicht behebt. Sobald Sie ein kaputtes Programm haben, das den gesamten RAM + SWAP verbraucht, verzögert das Hinzufügen von zusätzlichem SWAP nur das Unvermeidliche.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix muss, wie gesagt, vm.swappiness=10zu sysctl.conf HINZUGEFÜGT werden. Eine erfahrene Person könnte sogar den Befehl sysctl im laufenden Betrieb verwenden, um vm.swappiness = 10 festzulegen, ohne die Datei sysctl.conf zu bearbeiten. Prost, Al ps: Warten auf die Antwort des OP.
Heynnema

Antworten:

5

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

1) frühes Zimmer

Dies ist ein Dienst, der die Speichernutzung überwacht und den Prozess beendet, der den meisten Speicher verbraucht, wenn ein bestimmter Schwellenwert erreicht ist (siehe auch diese und diese Frage zum OOM-Killer im Linux-Kernel).

Ich habe es mit einem Demo-Prozess getestet, der unbegrenzt Speicher in kleinen Blöcken anfordert. Hier ist mein erster Eindruck: Wenn ich den Rogue-Prozess starte, wird mein gesamter RAM schnell aufgebraucht. Sobald der Austausch beginnt, reagiert das System nicht mehr. Einige Sekunden später ist das System wieder online. Das Protokoll von earlyoom zeigt, dass es den Speicherfressprozess beendet hat, nachdem sowohl die Speicher- als auch die Auslagerungsnutzung 90% erreicht hatten.

Es gibt immer noch die lästige Verzögerung, wenn der Austausch beginnt und nachdem der Prozess beendet wurde, bleiben einige Teile anderer Prozesse normalerweise im Austausch, bis sie angefordert werden, aber es ist ein Anfang.

2) einfach Swap deaktivieren

Ich weiß, dass dies ein umstrittenes Thema ist , aber für Desktop-Systeme und insbesondere für Entwicklungsmaschinen, bei denen es gelegentlich vorkommen kann, dass ein Prozess versucht, Ihren gesamten Speicher zu verschlingen, ist es sinnvoll: Ohne Swap funktioniert der OOM-Killer einfach wie beabsichtigt. Wenn Ihnen der Speicher ausgeht, findet er den besten Prozess zum Beenden und entfernt ihn. Keine Verzögerung, keine Verzögerung.

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


Die richtige Lösung für das Problem wäre natürlich, dass das System reagiert, wenn der Hauptspeicher erschöpft ist und es beginnt, den Speicher auszutauschen, als gäbe es kein Morgen, aber das scheint nicht in Kürze zu geschehen.

Klamann
quelle
1
Ich habe Swap deaktiviert und mein System wechselt direkt vom niedrigen Arbeitsspeicher (<100 MB) zum Einfrieren. Woran erkenne ich, ob der OOM-Killer aktiviert ist?
Michael
0

Versuchen Sie eines von zwei Dingen:

1) Ändern Sie die Swappiness-Einstellung von der Standardeinstellung 60 auf 10, dh: Fügen Sie vm.swappiness = 10 zu /etc/sysctl.conf hinzu (geben Sie im Terminal Folgendes einsudo gedit /etc/sysctl.conf ), und starten Sie das System neu. Suchen Sie hier nach swappiness, um weitere Informationen zu erhalten.

2) Wenn swappiness nicht hilft, obwohl Sie vielleicht nicht möchten, vergrößern Sie Ihre Swap-Datei auf 1,5x16G und prüfen Sie, ob dies hilft.

Halte mich auf dem Laufenden. Prost, Al

Heynnema
quelle
Ich habe eine VM eingerichtet, um einige Tests durchzuführen, da das Neustarten meines Betriebssystems alle paar Sekunden sehr ärgerlich wurde. Ubuntu 16.04, 2 GB RAM, 3 GB Swap, 20 GB Festplatte. Dann habe ich ein Skript ausgeführt, das viel Speicher verbraucht: Mit der Standardeinstellung swappiness (60) friert das System ein und nach ein paar Minuten habe ich es heruntergefahren, weil die Zeit für die Wiederherstellung nicht akzeptabel war. Mit swappiness 10 friert das System einige Sekunden lang ein und akzeptiert dann Eingaben, aber Sie können keine Prozesse starten (z. B. topum das Memory-Schwein zu töten). Nach ungefähr einer Minute wird der Prozess abgebrochen. Nicht perfekt, aber wir kommen näher.
Klamann
Halten uns auf dem Laufenden. Die VM emuliert Ihr echtes Betriebssystem nicht wirklich, aber Sie können mit den Einstellungen spielen. Ich bin gespannt, ob Swappiness bei Ihrem Problem hilft. Prost, Al
Heynnema
Ah gut. Fortschritt! Lesen Sie ein wenig über Swappiness. Sie können ein wenig mit dem Wert spielen. Cheers, Al
heynnema
Wie viel Swap wurde verwendet, als das System einfror? Cheers, Al
heynnema
2
Warum, worum geht es dabei? Mehr Speicher verhindert nicht, dass das System hängen bleibt, wenn ich diesen Speicher ebenfalls aufnehme.
Klamann
0

Ich habe ein ähnliches Problem gelöst. Ich weiß nicht, ob meine Erfahrung zu Ihnen passt ...

Kürzlich habe ich eine Anleitung veröffentlicht, wie man Linux auf Loopback-LVM-Geräten installiert, die von USB booten (also ohne grub auf der internen Festplatte installieren zu müssen und es als Original zu belassen). Hier ist die Anleitung: https://github.com/DareDevil73/linux-on-loopback-usb .

Dann fiel ich in das Einfrierproblem bei hoher Speicherauslastung und stellte eine abnormale Auslastung des Auslagerungsspeichers fest (der gesamte Arbeitsspeicher wurde verbraucht und die Auslagerungsauslastung lag nahe bei Null). Offensichtlich war die LVM-Swap-Partition aktiviert und funktionierte ordnungsgemäß, aber ich wusste nicht, warum der Kernel sie nicht erwartungsgemäß verwendete.

Ich habe eine alternative Lösung ausprobiert. Ich habe eine Swap-Loopback-Datei (nicht LVM) erstellt und das Einfrieren ist weg. Jetzt wird die Auslagerungsdatei wie gewohnt verwendet und das Betriebssystem friert nie ein!

Weitere Informationen finden Sie unter https://github.com/DareDevil73/linux-on-loopback-usb#known-issues .

Antonio Petricca
quelle
Bitte erweitern Sie die Links zu Antworten.
Konrad Gajewski