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:
- Wie kann ein Betriebssystem annehmen, dass irgendetwas so wichtig sein könnte, dass es in Ordnung ist, keine Benutzereingaben mehr abzuhören?
- 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?
swapon
um dies herauszufinden)? Cheers, Alswappiness
Einstellung auf 10, dhvm.swappiness = 10
in /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, Alvm.swappiness=10
zu 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.Antworten:
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 -a
oder 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.
quelle
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 ein
sudo 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
quelle
top
um das Memory-Schwein zu töten). Nach ungefähr einer Minute wird der Prozess abgebrochen. Nicht perfekt, aber wir kommen näher.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 .
quelle