Linux: Wie kann man alles Mögliche explizit auslagern?


59

Ich habe etwas gestartet, das viel Speicherplatz beansprucht, und jetzt bleibt alles viel zurück. Ich schätze, der Speicher aller Anwendungen wurde ausgetauscht, um Speicherplatz für den speicherintensiven Prozess freizugeben. Jetzt kehrt beim Zugriff langsam alles in den Arbeitsspeicher zurück.

Gibt es eine Möglichkeit, alles Mögliche explizit vom Auslagern zurück in den Arbeitsspeicher zu verschieben? Oder vielleicht nicht alles, sondern nur bestimmte Prozessdaten?

Antworten:


59

Ich würde empfehlen, die normalen Linux-Speichersteuerelemente so zu vertauschen, wie sie tatsächlich verwendet werden.

Das Einzige, woran ich denken kann, ist, Swap aus- und wieder einzuschalten

sudo swapoff -a
sudo swapon -a

Das setzt voraus, dass Sie über genügend physischen Speicher verfügen, um alles im Swap zu speichern ...


4
Es funktioniert sehr langsam :) Danke! Aber ich glaube immer noch, dass es eine elegantere Lösung gibt :)
kolypto

7
Vorsichtig mit dieser Lösung, es wird alles gewaltsam aus dem Swap genommen ... Wenn es nicht in den physischen Speicher passt, startet der Kernel den tödlichen OOM-Killer. Ich kenne keinen netten Befehl "Versuche, alles in den Arbeitsspeicher zu verschieben, aber scheitere, wenn nicht möglich".
Juliano

1
Ich habe es ausprobiert und festgestellt, dass es sehr langsam funktioniert. So ist es möglich, den freien Arbeitsspeicher zu überwachen und zu swapoff
beenden

2
Ich bin mir nicht sicher, ob das Töten von Swapoff die Operation tatsächlich stoppen wird. Kommt darauf an, wie es umgesetzt wird.
Douglas Leeder

2
Es sieht so aus, als ob der Befehl swapoff so etwas wie "Neue Schreibvorgänge nicht austauschen lassen" ausführt, während ein anderer ausgeführter Prozess (der Swap verwendet hat / verwendet) Swap immer noch "freigeben" kann. Das mag der Grund sein, warum es so langsam zu gehen scheint. Es scheint nicht zu OOMs zu führen, wie eine andere Person sagte (ich verwende Ubuntu Bionic) - wahrscheinlich wäre dies nur der Fall, wenn "zusätzliche (oder vorhandene) Prozesse beginnen, neuen Speicher zu verwenden" (dh echte OOMs). Alles in allem ist der Swapoff / Swapon also eine großartige Lösung, wie es scheint. Schonend / stetig. Dies setzt voraus, dass Sie nicht mehr Speicher mithilfe von Prozessen initiieren (oder den Verbrauch in laufenden Prozessen erhöhen).
Roel Van de Paar

12

Sie können das Echo auf eine Zahl zwischen 0 und 100 einstellen /proc/sys/vm/swappiness.

Mit diesem Steuerelement wird festgelegt, wie aggressiv der Kernel die Speicherseiten austauscht. Höhere Werte erhöhen die Aggressivität, niedrigere Werte verringern den Swap-Betrag . Der Wert 0 weist den Kernel an, den Austausch erst dann zu starten, wenn die Anzahl der freien und dateibasierten Seiten in einer Zone unter der Höchstgrenze liegt.

Der Standardwert ist 60.


13
Verwenden Sie / proc / sys nicht direkt, sysctlsondern verwenden Sie stattdessen den Befehl. In diesem Fall ist es sysctl vm.swappiness=x.
Juliano

7
Ich glaube nicht, dass selbst ein Swap von Null dazu führt, dass Seiten, die bereits ausgetauscht wurden, explizit in den Hauptspeicher verschoben werden.
Douglas Leeder

1
@Douglas ist richtig. vm.swappiness steuert hauptsächlich die Entscheidung, ob Objekte verschoben oder die Anzahl der Caches und Puffer verringert werden sollen, wenn Speicherbedarf besteht.
Juliano

@ Juliano, warum sollte / proc / sys nicht verwendet werden?
James

@James Da / proc / sys die untergeordnete Schnittstelle ist, die zum Ändern und Abfragen der Kernelkonfiguration verwendet wird (dies ist "Implementierungsdetail"). Linux bietet den übergeordneten sysctlBefehl für die Benutzerinteraktion. Das Endergebnis ist dasselbe, aber normalerweise werden Schnittstellen auf höherer Ebene bevorzugt, damit der Benutzer direkt interagieren kann. Ein bisschen wie das Starten des Motors durch Kurzschließen der Zündkabel (niedrigere Stufe), anstatt nur den Schlüssel zu drehen (höhere Stufe).
Juliano,

5

Linux erledigt einen guten Job in der Speicherverwaltung und Sie sollten nicht im Weg stehen. Die zuvor erwähnte vm.swappiness-Einstellung steht nicht im Weg. Es ist wahrscheinlicher, dass seltsame Probleme auftreten, wenn Sie Dinge auf andere Weise tun.

Was hast du gestartet, das so speicherhungrig war? Kann es gestimmt werden? Wenn es keine eigenen Direktiven für die Speicherbegrenzung gibt, können Sie sich auch ulimit ansehen.


In meinem Fall war es das convert -density 200 file.pdf jpegs/file.jpg. Aus irgendeinem Grund verbraucht es viel Speicher, aber Sie haben Recht: Es kann eingestellt werden. Wie auch immer, die Situation ist mit jeder Anwendung möglich :)
kolypto

1
Ich stimme dieser Antwort zu - Sie sollten wahrscheinlich den normalen Betrieb der Maschine verlassen, um das einzutauschen, was tatsächlich benötigt wird.
Douglas Leeder

converthat das -limitArgument, den Arbeitsspeicher im Vergleich zur Festplattennutzung zu steuern, und Sie sollten sie nachlesen. Einstellung -limit memory 512MBoder ähnliches wäre gut. Es wäre wahrscheinlich auch gut, einen expliziten MAGICK_TEMPORARY_PATH anzugeben und diesen nach Abschluss Ihres Befehls zu bereinigen.
Slacy

3

Wenn Sie den Speicher für alle Ihre Anwendungen zur Verfügung haben, ist es in Ordnung, die Auslagerungszeit auf 0 zu setzen, damit die Dinge nicht ausgelagert werden. Zum Beispiel ist qemu-kvm ein großes Ziel, das der VMM austauschen soll, da er die meiste Zeit im Leerlauf zu sein scheint. Ich habe gesehen, dass bis zu 80% des Speichers eines qemu-kvm-Speichers in den Swap geschrieben werden. Die VMs, die in qemu-kvm ausgeführt werden, reagieren fast nicht mehr, weil ihnen der Swap ausgeht (obwohl der Gast keine Ahnung hat, dass dies geschieht). Die Gast-VM wird denken, dass sie am besten abschneidet, obwohl sie in Wahrheit furchtbar schleppt. Wenn mehrere VMs "aufwachen" und anfangen, Dinge zu tun, kann die durchschnittliche Auslastung sogar auf Hardware der Enterprise-Klasse mit ausreichend schnellem Arbeitsspeicher und Festplatte auf über 30 steigen. Ich denke, dies ist ein Fehler im sofort einsatzbereiten qemu-kvm-Design.

Hoffe das hilft jemandem.


Ich fürchte, das ist nicht ganz richtig.
Marc.2377

2

Ich würde davon abraten, das VM-Subsystem im Kernel zu überdenken. Es ist EXTREM unwahrscheinlich, dass Sie tatsächlich über genügend Informationen verfügen, um bessere Entscheidungen zu treffen, als dies der Fall ist. Und wenn Sie es irgendwie erzwingen, das Falsche zu tun, werden Sie die Dinge am Ende nur noch langsamer machen.


9
Es gibt einige Fälle, in denen ich tun möchte, was das OP will. Wenn ich versehentlich einen Prozess außer Kontrolle geraten lasse und meinen gesamten Arbeitsspeicher + Swap aufnehme, kann ich jedes Mal, wenn ich die Anwendung wechsle, 15 Sekunden warten, bis der Arbeitsspeicher aus dem Swap kommt, oder es einfach erzwingen und alles so schnell wie gewöhnlich ablaufen lassen.
Alex

1

Wenn Sie in der Lage sind, das System neu zu starten, sollte dies der Fall sein (und möglicherweise viel weniger Zeit in Anspruch nehmen, als wenn Sie eine andere Lösung ausprobieren).


1

Um einen Teil meiner Antwort von dieser Frage zu kopieren .

Damit Sie wissen, wie das swappiness tunable funktioniert. Dies funktioniert, indem das VM-Subsystem angewiesen wird, nach auszutauschenden Seiten zu suchen, wenn der Prozentsatz des Speichers, der den Prozessseitentabellen zugeordnet ist, + der Austauschwert> 100 ist. Bei einer Einstellung von 60 beginnt das System, veraltete Seiten aus der Prozessseitentabelle auszulagern wenn mehr als 40% des Arbeitsspeichers Ihres Systems belegt sind. Wenn Sie Ihren Programmen erlauben möchten, auf Kosten des Caches mehr Speicher zu verwenden, sollten Sie den Swap-Wert verringern.


Ich denke nicht, dass Programmspeicher oder Cache das Problem ist - ich denke, es ist Anwendungsspeicher oder nicht genutzter Speicher. Und ich denke nicht, dass Swappiness das beeinflussen wird.
Douglas Leeder

0

Läuft der Prozess noch? Öffnen Sie ein Terminal und prüfen Sie, ob Sie die gestarteten Prozesse erkennen können. (ps aux | grep processname macht es möglicherweise etwas einfacher.) Verwenden Sie kill -9 PID, um sie auszuschalten, wenn sie noch ausgeführt werden. Pass auf, was du tötest. Wenn Sie nicht wissen, was der Prozess ist, töten Sie ihn nicht! Stellen Sie auch die Ausgabe von free -m bereit, damit wir sehen können, ob Sie tatsächlich noch viel Swap verwenden.

Wenn die Dinge immer noch langsam laufen, läuft möglicherweise immer noch, was Sie gestartet haben. Ich würde den Swap niemals ausschalten, wenn Sie nicht wirklich wissen, was Sie tun oder wenn Sie am Rande leben möchten. =)


0

Ich glaube, dass es keine wirklich gute Möglichkeit gibt, Linux zu zwingen, Daten vom Datenträger in den Arbeitsspeicher zu verschieben. Wenn swapoff / swapon eine funktionierende Lösung ist, es aber schmutzig ist und Ihr System leicht instabil machen kann. In den Fällen, in denen Sie mehr Daten im Swap als im freien Speicher haben, ist es schwer vorstellbar, mit welchen effizienten Richtlinien Linux entscheidet, welche Daten in den Speicher verschoben werden und welche auf der Festplatte bleiben.

Zusammenfassung: Lassen Sie Linux einfach nach und nach seine Leistung auf normale Weise wiederherstellen. Das VM-Subsystem ist so organisiert, dass es bestrebt ist und sich ständig in einen idealen ausgeglichenen Zustand bewegt.


-2

Puffer-Cache leeren

Wenn Sie sie jemals leeren möchten, können Sie diese Befehlskette verwenden.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Sie können dem Linux-Kernel signalisieren, verschiedene Aspekte von zwischengespeicherten Elementen zu löschen, indem Sie das numerische Argument in den obigen Befehl ändern.

HINWEIS: Bereinigen Sie den Speicher von unnötigen Dingen (Kernel 2.6.16 oder neuer). Stellen Sie immer sicher, dass Sie zuerst die Synchronisierung ausführen, um nützliche Dinge auf die Festplatte zu übertragen !!!

  • So geben Sie den Pagecache frei:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • So befreien Sie Einträge und Inodes:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • So geben Sie Pagecache, Einträge und Inodes frei:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Die oben genannten sollen als root ausgeführt werden. Wenn Sie versuchen, sie mit sudo zu erstellen, müssen Sie die Syntax leicht ändern:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.