Wie kann ich Swap komplett deaktivieren?

30

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 -sich swapoff -aalle aktivierten Swaps ermittelt hatte , deaktivierte ich alle Swaps und swapon -sbestä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)?

syockit
quelle
Das ergibt eigentlich keinen Sinn. Dadurch könnte die 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 der swapoff -aGrund für den E / A-"Sturm" ist?
Mat
1
Ich nehme an, es reicht aus, die fstabZeile über Swap zu kommentieren . Versuchen Sie, ob das Verhalten dasselbe ist.
Enzotib
@Mat swapoff -asollte 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 -aweil der Swap zu diesem Zeitpunkt 0 war.
syockit
9
@syockit: swapoff -aist nicht permanent.
Mat
1
Das Laden der Datenbank betrug in 14 Stunden ungefähr 15%. Swap ausgeschaltet, und beim nächsten Versuch ist es in 4 Stunden auf 40% gekommen. Zugegeben, der Server ist unterlastet und hat keinen Arbeitsspeicher, aber ohne eingeschalteten Swap arbeitet OpenSuSE für diesen einen Prozess viel schneller. Die Meinung des Betriebssystems von "besser" und meiner unterscheidet sich dramatisch während einer einfachen MySQL-Datenbank-Last. das Swap-Laufwerk in / etc / fstab auskommentiert und neu gestartet.
TheSatinKnight

Antworten:

15

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.

David Schwartz
quelle
1
Dies gilt nur, wenn Sie nur wenig Arbeitsspeicher zuweisen. Ein Run-Away-Prozess versucht in der Regel, viel mehr Speicher zuzuweisen, und wird daher vorzeitig beendet, um diesen Speicher freizugeben, anstatt das System weiterhin zu töten, um mehr Zuweisungen zu ermöglichen. Daher kann das Deaktivieren von Swap hilfreich sein, wenn Sie können Ihre RAM-Nutzung nur durch einen außer Kontrolle geratenen Prozess maximieren.
Psusi
1
Nur wenig Speicher wird so ziemlich immer zugewiesen. Linux ist speziell auf diesen Weg abgestimmt. Machen Sie cat /proc/meminfonach ein paar Stunden Laden eine auf jeder typischen Linux-Box.
David Schwartz
2
@syockit Wenn Sie das Paging deaktivieren, können Sie keine Programme ausführen. Paging ist der Mechanismus, mit dem Dateien eingelesen werden, wenn sie in den Speicher abgebildet werden.
David Schwartz
2
@psusi: Bereinigte Seiten werden beim Tauschen nicht auf ein Minimum reduziert. Stattdessen werden schmutzige, anonyme Seiten ausgetauscht, die in letzter Zeit nicht verwendet wurden. In beiden Fällen wird es natürlich zu heftigen Schlägen kommen, wenn der Arbeitsspeicher den physischen Speicher übersteigt. Der Punkt ist, mit oder ohne Tausch, Sie werden eine Menge heftiger Schläge bekommen, bevor Ihnen tatsächlich der Speicher ausgeht. Der Unterschied besteht darin, dass beim Tauschen die heftigen Aktionen getauscht werden (schmutzige Seiten, Schreiben und Lesen). Ohne Swap wird das heftige Thrashing zu Codefehlern (saubere Seiten, schreibgeschützt).
David Schwartz
2
@psusi: Sie haben Recht, wenn es sich um einen außer Kontrolle geratenen Prozess handelt, der den Speicherverbrauch schnell in die Höhe treibt. Aber das ist nicht das, worüber das OP spricht, ein Prozess, der übermäßigen, aber nicht unbegrenzten oder übermäßigen Speicher verbraucht. Während es durch den großen Sweet Spot (wo der Cache zusammengedrückt wird) wächst, wächst es immer langsamer, während das System zerschlägt.
David Schwartz
13

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

(ulimit -d 400000; firefox) &

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.

Kyle Jones
quelle
Funktioniert dies beispielsweise für Chrom, wo wir eine Reihe von chromiumProzessen mit kleinen Speicherblöcken ausführen?
Jberryman
@jberryman Nein, die Speicherbegrenzungen gelten pro Prozess und nicht pro Benutzer.
Kyle Jones
Gibt es eine Möglichkeit, ein bestimmtes Signal (z. B. SIGHUP) zu senden, wenn das Speicherlimit erreicht ist?
Geremia
1
@Geremia Nein. Die Systemaufrufe brk und sbrk funktionieren nicht mehr, wodurch sich die meisten Dinge zusammenrollen und sterben.
Kyle Jones
Wenn Sie mit der manuellen Optimierung fortfahren möchten, würde ich die Verwendung von Speicher-Cgroup anstelle von ulimit vorschlagen, da Sie mit Speicher-Cgroup ein Limit für die gesamte Prozessgruppe festlegen und den Speicherzuweisungsprozess so konfigurieren können, dass er stoppt, und der Richtlinienprozess für den Benutzermodus entscheiden kann, was zu tun ist tun (z. B. einige Signale senden, den Prozess auswählen, der beendet werden soll, das Speicherlimit im laufenden Betrieb erhöhen). Weitere Informationen finden Sie unter kernel.org/doc/Documentation/cgroup-v1/memory.txt und kernel.org/doc/Documentation/cgroup-v2.txt .
Mikko Rantalainen
4

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 swapBoot-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/swapeinen Hinweis geben:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Beachten Sie den Teil über Deadlock . Sie können es umount -a -t tmpfsselbst versuchen, bevor Sie den Swap ausschalten.


Bearbeiten:

Wahrscheinlich können Sie Ihr Ziel auch durch Ändern der sysctlEinstellungen erreichen (siehe diese Frage ).

rozcietrzewiacz
quelle
Ich habe nicht swapin init.d, noch habe ich es auf fstab, aber ich habe, /etc/init.d/mountoverflowtmpdass Mounts tmpfsfür den Notfall Log schreibt. Verwendet der Swap-Daemon tmpfsauch?
syockit
Möglicherweise haben Sie es an anderer Stelle aktiviert - tun grep -RF swap /etc/Sie dies, wenn Sie es finden möchten. Aber um einen Dienst zu deaktivieren, würden Sie einen Befehl wie service(IIRC; ich selbst benutze Debian nicht) verwenden.
rozcietrzewiacz
1
Swap selbst wird nicht verwendet tmpfs , da tmpfses sich um ein In-Memory-Dateisystem (RAM) handelt. Bei anderen Diensten / Programmen, die verwendet werden, ist tmpfsSwap 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 der tmpfsFahrer Zugriff auf den Swap Space beansprucht.
rozcietrzewiacz
Ich verstehe nicht, wie Linux mit virtuellem Speicher umgeht. Ich habe Swap auf die meisten möglichen Arten deaktiviert: via swapoffund via vm.swappiness=0. Läuft doch kswapd0noch! Ich frage mich, ob dies eine Regression der 2,4 Tage ist ...
syockit
5
@syockit Es ist erwartetes Verhalten. Das System tauscht immer noch leere Seiten aus (Seiten, die Kopien von Dateidaten enthalten). Es ist kein Auslagerungsspeicher erforderlich, um leere Seiten auszutauschen, da sie aus anderen Quellen als Auslagerungsquellen zurückgelesen werden können.
David Schwartz
2

Es ist besser, den Swap-Partitionseintrag auskommentieren, /etc/fstabals ihn swapoff -anach jedem Start auszuführen .

Ich habe das gleiche Problem mit kswapd0 auf meiner Hardware.

Tuning vm.swappinessSystemparameter hilft nicht , für mich.

sysctl -w vm.swappiness=0

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 kswapd0deaktivierten Rechten erstellt wird.

Gummibärchen
quelle
2
Wenn Sie kswapd0verrückt werden und kein Swap aktiviert ist, ist der Arbeitsspeicher erschöpft. Sie haben die Wahl zwischen OOM Killer oder kswapd0. Linux geht mit, kswapd0weil 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.
Mikko Rantalainen
1

Auf meinem System (debian sid 15.11.2016) habe ich folgendes gemacht:

  1. deaktiviere den Swap jetzt:

    swapoff -a
    
  2. Kommentieren Sie die Zeile mit der Swap-Partition in / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. Deaktivieren Sie die Bereitstellung von Swap in systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Es wäre genug. Es gibt einen Verweis auf den Swap in der /etc/initramfs-tools/conf.d/resumeDatei. 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;)).

homer242
quelle
1

Der Computer bleibt mit einem heftigen E / A-Durchsatz im Hintergrund hängen. iotop zeigt, dass kswapd0 der Schuldige ist

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
Ist dieser Kernel-Patch bereits gepflegt?
HumanityANDpeace
@humanityANDpeace wahrscheinlich nicht, weil es nicht so gut ist (da ich kein Programmierer bin), aber ich bin auf ein Problem gestoßen, wie z. B .: Manchmal, abhängig von der Arbeitsbelastung, kann es bei diesem Patch vorkommen, dass Ihnen in bestimmten Fällen der Speicher ausgeht in welchem ​​ohne diesen Patch Sie nicht hätten und somit OOM-Killer Xorg und xfwm4 töten wird, es sei denn, ich laufe, echo 1 | sudo tee /proc/sys/vm/drop_cacheswenn Active(file):(von / proc / meminfo) über 2 GB (auf einem 16G RAM-System) -es kann zu max 4G gehen