Ich verwende Debian Sid, eine mit ext4 formatierte Festplatte, die unter Linux 3.1 läuft
Ich erinnere mich, dass bei früheren Linux-Versionen (möglicherweise vor 3.0) Programme normalerweise abstürzen, wenn mir der Speicher ausgeht und Swap nicht aktiviert ist. Dies ist perfekt für meine Umgebung: Einfaches Surfen im Internet ohne kritische Vorgänge. Das heißt, wenn ich versehentlich auf eine schlechte Website stoße, die zu viel Speicherplatz verbraucht, stürzt sie ab, ohne dass mein Terminal unbrauchbar wird.
In meinem aktuellen Setup bleibt der Computer jedoch mit einem heftigen E / A-Durchsatz im Hintergrund hängen. iotop zeigt, dass kswapd0 der Schuldige ist, was bedeutet, dass es auf das Austauschen zurückzuführen ist. Nachdem swapon -s
ich swapoff -a
alle aktivierten Swaps ermittelt hatte , deaktivierte ich alle Swaps und swapon -s
bestätigte erneut, dass alle Swaps deaktiviert waren.
Dann habe ich erneut versucht, meine Speichernutzung zu maximieren. Leider ist das Verhalten, das ich erwartet hatte, nicht eingetreten. Stattdessen versucht kswapd0 immer wieder, den Arbeitsspeicher auszutauschen, und schlägt fehl, da kein Auslagerungsspeicher vorhanden ist. Weil es nie aufgibt, ist mein Computer in einem ewigen E / A-Einfrieren gesperrt, was sich negativ auf die Gesundheit meiner Festplatte auswirkt.
Mache ich etwas falsch, wenn ich es versuche swapoff -a
? Warum ist das Verhalten anders als früher (wahrscheinlich vor 3.0)?
swapoff -a
selbst , wenn es Sachen in dem Swap war, wird eine Menge von E / A erzeugt (und in den Prozessen führen kann jämmerlich , wenn nicht genügend realen RAM verfügbare ist). Sind Sie sicher, dass dies nicht derswapoff -a
Grund für den E / A-"Sturm" ist?fstab
Zeile über Swap zu kommentieren . Versuchen Sie, ob das Verhalten dasselbe ist.swapoff -a
sollte Swap dauerhaft deaktivieren, dh, es sollte nach dem nächsten Neustart deaktiviert bleiben. Ich habe das bestätigt. Nach dem nächsten Neustart tritt während der Sitzung dennoch ein E / A-"Sturm" auf. Für den Rekord, I / O "Sturm" ist in dem Moment nicht passiert, als ich es tat,swapoff -a
weil der Swap zu diesem Zeitpunkt 0 war.swapoff -a
ist nicht permanent.Antworten:
Das Deaktivieren von Swap macht nicht das, was Sie wollen. Der I / O-Durchsatz ist immer noch gewalttätig, es handelt sich jedoch eher um saubere als um schmutzige Seiten.
Ohne Auslagerung komprimiert das System den Cache sauberer (nicht geänderter) Seiten auf nahezu Null, da dies die einzigen Seiten sind, die aus dem physischen Speicher entfernt werden können. Es kann nur verschmutzte (geänderte) Seiten aus dem Speicher entfernen, indem sie in Swap geschrieben werden. Ohne Swap können verschmutzte Seiten nicht entfernt werden.
Da der physische Speicher knapp wird, muss jeder Prozess seine Codepages von der Festplatte laden, da er die vorherigen Prozesscodepages entfernt. Das Ergebnis wird gewaltsames Dröhnen und übermäßige Arbeit des Swap-Subsystems sein.
Dies ist ein Sonderfall eines sehr wichtigen Prinzips: Bei einem gut konzipierten System können Sie die Leistung nicht verbessern, indem Sie die Auswahl reduzieren. Linux ist ein gut konzipiertes System. Wenn Sie Swap entfernen, haben Sie nur weniger Auswahlmöglichkeiten. Es ist also nicht verwunderlich, dass es sich schlechter verhält.
quelle
cat /proc/meminfo
nach ein paar Stunden Laden eine auf jeder typischen Linux-Box.Eine bessere Lösung als das Deaktivieren von Swap, bei dem zufällige Prozesse bestenfalls abgebrochen werden, wenn der Arbeitsspeicher knapp wird, ist das Festlegen des Grenzwerts pro Prozessdatensegment für Prozesse, die Daten aus dem Netz ziehen. Auf diese Weise stößt ein außer Kontrolle geratener Browser an seine Grenzen und stirbt, anstatt das gesamte System unbrauchbar zu machen. B. aus der Muschel
Die Zahl nach -d ist in Kilobyte. Sie sollten damit auf Ihrem System experimentieren, um den besten Wert für Ihre Surfgewohnheiten zu finden. Durch die Klammern wird eine Unterschale erstellt. Der Befehl ulimit wirkt sich nur auf diese Shell und ihre untergeordneten Shell-Elemente aus und isoliert ihre Auswirkungen von der übergeordneten Shell.
quelle
chromium
Prozessen mit kleinen Speicherblöcken ausführen?Um sicherzustellen, dass Swap nicht verwendet wird, sollten Sie verhindern, dass Swap beim Booten hinzugefügt wird. Dies kann je nach System durch Deaktivieren des
swap
Boot-Dienstes oder durch Auskommentieren des Swap-Eintrags in erfolgen/etc/fstab
.In Bezug auf Ihr Auflegen könnte die
stop()
Funktion in/etc/init.d/swap
einen Hinweis geben:Beachten Sie den Teil über Deadlock . Sie können es
umount -a -t tmpfs
selbst versuchen, bevor Sie den Swap ausschalten.Bearbeiten:
Wahrscheinlich können Sie Ihr Ziel auch durch Ändern der
sysctl
Einstellungen erreichen (siehe diese Frage ).quelle
swap
ininit.d
, noch habe ich es auffstab
, aber ich habe,/etc/init.d/mountoverflowtmp
dass Mountstmpfs
für den Notfall Log schreibt. Verwendet der Swap-Daemontmpfs
auch?grep -RF swap /etc/
Sie dies, wenn Sie es finden möchten. Aber um einen Dienst zu deaktivieren, würden Sie einen Befehl wieservice
(IIRC; ich selbst benutze Debian nicht) verwenden.tmpfs
, datmpfs
es sich um ein In-Memory-Dateisystem (RAM) handelt. Bei anderen Diensten / Programmen, die verwendet werden, isttmpfs
Swap jedoch möglicherweise in besonderer Weise erforderlich. Ich weiß es nicht genau, aber es könnte etwas mit Caching oder einer besonderen Art und Weise zu tun haben, in der dertmpfs
Fahrer Zugriff auf den Swap Space beansprucht.swapoff
und viavm.swappiness=0
. Läuft dochkswapd0
noch! Ich frage mich, ob dies eine Regression der 2,4 Tage ist ...Es ist besser, den Swap-Partitionseintrag auskommentieren,
/etc/fstab
als ihnswapoff -a
nach jedem Start auszuführen .Ich habe das gleiche Problem mit kswapd0 auf meiner Hardware.
Tuning
vm.swappiness
Systemparameter hilft nicht , für mich.Ich habe gegoogelt und viele Posts und Mailinglisten gelesen, und jetzt denke ich, dass dies ein Kernel-Bug ist.
Wenn keine aktive Swap-Partition vorhanden ist und der freie Speicher unter einem bestimmten Schwellenwert (in meinem Fall etwa 300 MB) liegt, reagiert das System aufgrund von kswapd0-Wahnsinn nicht mehr.
Wahrscheinlich wird es mit speziellen Konfigurationen und Bedingungen reproduziert.
Für jemanden wird dies durch eine Neuinstallation des Systems mit erneuter Partitionierung für andere gelöst, indem ein benutzerdefinierter Kernel mit
kswapd0
deaktivierten Rechten erstellt wird.quelle
kswapd0
verrückt werden und kein Swap aktiviert ist, ist der Arbeitsspeicher erschöpft. Sie haben die Wahl zwischen OOM Killer oderkswapd0
. Linux geht mit,kswapd0
weil der Kernel annimmt, dass es wichtiger ist, langsam fertig zu werden, als den Prozess abzubrechen. Für Gelegenheitsmenschen ist die Schwelle, an der der Kernel glaubt, dass noch genügend Fortschritte erzielt werden, bereits sehr langsam und fast jeder würde lieber OOM Killer wählen.Auf meinem System (debian sid 15.11.2016) habe ich folgendes gemacht:
deaktiviere den Swap jetzt:
Kommentieren Sie die Zeile mit der Swap-Partition in / etc / fstab
Deaktivieren Sie die Bereitstellung von Swap in systemd:
Es wäre genug. Es gibt einen Verweis auf den Swap in der
/etc/initramfs-tools/conf.d/resume
Datei. Ich weiß nicht, wozu das gut ist. Möglicherweise ist diese Datei beim nächsten Neustart ein Problem (ich versuche noch nicht neu zu starten, meine Betriebszeit ist kostbar;)).quelle
Ich habe (bis jetzt) einen Weg gefunden, das zu vermeiden. Wenn Sie es testen und sehen möchten, wie es auf Ihrem System funktioniert, lesen Sie den Kernel-Patch in dieser Frage . Grundsätzlich werden
Active(file)
Seiten (zumindest) nicht entfernt, wenn der Arbeitsspeicher überlastet ist. Dadurch wird die Datenträgerverletzung (ständiges Lesen) auf fast nichts reduziert und der OOM-Killer kann innerhalb von 1 Sekunde ausgelöst werden, anstatt das Betriebssystem für einen bestimmten Zeitraum einzufrieren wie dauerhaft (oder zumindest für viele Minuten). Ich hoffe, dass tatsächliche Programmierer (von denen ich nicht bin) den Patch verbessern und ihn zu einer tatsächlichen Lösung machen, jetzt, da sie sehen, dass das, was es tut, für diese Situationen funktioniert .quelle
echo 1 | sudo tee /proc/sys/vm/drop_caches
wennActive(file):
(von / proc / meminfo) über 2 GB (auf einem 16G RAM-System) -es kann zu max 4G gehen