Was ist Swappiness unter Linux? (und wie man es ändert)

Sticks von Random Access Memory (RAM) für einen Computer.

subin-ch/Shutterstock.com



Der Linux-Swappiness-Wert hat nichts damit zu tun, wie viel RAM verwendet wird, bevor das Swapping beginnt. Das ist ein weit verbreiteter und weithin geglaubter Fehler. Wir erklären, was es wirklich ist.

Mythen über Swapiness zerschlagen

Swapping ist eine Technik, bei der Daten in Arbeitsspeicher (RAM) wird an einen speziellen Ort auf Ihrer Festplatte geschrieben – entweder eine Auslagerungspartition oder eine Auslagerungsdatei – um RAM freizugeben.





Linux hat eine Einstellung namens swappiness-Wert. Es gibt eine Menge Verwirrung darüber, was diese Einstellung steuert. Die häufigste falsche Beschreibung von Swappiness ist, dass sie einen Schwellenwert für die RAM-Nutzung festlegt, und wenn die Menge des verwendeten RAMs diesen Schwellenwert erreicht, beginnt das Swapping.

Dies ist ein Missverständnis, das so oft wiederholt wurde, dass es heute Weisheit ist. Wenn (fast) alle anderen Ihnen sagen, dass Swappiness genau so funktioniert, warum sollten Sie uns dann glauben, wenn wir sagen, dass dies nicht der Fall ist?



Einfach. Wir werden es beweisen.

Ihr RAM ist in Zonen aufgeteilt

Linux betrachtet Ihren Arbeitsspeicher nicht als einen großen homogenen Speicherpool. Es ist der Ansicht, dass es in eine Reihe verschiedener Regionen unterteilt ist, die als Zonen bezeichnet werden. Welche Zonen auf Ihrem Computer vorhanden sind, hängt davon ab, ob 32-Bit oder 64-Bit . Hier ist eine vereinfachte Beschreibung der möglichen Zonen auf einem Computer mit x86-Architektur .

    Direkter Speicherzugriff (DMA): Dies sind die niedrigen 16 MB Speicher. Die Zone hat ihren Namen, weil es vor langer Zeit Computer gab, die nur direkten Speicherzugriff auf diesen Bereich des physischen Speichers haben konnten. Direkter Speicherzugriff 32: Direct Memory Access 32 (DMA32) ist trotz seines Namens eine Zone, die nur in 64-Bit-Linux zu finden ist. Es sind die niedrigen 4 GB Speicher. Linux, das auf 32-Bit-Computern ausgeführt wird, kann nur DMA für diese Menge an RAM ausführen (es sei denn, sie verwenden die physische Adresserweiterung (PAE)-Kernel), wodurch die Zone ihren Namen erhielt. Auf 32-Bit-Computern wird es jedoch HighMem genannt. Normal: Auf 64-Bit-Computern umfasst der normale Arbeitsspeicher den gesamten Arbeitsspeicher über 4 GB (ungefähr). Auf 32-Bit-Rechnern ist es RAM zwischen 16 MB und 896 MB. HighMem: Dies existiert nur auf 32-Bit-Linux-Computern. Es ist alles RAM über 896 MB, einschließlich RAM über 4 GB auf ausreichend großen Maschinen.

Der PAGESIZE-Wert

RAM wird in Seiten zugewiesen, die eine feste Größe haben. Diese Größe wird vom Kernel beim Booten bestimmt, indem er die Architektur des Computers erkennt. Normalerweise beträgt die Seitengröße auf einem Linux-Computer 4 KB.



Anzeige

Sie können Ihre Seitengröße sehen mit dem |_+_| Befehl :

getconf

getconf SEITENGRÖSSE

Zonen sind mit Knoten verbunden

Zonen werden an Knoten angehängt. Knoten sind mit a verbunden Central Processing Unit (CPU) . Der Kernel versucht, Speicher für einen Prozess, der auf einer CPU läuft, von dem Knoten zuzuweisen, der dieser CPU zugeordnet ist.

Das Konzept der an CPUs gebundenen Knoten ermöglicht die Installation gemischter Speichertypen in speziellen Multi-CPU-Computern unter Verwendung der Ungleichmäßiger Speicherzugriff die Architektur.

Das ist alles sehr hochwertig. Der durchschnittliche Linux-Computer hat einen einzigen Knoten, den sogenannten Knoten Null. Alle Zonen gehören zu diesem Knoten. Um die Knoten und Zonen in Ihrem Computer anzuzeigen, schauen Sie in das |_+_| Datei. Wir verwenden |_+_| dazu:

/proc/buddyinfo

Dies ist die Ausgabe des 64-Bit-Computers, auf dem dieser Artikel recherchiert wurde:

lessAnzeige

Es gibt einen einzelnen Knoten, Knoten Null. Dieser Computer hat nur 2 GB RAM, daher gibt es keine normale Zone. Es gibt nur zwei Zonen, DMA und DMA32.

Jede Spalte repräsentiert die Anzahl der verfügbaren Seiten einer bestimmten Größe. Zum Beispiel für die DMA32-Zone, von links gelesen:

    zwei: Es gibt 2 von 2^( 0 *PAGESIZE) Speicherblöcke. 67: Es gibt 67 von 2^( eins *PAGE_SIZE) Speicherblöcke. 58: Es gibt 58 von 2^( zwei *PAGESIZE) verfügbare Speicherblöcke.
  • Und so weiter bis hin zu…
  • 17: Es gibt 17 von 2^( 512 *SEITENGRÖSSE) Blöcke.

Aber wirklich, der einzige Grund, warum wir uns diese Informationen ansehen, besteht darin, die Beziehung zwischen Knoten und Zonen zu sehen.

Dateiseiten und anonyme Seiten

Die Speicherzuordnung verwendet Sätze von Seitentabelleneinträge um aufzuzeichnen, welche Speicherseiten wofür verwendet werden.

Speicherzuordnungen können sein:

    Datei gesichert: Dateigestützte Zuordnungen enthalten Daten, die aus einer Datei gelesen wurden. Es kann jede Art von Datei sein. Es ist wichtig zu beachten, dass, wenn das System diesen Speicher freigegeben hat und diese Daten erneut abgerufen werden müssen, diese erneut aus der Datei gelesen werden können. Wenn die Daten jedoch im Speicher geändert wurden, müssen diese Änderungen in die Datei auf der Festplatte geschrieben werden, bevor der Speicher freigegeben werden kann. Geschieht dies nicht, gehen die Änderungen verloren. Anonym: Anonymer Speicher ist eine Speicherzuordnung ohne Datei oder Gerät, die sie unterstützt. Diese Seiten können Speicher enthalten, der spontan von Programmen angefordert wird, um Daten zu speichern, oder für Dinge wie die Stapel und das Haufen . Da hinter dieser Art von Daten keine Datei steckt, muss für die Speicherung anonymer Daten ein besonderer Platz vorgesehen werden. Dieser Ort ist die Auslagerungspartition oder Auslagerungsdatei. Anonyme Daten werden zum Austausch geschrieben, bevor anonyme Seiten freigegeben werden. Gerät unterstützt: Geräte werden über angesprochen Gerätedateien blockieren, die so behandelt werden können, als wären sie Dateien . Von ihnen können Daten gelesen und geschrieben werden. In einer gerätegestützten Speicherzuordnung sind Daten von einem Gerät gespeichert. Geteilt: Mehrere Seitentabelleneinträge kann auf dieselbe RAM-Seite abgebildet werden. Wenn Sie über eine der Zuordnungen auf die Speicherorte zugreifen, werden dieselben Daten angezeigt. Durch das Verändern der Daten in diesen gemeinsam überwachten Speicherplätzen können unterschiedliche Prozesse sehr effizient miteinander kommunizieren. Gemeinsame beschreibbare Zuordnungen sind ein übliches Mittel, um eine hochleistungsfähige Kommunikation zwischen Prozessen zu erreichen. Beim Schreiben kopieren: Beim Schreiben kopieren ist eine träge Zuweisungstechnik. Wenn eine Kopie einer bereits im Speicher befindlichen Ressource angefordert wird, wird die Anforderung erfüllt, indem eine Zuordnung zur ursprünglichen Ressource zurückgegeben wird. Wenn einer der Prozesse, die sich die Ressource teilen, versucht, darauf zu schreiben, muss die Ressource wirklich im Speicher repliziert werden, damit die Änderungen an der neuen Kopie vorgenommen werden können. Die Speicherzuweisung erfolgt also nur beim ersten Schreibbefehl.

Aus Gründen der Austauschbarkeit brauchen wir uns nur mit den ersten beiden in der Liste zu befassen: Dateiseiten und anonyme Seiten.

Tauschfähigkeit

Hier ist die Beschreibung von Swappiness aus der Linux-Dokumentation an GitHub :

Anzeige

'This control is used to define how aggressive (sic) the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

The default value is 60.'

Das hört sich so an, als ob Swappiness die Intensität nach oben oder unten wechseln würde. Interessanterweise heißt es, dass das Setzen von Swappiness auf Null den Swap nicht ausschaltet. Es weist den Kernel an, nicht zu tauschen, bis bestimmte Bedingungen erfüllt sind. Aber ein Austausch kann trotzdem vorkommen.

Lass uns tiefer graben. Hier ist die Definition und der Standardwert von |_+_| in der Kernel-Quellcodedatei vmscan.c :

vm_swappiness

Der Swappiness-Wert kann von 0 bis 100 reichen. Auch hier klingt der Kommentar sicherlich so, als ob der Swappiness-Wert einen Einfluss darauf hat, wie viel Swapping stattfindet, wobei ein höherer Wert zu mehr Swapping führt.

Weiter unten in der Quellcodedatei können wir sehen, dass eine neue Variable namens |_+_| wird ein Wert zugewiesen, der von der Funktion |_+_| zurückgegeben wird. Eine weitere Verfolgung des Quellcodes zeigt, dass der von dieser Funktion zurückgegebene Wert |_+_| ist. Die Variable |_+_| auf den gleichen Wert gesetzt wird |_+_| eingestellt war.

/*
* From 0 .. 100. Higher means more swappy.
*/
int vm_swappiness = 60;

Anzeige

Und etwas weiter unten in der gleichen Quellcodedatei , wir sehen das:

swappiness

Das ist interessant. Aus |_+_| werden zwei unterschiedliche Werte abgeleitet. Die |_+_| und |_+_| Variablen halten diese Werte. Wenn einer zunimmt, nimmt der andere ab, und und umgekehrt .

Der Linux-Swappiness-Wert setzt tatsächlich die Verhältnis zwischen zwei Werte.

Der Goldene Schnitt

Dateiseiten enthalten Daten, die leicht abgerufen werden können, wenn dieser Speicher freigegeben wird. Linux kann die Datei einfach wieder lesen. Wenn die Dateidaten im RAM geändert wurden, müssen diese Änderungen in die Datei geschrieben werden, bevor die Dateiseite freigegeben werden kann. In beiden Fällen kann die Dateiseite im RAM jedoch neu gefüllt werden, indem Daten aus der Datei gelesen werden. Warum also diese Seiten zur Auslagerungspartition oder Auslagerungsdatei hinzufügen? Wenn Sie diese Daten erneut benötigen, können Sie sie genauso gut aus der Originaldatei zurücklesen, anstatt aus einer redundanten Kopie im Auslagerungsbereich. Dateiseiten werden also nicht im Swap gespeichert. Sie werden wieder in der Originaldatei gespeichert.

Bei anonymen Seiten ist den Werten im Speicher keine zugrunde liegende Datei zugeordnet. Die Werte auf diesen Seiten wurden dynamisch ermittelt. Sie können sie nicht einfach aus einer Datei wieder einlesen. Die einzige Möglichkeit, anonyme Seitenspeicherwerte wiederherzustellen, besteht darin, die Daten irgendwo zu speichern, bevor der Speicher freigegeben wird. Und das ist es, was Swap hält. Anonyme Seiten, auf die Sie erneut verweisen müssen.

Anzeige

Beachten Sie jedoch, dass das Freigeben des Speichers sowohl bei Dateiseiten als auch bei anonymen Seiten ein Schreiben auf die Festplatte erfordern kann. Wenn sich die Dateiseitendaten oder die anonymen Seitendaten seit dem letzten Schreiben in die Datei oder zum Auslagern geändert haben, ist ein Schreiben im Dateisystem erforderlich. Um die Daten abzurufen, ist ein Lesen des Dateisystems erforderlich. Beide Arten der Seitenrückforderung sind kostspielig. Der Versuch, die Festplatteneingabe und -ausgabe durch Minimieren des Austauschens anonymer Seiten zu reduzieren, erhöht nur die Menge der Festplatteneingabe und -ausgabe, die erforderlich ist, um Dateiseiten zu verarbeiten, die in Dateien geschrieben und aus Dateien gelesen werden.

Wie Sie dem letzten Code-Snippet entnehmen können, gibt es zwei Variablen. Einer namens |_+_| für Dateipriorität und eine namens |_+_| für anonyme Priorität.

  • Die |_+_| Variable wird auf den Linux-Swappiness-Wert gesetzt.
  • Die |_+_| Wert wird auf 200 minus dem |_+_| . gesetzt Wert.

Diese Variablen enthalten Werte, die zusammen arbeiten. Wenn beide auf 100 gesetzt sind, sind sie gleich. Für alle anderen Werte gilt |_+_| von 100 auf 0 sinken und |_+_| von 100 auf 200 ansteigen. Die beiden Werte fließen in einen komplizierten Algorithmus ein, der bestimmt, ob der Linux-Kernel mit einer Präferenz zum Zurückfordern (Freigeben) von Dateiseiten oder anonymen Seiten läuft.

Sie können an |_+_| . denken wie die Bereitschaft des Systems, Dateiseiten freizugeben und |_+_| wie die Bereitschaft des Systems, anonyme Seiten freizugeben. Was diese Werte nicht bewirken, ist irgendeine Art von Trigger oder Schwellenwert für Wenn Swap verwendet werden. Das ist anderswo entschieden.

Wenn jedoch Speicher freigegeben werden muss, werden diese beiden Variablen – und das Verhältnis zwischen ihnen – von den Rückgewinnungs- und Auslagerungsalgorithmen berücksichtigt, um zu bestimmen, welche Seitentypen bevorzugt für die Freigabe berücksichtigt werden. Und das bestimmt, ob die zugehörige Festplattenaktivität Dateien für Dateiseiten oder Auslagerungsspeicher für anonyme Seiten verarbeitet.

Wann schneidet Swap tatsächlich ein?

Wir haben festgestellt, dass der Linux-Swappiness-Wert eine Präferenz für den Typ der Speicherseiten festlegt, die auf eine potenzielle Wiederherstellung durchsucht werden. Das ist in Ordnung, aber etwas muss sich entscheiden Wenn Swap wird eingreifen.

Anzeige

Jede Speicherzone hat eine High Water Mark und eine Low Water Mark. Dies sind vom System abgeleitete Werte. Sie sind Prozentsätze des RAM in jeder Zone. Diese Werte werden als Swap-Trigger-Schwellenwerte verwendet.

Um zu überprüfen, was Ihre High- und Low-Water-Marken sind, schauen Sie in das |_+_| Datei mit diesem Befehl:

mem_cgroup_swappiness()

Jede der Zonen hat einen Satz von Speicherwerten, die in Seiten gemessen werden. Hier sind die Werte für die DMA32-Zone auf der Testmaschine. Die Low-Water-Mark beträgt 13966 Seiten und die High-Water-Mark beträgt 16759 Seiten:

  • Wenn unter normalen Betriebsbedingungen der freie Speicher in einer Zone unter die Niedrigwassermarke der Zone fällt, beginnt der Auslagerungsalgorithmus, Speicherseiten zu durchsuchen, um nach Speicher zu suchen, den er zurückgewinnen kann, wobei die relativen Werte von |_+_| . berücksichtigt werden und |_+_|.
  • Wenn der Linux-Swappiness-Wert auf Null gesetzt ist, tritt ein Swap auf, wenn der kombinierte Wert von Dateiseiten und freien Seiten kleiner als die High Watermark ist.

Sie können also sehen, dass Sie den Linux-Swappiness-Wert nicht verwenden können, um das Verhalten von Swap in Bezug auf die RAM-Nutzung zu beeinflussen. Es funktioniert einfach nicht so.

Worauf sollte Swapiness eingestellt werden?

Dies hängt von der Hardware, der Arbeitslast, dem Festplattentyp und davon ab, ob Ihr Computer ein Desktop oder ein Server ist. Offensichtlich wird dies keine Einheitsgröße sein, die für alle Arten von Einstellungen geeignet ist.

Und Sie müssen bedenken, dass Swap nicht nur als Mechanismus verwendet wird, um RAM freizugeben, wenn Ihnen der Speicherplatz ausgeht. Swap ist ein wichtiger Teil eines gut funktionierenden Systems, und ohne ihn wird eine vernünftige Speicherverwaltung für Linux sehr schwer zu erreichen.

Anzeige

Das Ändern des Linux-Swappiness-Werts hat einen sofortigen Effekt; Sie müssen nicht neu starten. So können Sie kleine Anpassungen vornehmen und die Effekte überwachen. Im Idealfall tun Sie dies über einen Zeitraum von Tagen mit verschiedenen Arten von Aktivitäten auf Ihrem Computer, um zu versuchen, die ideale Einstellung zu finden, die Ihnen am nächsten kommt.

Dies sind einige Punkte, die Sie beachten sollten:

  • Wenn Sie versuchen, den Swap zu deaktivieren, indem Sie den Linux-Swappiness-Wert auf Null setzen, wird die mit dem Swap verbundene Festplattenaktivität einfach in die dateibezogene Festplattenaktivität verschoben.
  • Wenn Sie über veraltete, mechanische Festplatten verfügen, können Sie versuchen, den Wert für die Auslagerung von Linux zu reduzieren, um die anonyme Seitenwiederherstellung zu vermeiden und die Abwanderung von Swap-Partitionen zu reduzieren. Wenn Sie eine Einstellung herunterdrehen, erhöht sich natürlich die andere Einstellung. Die Verringerung der Abwanderung von Swaps erhöht wahrscheinlich die Abwanderung des Dateisystems. Aber Ihr Computer könnte glücklicher sein, wenn er eine Methode der anderen vorzieht. Wirklich, der einzige Weg, dies mit Sicherheit zu wissen, besteht darin, es zu versuchen und zu sehen.
  • Bei Einzweckservern wie Datenbankservern können Sie sich von den Anbietern der Datenbanksoftware beraten lassen. Sehr oft verfügen diese Anwendungen über ihre eigenen speziell entwickelten Datei-Cache- und Speicherverwaltungsroutinen, auf die Sie sich besser verlassen können. Die Softwareanbieter können je nach Maschinenspezifikation und Arbeitsauslastung einen Linux-Austauschwert vorschlagen.
  • Für den durchschnittlichen Desktop-Benutzer mit einigermaßen neuer Hardware? Lass es so wie es ist.

So legen Sie den Linux-Swappiness-Wert fest

Bevor Sie Ihren Swappiness-Wert ändern, müssen Sie den aktuellen Wert kennen. Wenn Sie es ein wenig reduzieren möchten, ist die Frage ein bisschen weniger als was? Das kannst du mit diesem Befehl herausfinden:

vm_swappiness

cat /proc/sys/vm/swappiness

Um den Swappiness-Wert zu konfigurieren, verwenden Sie die |_+_| Befehl :

swappiness

Der neue Wert wird sofort verwendet, ein Neustart ist nicht erforderlich.

Tatsächlich wird der Swappiness-Wert bei einem Neustart auf seinen Standardwert von 60 zurückgesetzt. Wenn Sie mit dem Experimentieren fertig sind und sich für den neuen Wert entschieden haben, den Sie verwenden möchten, können Sie ihn über Neustarts hinweg persistent machen, indem Sie ihn zu | . hinzufügen _+_| Datei. Sie können einen beliebigen Editor verwenden, den Sie bevorzugen. Verwenden Sie den folgenden Befehl, um die Datei mit dem |_+_| . zu bearbeiten Editor:

vm_swappiness

Wenn |_+_| öffnet, scrollen Sie zum Ende der Datei und fügen Sie diese Zeile hinzu. Wir verwenden 35 als permanenten Tauschwert. Sie sollten den Wert ersetzen, den Sie verwenden möchten.

int swappiness = mem_cgroup_swappiness(memcg);

Um Ihre Änderungen zu speichern und |_+_| zu verlassen, drücken Sie Strg+O, drücken Sie die Eingabetaste und drücken Sie Strg+Z.

Speicherverwaltung ist komplex

Die Speicherverwaltung ist kompliziert. Und deshalb ist es für den durchschnittlichen Benutzer in der Regel besser, es dem Kernel zu überlassen.

Anzeige

Es ist leicht zu glauben, dass Sie mehr RAM verwenden, als Sie es tatsächlich sind. Dienstprogramme wie |_+_| und |_+_| kann einen falschen Eindruck erwecken. Linux wird freien RAM für eine Vielzahl von eigenen Zwecken verwenden, wie zum Beispiel für das Festplatten-Caching. Dadurch wird die verbrauchte Speicherzahl künstlich erhöht und die freie Speicherzahl verringert. Tatsächlich wird der als Disk-Cache verwendete RAM sowohl als verwendet als auch als verfügbar gekennzeichnet, da er jederzeit und sehr schnell wiederhergestellt werden kann.

Für den Uneingeweihten könnte es so aussehen, als ob Swap nicht funktioniert oder dass der Swap-Wert geändert werden muss.

Wie immer steckt der Teufel im Detail. Oder in diesem Fall der Daemon. Der Kernel-Swap-Daemon.

Linux-Befehle
Dateien Teer · pv · Katze · tac · chmod · Griff · unterschied · sed · Mit · Mann · geschoben · popd · fsck · Testdisk · seq · fd · pandoc · CD · $PFAD · awk · beitreten · jq · falten · einzigartig · Journalctl · Schwanz · Zustand · ls · fstab · rauswerfen · weniger · chgrp · chown · rev · suchen · Saiten · Typ · umbenennen · Postleitzahl · entpacken · montieren · ummount · Installieren · fdisk · mkfs · rm · rmdir · rsync · df · gpg · wir · Nano · mkdir · von · ln · Patch · Konvertieren · rclon · Fetzen · SRM
Prozesse alias · Bildschirm · oben · nett · renice · Fortschritt · strace · System · tmux · chsh · Geschichte · beim · Charge · kostenlos · die · dmesg · Benutzermod · ps · chroot · xargs · tty · kleiner Finger · lsof · vmstat · Auszeit · Mauer · ja · töten · Schlaf · sudo · seine · Zeit · groupadd · Benutzermod · Gruppen · lshw · stilllegen · neu starten · halt · ausschalten · passwd · lscpu · crontab · Datum · bg · fg
Vernetzung netstat · Klingeln · Traceroute · ip · ss · Wer ist · fail2ban · bmon · Sie · Finger · nmap · ftp · Locken · wget · Wer · Wer bin ich · In · iptables · ssh-keygen · ufw

VERBUNDEN: Beste Linux-Laptops für Entwickler und Enthusiasten

WEITER LESEN Profilfoto von Dave McKay Dave McKay
Dave McKay benutzte zum ersten Mal Computer, als Lochstreifen in Mode waren, und programmiert seitdem. Nach über 30 Jahren in der IT-Branche ist er heute hauptberuflich Technologiejournalist. Im Laufe seiner Karriere war er als freiberuflicher Programmierer, Leiter eines internationalen Softwareentwicklungsteams, Projektleiter für IT-Services und zuletzt als Datenschutzbeauftragter tätig. Sein Schreiben wurde von howtogeek.com, cloudavvyit.com, itenterpriser.com und opensource.com veröffentlicht. Dave ist ein Linux-Evangelist und Open-Source-Verfechter.
Vollständige Biografie lesen

Interessante Artikel