Warum läuft kswapd0 auf einem Computer ohne Swap?

21

Ich habe einen Cloud-Server mit ~ 14G RAM und kein Swap. Allerdings sehe ich gelegentlich, dass kswapd0 beim Ausführen etwas CPU beansprucht top. Warum würde kswapd0 überhaupt laufen, wenn es keinen Swap-Platz für die Verwaltung gibt?

Thomas Johnson
quelle

Antworten:

8

Es muss noch geprüft werden, ob es einen Swap gibt. Um es zu reduzieren, müssen Sie Ihre Swapiness einstellen -

bearbeite "/etc/sysctl.conf" als root, ändere (oder füge hinzu)

vm.swappiness = 0
Elliott Frisch
quelle
3
Ok, aber warum nutzt es 1% meiner CPU?
portforwardpodcast
2
Wenn kswapd0eine CPU belegt ist und Sie keinen Swap haben, hat das System fast keinen RAM mehr und versucht, mit der Situation umzugehen, indem (in der Praxis) Seiten von ausführbaren Dateien ausgetauscht werden. Die richtige Lösung besteht darin, die Arbeitslast zu reduzieren, den Swap hinzuzufügen oder (vorzugsweise) mehr RAM zu installieren. Durch das Hinzufügen von Swap wird die Leistung verbessert, da der Kernel mehr Optionen für das Auslagern auf die Festplatte hat. Ohne Swap ist der Kernel praktisch gezwungen, den Anwendungscode zu tauschen.
Mikko Rantalainen
Wenn Sie Swap aktiviert haben und kswapd0eine CPU verwenden und dies nicht möchten, verringern Sie die swappinessEinstellung. Sofern Ihr Swap nicht durch eine schreibgeschützte SSD (z. B. ein Algorithmus für eine schlechte Abnutzungskorrektur) gesichert ist, swappinesswird die Gesamtleistung des Systems durch Verringern der verringert. Die Idee ist, eine Kopie des RAM im Swap zu behalten, falls mehr RAM benötigt wird. In diesem Fall wird die Kopie im RAM sofort weggeworfen, anstatt sie auszutauschen, bevor der RAM verwendet werden kann. Dieses optimistische Auswechseln wird nur durchgeführt, wenn das System nicht aktiv genug ist, sodass es Ihr System niemals verlangsamen sollte.
Mikko Rantalainen
26

Swap Space wird nur für Daten verwendet, die von keiner anderen Datei gesichert werden. Daten, die von anderen Dateien auf der Festplatte (wie z. B. ausführbaren Programmen) zugeordnet wurden, werden auch dann in die entsprechenden Dateien übertragen, wenn Sie kein Auslagerungsgerät haben.

Psusi
quelle
9
Stellen Sie sich zum Beispiel einen Fall vor, in dem Sie keinen Swap haben und das System fast keinen RAM mehr hat. Der Kernel wird Speicher von zB Firefox nehmen (es kann dies tun , weil Firefox ausführbaren Code ausgeführt wird , die von der Festplatte geladen wurde - der Code von der Festplatte geladen wird wieder , wenn erforderlich). Wenn Firefox dann N Sekunden später erneut auf diesen Arbeitsspeicher zugreifen muss, generiert die CPU einen "harten Fehler", der Linux dazu zwingt, einen Teil des Arbeitsspeichers freizugeben (z. B. einen Teil des Arbeitsspeichers von einem anderen Prozess zu nehmen), die fehlenden Daten von der Festplatte zu laden und Firefox dann fortfahren zu lassen gewöhnlich. Dies ist ziemlich ähnlich zu normalem Tauschen und kswapd0 macht es.
Mikko Rantalainen
4

Es ist ein bekanntes Problem, dass Linux, wenn der Arbeitsspeicher knapp wird, in Swap-Schleifen eintreten kann, anstatt das zu tun, was es tun sollte, und Prozesse abbricht, um RAM freizugeben. Es gibt einen OOM-Killer (Out of Memory), der dies tut, aber nur, wenn Swap und RAM voll sind.

Dies sollte jedoch eigentlich kein Problem sein. Wenn es eine Reihe von problematischen Prozessen gibt, z. B. Firefox und Chrome, die jeweils Registerkarten verwenden und Speicher abrufen, führen diese Prozesse zu einem Auslagerungslesevorgang. Linux tritt dann in eine Schleife ein, in der derselbe Speicher zwischen Speicher und Festplatte hin und her verschoben wird. Dies wiederum führt zu einer Prioritätsumkehr, bei der das System durch das Hin- und Herwechseln einiger Prozesse nicht mehr reagiert.

Wenn Sie Swap deaktivieren, wird dieses Problem noch schlimmer, da kswapd0 jetzt keine andere Möglichkeit hat, als den zugeordneten Speicher, z. B. die ausführbaren Dateien, auszutauschen. Wenn Sie ausführbare Dateien auslagern, ist es sogar noch wahrscheinlicher, dass sie ziemlich schnell wieder eingelagert werden.

Ich habe versucht, dieses Verhalten in NetBSD zu Testzwecken auszulösen, und es ist passiert, dass der anstößige Prozess unglaublich langsam wurde, während das Betriebssystem selbst sehr reaktionsfähig war. Dies bedeutet, dass das Auslagerungsproblem auftritt, es jedoch keine Prioritätsumkehr gibt. Da NetBSD jedoch keine AMDGPU-Treiber hat, halte ich mich vorerst an Linux. Vielleicht kann NetBSD keine ausführbaren Dateien für die Speicherzuordnung speichern, weshalb es keine Swap-Schleifen eingibt, aber ich weiß nicht genug über die Implementierung, um zu sagen, warum es nicht mehr reagiert.

Facebook hatte dieses Problem ebenfalls und erstellte den OOMD, den Out Of Memory Daemon. Dies ist ein Daemon, der die Aktivität von kswapd0 erkennt und Prozesse beendet. Und Facebook zufolge hat dies das Problem, dass Linux-Server nicht mehr reagieren, fast vollständig beseitigt. Ich habe es jedoch nicht getestet und weiß nicht, wie gut es auf anderen Servern oder Desktop / Laptops funktioniert. Interessanterweise muss OOMD logischerweise entscheiden, welche Prozesse zuerst abgebrochen werden sollen, um die Systemprozesse und den Teil des Serversystems zu erhalten, der für den Neustart des Abbruchs verantwortlich ist.

Dies sollte jedoch nicht gelöst werden. OOMD ist ein hässlicher Hack. Die eigentliche Lösung besteht darin, die durch eine Swap-Schleife verursachte Prioritätsumkehrung zu beheben und den Kernel-OOM-Killer aggressiver beim Beenden von Prozessen zu machen, um Speicher freizugeben. Das Update gehört in den Kernel, da dies der einzige Ort ist, an dem wir sicher sein können, dass das Problem rechtzeitig erkannt wird und die Prozesse ordnungsgemäß beendet werden.

Das Setzen von swappiness = 0 ist keine Lösung, da das System, wenn kein freier Arbeitsspeicher mehr vorhanden ist, unabhängig von der jeweiligen Situation mit dem Auslagern beginnt. Es gibt keine Option, um sicherzustellen, dass das System nicht mit dem Tauschen beginnt.

Und auch das Beheben der fehlerhaften Anwendungen ist kein Fix. Besonders nicht, wenn ein Benutzer diesen Fehler ausnutzen möchte, um das Betriebssystem absichtlich nicht mehr reagieren zu lassen. Reagieren liegt in der Verantwortung des Kernels. Wenn Firefox nicht mehr reagiert, liegt die Korrektur bei der Anwendung. Es reagiert jedoch nicht nur selbst nicht mehr, sondern das gesamte Betriebssystem wird sehr langsam und reagiert nicht mehr. Die Anmeldung bei SSH kann bis zu einer halben Stunde dauern. Die SSH hat nichts damit zu tun, und wenn sie nicht ausgeführt werden kann, ist dies ein Fehler im Kernel, nicht in einem anderen Teil des Systems. Und es ist kein Fehler, es sind zwei Fehler. Ein Fehler ist die Prioritätsumkehr, bei der ein von der Schiene abgehender Austauschzyklus andere Prozesse als die anstößigen Prozesse stören kann und der an sich schlecht ist. Der andere Fehler ist, dass es nicht " t Stellen Sie nicht fest, dass es sich in einer Swap-Schleife befindet und dass die Festplatte / SSD oder der Speicher, auf dem sich der Swap befindet, einen verrückten Verschleiß aufweist. Beim Auslagern von ausführbaren Dateien ist dies weniger problematisch, da es sich um schreibgeschützte Speicherzuordnungen handelt, die nicht auf Datenträger zurückgeschrieben werden, kswapd0 jedoch weiterhin gesperrt ist und das zurückliest, was gleichzeitig aus dem Speicher gelöscht wird.

Oh und es gibt einen dritten Fehler. Die Tatsache, dass es keine Möglichkeit gibt, den CACHE-Datenträger vor dem Verzehr zu schützen, wenn speicherhungrige Anwendungen den gesamten verfügbaren Speicher beanspruchen. Dies ist einer der Gründe, warum kswapd0 das System nicht mehr reagiert. Die Daten mit der höchsten Speicherbelegung werden normalerweise im Festplatten-Cache gespeichert. Wenn Firefox diesen Cache jedoch aufgebraucht hat, bedeutet dies natürlich, dass Festplattenlesevorgänge stattfinden müssen.

Es ist nicht unbedingt Firefox, das Ihr Problem verursacht, aber es ist der Standardbrowser, nicht Chrome. Und es ist allgemein bekannt, dass beide dieses Problem auslösen, da sie den verfügbaren Speicher als Verschwendung behandeln, einschließlich Cache- und Auslagerungsspeicher, der unter Linux als "verfügbarer Speicher" gilt. Also, um nicht "verfügbaren Speicher" verschwenden zu müssen, verwenden Sie ihn für Caching und andere Dinge. Offensichtlich ist die Verwendung von SWAP für DISK CACHE eine SEHR SCHLECHTE IDEE, aber die Kollegen von Firefox und Chrome antworten darauf mit "Freier Speicher ist verschwendeter Speicher".

Was wir hier haben, sind drei Kernel-Fehler, die das Kernel-Team nicht zu berücksichtigen scheint. Und ein Fehler in Firefox, Chrome und allen Derivaten, die sie nicht als Fehler betrachten. Ich habe versucht, Firefox auf meinem Fedora-Laptop zu installieren, um dieses Problem zu untersuchen und möglicherweise zu beheben. Erraten Sie, was. Das Bauen von Firefox mit GCC auf einer 4-Kern-CPU mit 4 GB RAM löst eine SWAP-LOOP mit PRIORITY INVERSION aus. Eine der Anwendungen, die neu geschrieben werden müssen, ist GCC. Unter NetBSD werden nur die vier laufenden Instanzen von GCC langsamer als eine Instanz, aber das System friert nicht ein.

Ja, das ist ein bisschen hektisch, aber ich hoffe, dass es das aktuelle Problem mit den Linux-Speichersubsystemen sowie den Anwendungen, die es verursachen, klärt.

user1657170
quelle
1

Wenn Sie keinen Swap haben und kswapd0ausgeführt werden, belegt Ihr System derzeit fast den gesamten Arbeitsspeicher. Es ist an der Zeit, bessere Tools zur Überwachung der Speichernutzung (oder des freien / verfügbaren Speichers im System) zu finden.

Die eigentliche Lösung besteht darin, die Speichernutzung zu reduzieren (Prozesse mit weniger Speicherverlusten ausführen, weniger Prozesse ausführen, einige Prozesse überhaupt überspringen, die Anzahl der Kinder- / Worker-Prozesse einiger Serversoftware begrenzen) oder mehr RAM zu erhalten. Wenn der RAM-Bedarf durch Speicherverluste verursacht wird, können Sie stattdessen Swap verwenden. Linux sollte ziemlich schlau sein, die durchgesickerten Teile zu tauschen, wenn genügend Zeit vorhanden ist. Swap ist besser als nichts, aber das ist kein wirklicher Ersatz für ausreichend RAM.

Mikko Rantalainen
quelle
Hier und in Ihren Kommentaren gibt es gute Informationen, aber das Aktivieren von Swap ist keine Lösung, wenn der gesamte verfügbare Speicher (RAM + Swap) voll ist. Dies ist eine besonders schlechte Lösung für den Fall eines Speicherverlusts, da es unvermeidlich ist, dass der gesamte Speicher irgendwann voll wird. Das Ergebnis, wenn Swap + RAM voll ist, ist das gleiche wie bei vollem RAM und deaktiviertem Swap.
Code Bling