Frage Linux: Wie kann man alles, was möglich ist, explizit ungeschehen machen?


Ich habe etwas gestartet, das viel Speicherbedarf hat und jetzt ist alles viel zu spät. Ich vermute, dass der Speicher aller Anwendungen ausgetauscht wurde, um Speicherplatz für den speicherintensiven Prozess freizumachen, und nun kehrt langsam alles in den Arbeitsspeicher zurück, wenn auf sie zugegriffen wird.

Gibt es eine Möglichkeit, alles, was möglich ist, explizit vom Arbeitsspeicher in den Arbeitsspeicher zu verschieben? Oder vielleicht nicht alles, sondern nur bestimmte Prozessdaten?


55
2018-02-07 18:24


Ursprung


Ich würde empfehlen, nur normale Operationen zuzulassen, um das zu ersetzen, was tatsächlich benötigt wird, anstatt manuell irgendetwas zu tun. - Douglas Leeder


Antworten:


Ich würde empfehlen, den normalen Linux-Speichersteuerungsaustausch in den Dingen zuzulassen, die tatsächlich verwendet werden, wenn sie 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 genug physischen Speicher haben, um alles in Swap zu enthalten ...


55
2018-02-07 18:38



Es funktioniert, sehr langsam aber :) Danke! Aber trotzdem glaube ich, dass es eine elegantere Lösung gibt :) - kolypto
Vorsichtig mit dieser Lösung, wird es alles gewaltsam aus dem Swap nehmen ... wenn es nicht in den physischen Speicher passt, wird der Kernel den tödlichen OOM Killer starten. Ich kenne keinen netten "Versuch, alles in den RAM-Speicher zu verschieben, aber fälle geschickt, wenn nicht möglich" -Befehl. - Juliano
Ich habe es ausprobiert und herausgefunden, dass es sehr langsam funktioniert. So ist es möglich, den freien RAM zu überwachen und zu töten swapoff Wenn der Speicher niedrig wird: In diesem Fall bleibt der Auslagerungsspeicher funktionsfähig :) - kolypto
Ich bin mir nicht sicher, ob das Töten von Swapoff die Operation tatsächlich stoppt. Hängt davon ab, wie es implementiert ist. - Douglas Leeder
Es scheint, dass der swapoff-Befehl etwas wie "keine neuen Schreibvorgänge zum Tauschen" ausführt, während ein anderer laufender Prozess (der / der swap verwendet hat) immer noch "swap freigeben" kann. Dies könnte der Grund sein, warum es so langsam zu gehen scheint. Es scheint keine OOMs zu verursachen, wie eine andere Person sagte (ich benutze Ubuntu Bionic) - wahrscheinlich wäre das nur der Fall, wenn "zusätzliche (oder existierende) Prozesse anfangen, neuen Speicher zu verwenden" (d. H. Echte OOMs). Alles in allem ist der Swapoff / Swapon eine großartige Lösung. Sanft / beständig. Dies setzt voraus, dass Sie nicht mehr Speicher mit Prozessen initiieren (oder den Verbrauch in laufenden erhöhen). - Roel


Sie können es tuning Echoing eine Zahl zwischen 0 bis 100 in /proc/sys/vm/swappiness.

Mit diesem Steuerelement wird definiert, wie aggressiv der Kernel ausgetauscht wird   Speicherseiten. Höhere Werte erhöhen die Agressivität, niedrigere Werte   Verringern Sie den Betrag des Swaps. Ein Wert von 0 weist den Kernel an, dies nicht zu tun   initiieren Sie den Austausch, bis die Anzahl der freien und dateiunterstützten Seiten geringer ist   als die Hochwassermarke in einer Zone.

Der Standardwert ist 60.


11
2018-02-07 18:31



Verwenden Sie nicht / proc / sys direkt, verwenden Sie die sysctl Befehl stattdessen. In diesem Fall ist es sysctl vm.swappiness=x. - Juliano
Ich glaube nicht, dass selbst eine Schwankung von Null dazu führt, dass Seiten, die bereits ausgetauscht wurden, explizit in den Hauptspeicher gebracht werden. - Douglas Leeder
@ Douglas hat Recht. vm.swappiness steuert hauptsächlich die Entscheidung, ob Dinge verschoben werden oder die Menge an Caches und Puffern reduziert wird, wenn Speicher angefordert wird. - Juliano
@Juliano, warum sollte / proc / sys nicht verwendet werden? - James
@James Weil / proc / sys die Schnittstelle der unteren Ebene ist, die verwendet wird, um die Kernel-Konfiguration zu ändern und abzufragen (es ist "Implementierungsdetail"). Linux bietet die höhere Ebene sysctl Befehl für Benutzerinteraktion. Das Endergebnis ist das gleiche, aber normalerweise werden Interfaces auf höherer Ebene bevorzugt, damit der Benutzer direkt interagieren kann. Etwas wie das Starten des Motors durch Kurzschließen der Zündkabel (unteres Niveau), anstatt nur den Schlüssel zu drehen (höheres Niveau). - Juliano


Linux erledigt die Verwaltung von Arbeitsspeicher sehr gut und Sie sollten ihm nicht in die Quere kommen. Die zuvor erwähnte vm.swappiness-Einstellung kommt nicht in die Quere. Es ist wahrscheinlicher, dass seltsame Probleme auftreten, wenn Sie die Dinge anders machen.

Was hast du gestartet, das so speicherhungrig war? Kann es gestimmt werden? Wenn es keine eigenen Speicherlimit-Direktiven hat, können Sie auch ulimit betrachten.


5
2018-02-08 03:25



In meinem Fall war es convert -density 200 file.pdf jpegs/file.jpg. Aus irgendeinem Grund verwendet es viel Speicher, aber Sie haben Recht: Es kann abgestimmt werden. Wie auch immer, die Situation ist mit jeder Anwendung möglich :) - kolypto
Ich stimme dieser Antwort zu - Sie sollten wahrscheinlich den normalen Betrieb auf dem Gerät lassen, um das zu tauschen, was tatsächlich benötigt wird. - Douglas Leeder
convert hat die -limit Argument, um seinen Speicher vs. Festplattennutzung zu steuern, und Sie sollten sich darüber informieren. Rahmen -limit memory 512MB oder ähnliches wäre gut. Es wäre wahrscheinlich auch gut, einen expliziten MAGICK_TEMPORARY_PATH anzugeben und diesen nach dem Befehl zu bereinigen. - slacy


Wenn Sie den Speicher für alle Ihre Anwendungen zur Verfügung haben, ist es in Ordnung, swappiness auf 0 zu setzen, damit die Dinge nicht ausgetauscht werden. Zum Beispiel ist qemu-kvm ein großes Ziel, das VMM auszulagern, weil es "scheint", die meiste Zeit im Leerlauf zu sein. Ich habe gesehen, dass bis zu 80% des Speichers eines qemu-kvm-Speichers zum Tauschen geschrieben werden. Die VMs, die in qemu-kvm ausgeführt werden, werden fast nicht mehr reagieren, da sie keinen Swap mehr haben (obwohl der Gast nicht weiß, dass dies der Fall ist). Die Gast-VM wird denken, dass sie am besten funktioniert, obwohl sie in Wahrheit furchtbar mitzieht. Wenn ich eine Reihe von VMs "aufwache" und anfange, Dinge zu tun, kann es den Lastdurchschnitt auf über 30 erhöhen, sogar auf Hardware von Unternehmen mit reichlich schnellem Speicher und Festplatte. Ich schätze, das ist ein Fehler im Out-of-the-Box-qemu-kvm-Design.

Hoffe, das hilft jemandem.


3
2017-07-17 13:33





Wenn Sie in der Lage sind, das System neu zu starten, das es tun sollte (und möglicherweise viel weniger Zeit in Anspruch nimmt, als eine andere Lösung auszuprobieren).


1
2018-02-07 23:46





Um etwas von meiner Antwort zu kopieren diese Frage.

Damit Sie wissen, wie das Swappiness-Tunable funktioniert. Dies bedeutet, dass das VM-Subsystem aufgefordert wird, nach Seiten zu suchen, die ausgetauscht werden sollen, wenn der Prozentsatz des Speichers, der den Prozess-Seitentabellen + Swappiness-Wert zugeordnet ist,> 100 ist. Eine Einstellung von 60 bewirkt also, dass veraltete Seiten aus der Prozess-Seitentabelle ausgelagert werden wenn es mehr als 40% des Speichers Ihres Systems verwendet. Wenn Sie möchten, dass Ihre Programme mehr Speicher auf Kosten des Cache verwenden, sollten Sie den Swappiness-Wert verringern.


1
2018-02-08 04:23



Ich denke nicht, Programm-Speicher vs Cache ist hier das Problem - ich denke, es ist Anwendungsspeicher vs. ungenutzten Speicher. Und ich glaube nicht, dass Swappiness das beeinflussen wird. - Douglas Leeder


Ich würde davon abraten, das VM-Subsystem im Kernel zu überdenken. Es ist EXTREM unwahrscheinlich, dass Sie tatsächlich genug Informationen haben, um bessere Entscheidungen zu treffen. Und wenn du es irgendwie zwingst, das Falsche zu tun, dann wirst du am Ende die Dinge noch langsamer machen.


1
2018-02-08 14:18



Es gibt einige Fälle, wo ich tun will, was das OP will. Wenn ich versehentlich einen Prozess laufen lasse und all meinen RAM + Swap aufnehme, kann ich entweder 15 Sekunden warten, jedes Mal, wenn ich Anwendungen vertausche, um aus dem Swap zu kommen, oder zwinge es einfach und lasse alles so schnell wie üblich laufen. - Alex
@Alex +1 für die ausdrückliche Erwähnung des gültigen Anwendungsfalls, den wir alle in unseren Köpfen haben. - Vortico


Läuft der Prozess noch? Öffnen Sie ein Terminal und sehen Sie, ob Sie den Prozess, der gestartet wurde, sehen können. (ps aux | grep Prozessname könnte es etwas einfacher machen) Verwenden Sie kill -9 PID, um sie auszuschalten, wenn sie noch laufen. Sei vorsichtig mit dem, was du tötest. Wenn Sie nicht wissen, was der Prozess ist, töten Sie es nicht! Schreiben Sie auch die Ausgabe von free -m, damit wir sehen können, ob Sie tatsächlich noch viel Swap verwenden.

Wenn die Dinge noch immer langsam laufen, können Sie immer noch das ausführen, was Sie gestartet haben. Ich würde den Swap niemals ausschalten, außer du weißt wirklich, was du tust, oder du magst es, am Rand zu leben. =)


0
2018-02-08 04:02





Ich glaube, dass es keine wirklich gute Möglichkeit gibt, Linux zu zwingen, Daten von der Festplatte in den Speicher zu verschieben. Wenn swapoff / swapon eine funktionierende Lösung ist, aber es ist schmutzig und kann Ihr System leicht instabil machen. Für den Fall, dass Sie mehr Daten im Swap als im freien Speicher haben, ist es schwierig, sich eine effiziente Richtlinie vorzustellen, mit der Linux entscheiden kann, welche Daten in den Speicher gelangen und welche Teile auf der Festplatte gespeichert werden.

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


0
2017-10-13 13:52





Leeren des Puffer-Cache

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 zwischengespeicherter Elemente zu löschen, indem Sie das numerische Argument in den obigen Befehl ändern.

HINWEIS: Bereinige 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 !!!

  • Um den Seitencache freizugeben:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Um Dentrys und Inodes zu befreien:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Um Seitencache, Dentries und Inodes zu befreien:

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

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

$ 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'

-1
2018-04-15 14:45