GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Führt Linux „opportunistisches Swapping“ durch oder ist es ein Theth?

Angenommen, ein Programm fragt nach etwas Speicher, aber es ist nicht genügend freier Speicher übrig. Es gibt verschiedene Möglichkeiten, wie Linux darauf reagieren könnte. Eine Antwort besteht darin, einen anderen verwendeten Speicher auszuwählen, auf den kürzlich nicht zugegriffen wurde, und diesen inaktiven Speicher zum Auslagern zu verschieben.

Ich sehe jedoch viele Artikel und Kommentare, die darüber hinausgehen. Sie sagen, selbst wenn es eine große Menge an freiem Speicher gibt, wird Linux manchmal entscheiden, inaktiven Speicher zum Auslagern zu schreiben. Das vorherige Schreiben auf Swap bedeutet, dass wir, wenn wir diesen Speicher schließlich verwenden möchten, nicht auf einen Schreibvorgang auf der Festplatte warten müssen. Sie sagen, dass dies eine bewusste Strategie zur Leistungsoptimierung ist.

Haben sie Recht? Oder ist es ein Mythos? Geben Sie Ihre Quelle(n) an.

Bitte verstehen Sie diese Frage anhand der folgenden Definitionen:

  • tauschen
  • kostenlos memory – der „freie“ Speicher, der durch den free-Befehl angezeigt wird. Das ist MemFree Wert aus /proc/meminfo . /proc/meminfo ist eine vom Kernel bereitgestellte virtuelle Textdatei. Siehe proc(5) oder RHEL-Dokumentation.
  • selbst wenn viel freier Speicher vorhanden ist – Stellen Sie sich zu Argumentationszwecken vor, dass mehr als 10 % freier Speicher vorhanden sind.

Referenzen

Hier sind einige Suchbegriffe:linux „opportunistic swapping“ ODER (swap „wenn das System nichts Besseres zu tun hat“ ODER „wenn es nichts Besseres zu tun hat“ ODER „wenn das System im Leerlauf ist“ ODER „während der Leerlaufzeit“)

Im zweithöchsten Ergebnis bei Google fragt ein StackExchange-Benutzer „Warum Swap verwenden, wenn mehr als genug freier Speicherplatz im RAM vorhanden ist?“ und kopiert die Ergebnisse von free Befehl, der etwa 20 % freien Speicher anzeigt. Als Antwort auf diese spezielle Frage sehe ich, dass diese Antwort hoch bewertet wird:

Linux beginnt mit dem Auslagern, bevor der Arbeitsspeicher voll ist. Dies geschieht, um
die Leistung und Reaktionsfähigkeit zu verbessern:

  • Die Leistung wird erhöht, da RAM manchmal besser für den Festplattencache als zum Speichern von Programmspeicher verwendet wird. Es ist also besser, ein
    Programm, das eine Weile inaktiv war, auszutauschen und stattdessen häufig verwendete
    Dateien im Cache zu behalten.

  • Die Reaktionsfähigkeit wird verbessert, indem Seiten ausgelagert werden, wenn das System im Leerlauf ist, anstatt wenn der Speicher voll ist und ein Programm ausgeführt wird
    und mehr RAM anfordert, um eine Aufgabe abzuschließen.

Auslagern verlangsamt natürlich das System – aber die Alternative zum
Auslagern ist nicht Auslagern, sondern mehr oder weniger RAM zu haben.

Das erste Ergebnis bei Google wurde als Duplikat der obigen Frage markiert :-). In diesem Fall hat der Fragesteller Details kopiert, die 7 GB MemFree zeigen , von 16 GB. Die Frage hat eine eigene akzeptierte und positive Antwort:

Auslagern nur, wenn kein freier Speicher vorhanden ist, ist nur dann der Fall, wenn Sie swappiness einstellen auf 0. Andernfalls tauscht der Kernel während der Leerlaufzeit den Speicher aus. Dabei werden die Daten nicht aus dem Speicher entfernt, sondern in der Swap-Partition kopiert.

Dies bedeutet, dass, sollte die Situation auftreten, dass der Speicher erschöpft ist, nicht sofort auf die Festplatte geschrieben werden muss. In diesem Fall kann der Kernel einfach die bereits ausgelagerten Speicherseiten überschreiben, von denen er weiß, dass er eine Kopie der Daten hat.

Die swappiness Parameter steuert im Grunde nur, wie viel es tut.

Das andere Zitat behauptet nicht ausdrücklich, dass die ausgelagerten Daten auch im Speicher aufbewahrt werden. Aber es sieht so aus, als würden Sie diesen Ansatz bevorzugen, wenn Sie auch dann tauschen, wenn Sie 20 % freien Speicher haben, und der Grund dafür ist, die Leistung zu verbessern.

Soweit ich weiß, unterstützt Linux das Aufbewahren einer Kopie derselben Daten sowohl im Hauptspeicher als auch im Auslagerungsbereich.

Mir ist auch die allgemeine Behauptung aufgefallen, dass „opportunistisches Austauschen“ „während der Leerlaufzeit“ stattfindet. Ich verstehe, dass es helfen soll, mir zu versichern, dass diese Funktion im Allgemeinen gut für die Leistung ist. Ich schließe dies nicht in meine obige Definition ein, weil ich denke, dass es bereits genug Details enthält, um eine schöne, klare Frage zu stellen. Ich möchte das nicht komplizierter machen, als es sein muss.

Ursprüngliche Motivation

atop zeigt `swout` (Swapping), wenn ich Gigabyte freien Speicher habe. Warum?

Es gibt ein paar Berichte wie diesen, in denen Linux schreibt, dass es ausgetauscht werden soll, wenn genügend freier Speicher vorhanden ist. „Opportunistisches Tauschen“ könnte diese Berichte erklären. Gleichzeitig wurde mindestens eine alternative Ursache vorgeschlagen. Als erster Schritt bei der Suche nach möglichen Ursachen:Führt Linux jemals „opportunistisches Austauschen“ wie oben definiert durch?

In dem von mir gemeldeten Beispiel wurde die Frage nun beantwortet. Die Ursache war kein opportunistisches Austauschen.

Akzeptierte Antwort:

Linux führt kein „opportunistisches Austauschen“ durch, wie in dieser Frage definiert.

Die folgenden Hauptreferenzen erwähnen das Konzept überhaupt nicht:

  1. Linux Virtual Memory Manager verstehen. Ein Online-Buch von Mel Gorman. Geschrieben 2003, kurz vor der Veröffentlichung von Linux 2.6.0.
  2. Documentation/admin-guide/sysctl/vm.rst. Dies ist die primäre Dokumentation der einstellbaren Einstellungen der virtuellen Speicherverwaltung von Linux.
Verwandte:STDERR und STDOUT auf verschiedene Variablen ohne temporäre Dateien umleiten?

Genauer gesagt:

10.6 Pageout-Daemon (kswapd)

Historisch kswapd Früher wurde es alle 10 Sekunden aufgeweckt, aber jetzt wird es nur noch von der physischen Seitenzuweisung geweckt, wenn die pages_low-Anzahl freier Seiten in einer Zone erreicht ist. […] Unter extremem Speicherdruck erledigen Prozesse die Arbeit von kswapd synchron. […] kswapd gibt weiterhin Seiten frei, bis die Höchstgrenze von pages_high erreicht ist.

Auf der Grundlage des oben Gesagten würden wir keinen Austausch erwarten, wenn die Anzahl der kostenlosen Seiten höher als die „High Watermark“ ist.

Zweitens sagt uns dies den Zweck von kswapd ist es, mehr kostenlose Seiten zu erstellen.

Wenn kswapd schreibt eine Speicherseite zum Auslagern, gibt es die Speicherseite sofort frei. kswapd behält keine Kopie der ausgetauschten Seite im Speicher .

Linux 2.6 verwendet „rmap“, um die Seite freizugeben. In Linux 2.4 war die Geschichte komplexer. Wenn eine Seite von mehreren Prozessen gemeinsam genutzt wurde, konnte kswapd sie nicht sofort freigeben. Das ist alte Geschichte. Alle verlinkten Beiträge beziehen sich auf Linux 2.6 oder höher.

Austauschbarkeit

Dieses Steuerelement wird verwendet, um zu definieren, wie aggressiv der Kernel Speicherseiten
austauscht. Höhere Werte erhöhen die Aggressivität, niedrigere Werte
verringern die Swap-Menge. Ein Wert von 0 weist den Kernel an,
keinen Swap einzuleiten, bis die Menge an freien und dateigestützten Seiten erreicht ist ist kleiner
als die High Water Mark in einer Zone.

Dieses Zitat beschreibt einen Sonderfall:wenn Sie die swappiness konfigurieren der Wert sein . In diesem Fall sollten wir außerdem keinen Austausch erwarten, bis die Anzahl der Cache-Seiten auf die High Watermark gefallen ist. Mit anderen Worten, der Kernel wird versuchen, fast den gesamten Datei-Cache zu verwerfen, bevor er mit dem Auslagern beginnt. (Dies kann zu massiven Verlangsamungen führen. Sie benötigen einen Datei-Cache! Der Datei-Cache wird verwendet, um den Code aller Ihrer laufenden Programme zu speichern 🙂

Was sind die Wasserzeichen?

Die obigen Zitate werfen die Frage auf:Wie groß sind die „Wasserzeichen“-Speicherreservierungen auf meinem System? Antwort:Auf einem „kleinen“ System können die Wasserzeichen der Standardzone bis zu 3 % des Speichers betragen. Dies liegt an der Berechnung des „Min“-Wasserzeichens. Auf größeren Systemen sind die Wasserzeichen kleiner und erreichen etwa 0,3 % des Speichers.

Wenn es also um ein System mit mehr als 10 % freiem Speicher geht, sind die genauen Details dieser Wasserzeichenlogik nicht von Bedeutung.

Die Wasserzeichen für jede einzelne „Zone“ werden in /proc/zoneinfo angezeigt , wie in proc(5) dokumentiert. Ein Auszug aus meiner zoneinfo:

Node 0, zone    DMA32
  pages free     304988
        min      7250
        low      9062
        high     10874
        spanned  1044480
        present  888973
        managed  872457
        protection: (0, 0, 4424, 4424, 4424)
...
Node 0, zone   Normal
  pages free     11977
        min      9611
        low      12013
        high     14415
        spanned  1173504
        present  1173504
        managed  1134236
        protection: (0, 0, 0, 0, 0)

Die aktuellen „Wasserzeichen“ sind min , low und high . Wenn ein Programm jemals nach genügend Speicher fragt, um free zu reduzieren unter min , gibt das Programm „direkte Rückforderung“ ein. Das Programm wartet, während der Kernel Speicher freigibt.

Eine direkte Rückforderung wollen wir nach Möglichkeit vermeiden. Also wenn free unter das low fallen würde Wasserzeichen weckt der Kernel kswapd . kswapd gibt Speicher frei, indem Caches ausgetauscht und/oder gelöscht werden, bis free über high liegt wieder.

Zusatzqualifikation:kswapd wird auch ausgeführt, um den vollen lowmem_reserve-Betrag für Kernel-Lowmem- und DMA-Nutzung zu schützen. Die Standardeinstellung für lowmem_reserve beträgt etwa 1/256 der ersten 4 GiB RAM (DMA32-Zone), also normalerweise etwa 16 MiB.

Linux-Code-Commits

mm:Kswapd-Wasserzeichen proportional zum Speicher skalieren

[…]

watermark_scale_factor:

Dieser Faktor steuert die Aggressivität von kswapd. Es definiert die
Menge an Speicher, die in einem Knoten/System verbleibt, bevor kswapd aufgeweckt wird, und
wie viel Speicher frei sein muss, bevor kswapd wieder in den Ruhezustand wechselt.

Die Einheit ist in Bruchteilen von 10.000. Der Standardwert von 10 bedeutet, dass die
Abstände zwischen den Wasserzeichen 0,1 % des verfügbaren Speichers im
Knoten/System betragen. Der Höchstwert ist 1000 oder 10 % des Arbeitsspeichers.

Eine hohe Rate an Threads, die direkt zurückgefordert werden (allocstall) oder kswapd
vorzeitig schlafen geht (kswapd_low_wmark_hit_quickly), kann darauf hindeuten,
dass die Anzahl freier Seiten, die kswapd aus Latenzgründen verwaltet,
zu klein für die im System auftretende Zuordnungsbursts. Dieser Regler
kann dann verwendet werden, um die Aggressivität von kswapd entsprechend einzustellen.

proc:meminfo:verfügbaren Speicher konservativer schätzen

Die MemAvailable Element in /proc/meminfo soll Benutzern einen Hinweis darauf geben, wie
viel Speicher zuweisbar ist, ohne Auslagerungen zu verursachen, also schließt es
die niedrigen Wasserzeichen der Zonen aus, da sie für den Benutzerbereich nicht verfügbar sind.

Für eine Userspace-Zuweisung jedoch kswapd tatsächlich zurückfordern
bis die freien Seiten eine Kombination aus der oberen Grenze und dem Lowmem-Schutz des
Seitenzuordners erreichen, der eine bestimmte Menge an DMA
und DMA32-Speicher auch vom Benutzerbereich fernhält.

Subtrahieren Sie den vollen Betrag, von dem wir wissen, dass er für den Userspace nicht verfügbar ist, von
der Anzahl der freien Seiten, wenn Sie MemAvailable berechnen.

Linux-Code

Es wird manchmal behauptet, dass das Ändern von swappiness zu wird „opportunistisches Swapping“ effektiv deaktivieren. Dies bietet einen interessanten Untersuchungsweg. Wenn es etwas gibt, das „opportunistisches Swappen“ genannt wird und durch Swappiness eingestellt werden kann, dann könnten wir es verfolgen, indem wir alle Aufrufketten finden, die vm_swappiness lesen . Beachten Sie, dass wir unseren Suchraum reduzieren können, indem wir CONFIG_MEMCG annehmen ist nicht gesetzt (d. h. „Speicher-Cgroups“ sind deaktiviert). Die Aufrufkette geht:

  • vm_swappiness
  • mem_cgroup_swappiness
  • get_scan_count
  • shrink_node_memcg
  • shrink_node
Verwandte:Welchen PATH verwendet `sudo `, um nach `` zu suchen?

shrink_node_memcg wird kommentiert:„Dies ist eine grundlegende Seite, die pro Knoten freier ist. Wird sowohl von kswapd als auch von direct reclaim verwendet“. Dh Diese Funktion erhöht die Anzahl der kostenlosen Seiten. Es wird nicht versucht, Seiten zu duplizieren, um sie auszutauschen, damit sie zu einem viel späteren Zeitpunkt freigegeben werden können. Aber selbst wenn wir das außer Acht lassen:

Die obige Kette wird von drei verschiedenen Funktionen aufgerufen, die unten gezeigt werden. Wie erwartet können wir die Call-Sites in Direct Reclaim vs. kswapd. Es wäre nicht sinnvoll, bei der direkten Rückforderung „opportunistisches Austauschen“ durchzuführen.

  1. /*
     * This is the direct reclaim path, for page-allocating processes.  We only
     * try to reclaim pages from zones which will satisfy the caller's allocation
     * request.
     *
     * If a zone is deemed to be full of pinned pages then just give it a light
     * scan then give up on it.
     */
    static void shrink_zones
    
  2.  * kswapd shrinks a node of pages that are at or below the highest usable
     * zone that is currently unbalanced.
     *
     * Returns true if kswapd scanned at least the requested number of pages to
     * reclaim or if the lack of progress was due to pages under writeback.
     * This is used to determine if the scanning priority needs to be raised.
     */
    static bool kswapd_shrink_node
    
  3.  * For kswapd, balance_pgdat() will reclaim pages across a node from zones
     * that are eligible for use by the caller until at least one zone is
     * balanced.
     *
     * Returns the order kswapd finished reclaiming at.
     *
     * kswapd scans the zones in the highmem->normal->dma direction.  It skips
     * zones which have free_pages > high_wmark_pages(zone), but once a zone is
     * found to have free_pages <= high_wmark_pages(zone), any page in that zone
     * or lower is eligible for reclaim until at least one usable zone is
     * balanced.
     */
    static int balance_pgdat
    

Vermutlich ist die Behauptung also, dass kswapd irgendwie aufgeweckt wird, selbst wenn alle Speicherzuweisungen sofort aus dem freien Speicher erfüllt werden. Ich habe mir die Verwendung von wake_up_interruptible(&pgdat->kswapd_wait) angesehen , und ich sehe keine Wakeups wie diese.


Linux
  1. Linux-Speichernutzung

  2. So löschen Sie Speicherpuffer und Cache in Linux

  3. Freier Befehl in Linux mit Beispielen erklärt

  4. Linux free zeigt eine hohe Speicherauslastung, top jedoch nicht

  5. Führt Linux opportunistisches Swapping durch oder ist es ein Mythos?

Linux Free Command (Speichernutzung prüfen)

Kostenloser Befehl unter Linux

Linux Oom zufällig, wenn noch freier Speicher vorhanden ist?

Wie funktioniert Swap-Speicher in Linux?

kostenlose Befehlsbeispiele in Linux

Finden Sie die RAM-Größe in Linux