Irgendwie habe ich zufällig 14 GB Speicher ausgelagert. Nachdem ich den Täter getötet habe, habe ich wieder jede Menge freien Speicherplatz, sodass ich dachte, ich könnte die wichtigen Daten wieder einspielen. Also mit 5 GB von 32 GB und 14 GB Swap-Speicherplatz lief ich swapoff -a
... und 4 Stunden später war ungefähr die Hälfte der Arbeit beendet.
Das bedeutet weniger als 1 MB / s, während ich problemlos 200 MB / s kopieren kann. Mein Swap ist verschlüsselt, genauso wie alle normalen Partitionen. Mit aes-ni wird die CPU nicht merklich ausgelastet (und das Ausfüllen des Swap-Speicherplatzes dauerte nur wenige Minuten). Ich sehe, dass es keinen besonderen Grund gibt, zu optimieren swapoff
, aber ich frage mich, wie es so langsam werden könnte.
Ich füge nur ein paar Daten hinzu: Mein Hauptspeicher ist 32 GB und ich habe 32 GB Swap-Speicherplatz auf jeder der 4 Festplatten (sicherlich ein Overkill, aber wen interessiert das?). Der gesamte Swap-Bereich kann in weniger als 5 Minuten entschlüsselt und gelesen werden:
time -p sudo sh -c 'for i in /dev/mapper/cryptswap?; do md5sum $i & done; wait'
014a2b7ef300e11094134785e1d882af /dev/mapper/cryptswap1
a6d8ef09203c1d8d459109ff93b6627c /dev/mapper/cryptswap4
05aff81f8d276ddf07cf26619726a405 /dev/mapper/cryptswap3
e7f606449327b9a016e88d46049c0c9a /dev/mapper/cryptswap2
real 264.27
Das Lesen eines Teils einer Partition kann nicht langsamer sein als das Lesen aller Teile. Das Lesen von ungefähr 1/10 dauert jedoch ungefähr 100-mal länger.
Ich beobachtete, dass swapoff
sowohl die CPU zum größten Teil im Leerlauf war (vielleicht 10% eines Kerns) als auch die Festplatten ("gemessen" durch die LEDs). Ich habe auch gesehen, dass die Swap-Räume nacheinander abgeschaltet wurden.
iostat -d 5
währendswapoff
auch Low IO auf den Datenträgern angezeigt?Antworten:
Schauen wir uns zunächst an, was Sie von Ihrer Festplatte erwarten können. Ihre Festplatte kann nacheinander 200 MB / s verarbeiten . Wenn Sie Suchzeiten berücksichtigen, kann dies viel langsamer sein. Um ein beliebiges Beispiel auszuwählen, werfen Sie einen Blick auf die technischen Daten einer der modernen 3-TB-Festplatten von Seagate, der ST3000DM001 :
Max. Dauerhafte Datenrate: 210 MB / s
Suchdurchschnittslesung: <8,5 ms
Bytes pro Sektor: 4.096
Wenn Sie nie suchen müssen und sich Ihr Swap in der Nähe des Randes der Festplatte befindet, können Sie mit einer maximalen Rate von 210 MB / s rechnen
Wenn Ihre Swap-Daten jedoch vollständig fragmentiert sind, müssen Sie im schlimmsten Fall nach jedem Sektor suchen, den Sie lesen. Das bedeutet, dass Sie nur alle 8,5 ms 4 KB lesen können, oder 4 KB / 0,0085 = 470 KB / s
Auf Anhieb ist es also nicht unvorstellbar, dass Sie tatsächlich mit Festplattengeschwindigkeiten konfrontiert werden.
Das heißt, es scheint albern, dass
swapoff
es so langsam laufen würde und Seiten in der falschen Reihenfolge gelesen werden müssten, besonders wenn sie schnell geschrieben würden (was eine falsche Reihenfolge impliziert). Aber vielleicht funktioniert der Kernel so. Ubuntu-Fehlerbericht # 486666 behandelt das gleiche Problem:Eine der Antworten war:
Der Fehlerbericht wurde ungelöst geschlossen.
Mel Gormans Buch " Den Linux Virtual Memory Manager verstehen " ist etwas veraltet, stimmt jedoch zu, dass dies ein langsamer Vorgang ist:
Auf der Mailing-Liste für den Linux-Kernel wird ab 2007 etwas mehr darüber diskutiert, was unter dem Thema " Beschleunigung des Swapoffs " zu verstehen ist - obwohl die dort diskutierten Geschwindigkeiten etwas höher sind als die, die Sie sehen.
Es ist eine interessante Frage, die wahrscheinlich im Allgemeinen ignoriert wird, da sie
swapoff
selten verwendet wird. Ich glaube, wenn Sie es wirklich wollen , ausfindig zu machen , ist der erste Schritt der Festplatte Nutzungsmuster mehr würde versuchen , vorsichtig (mit vielleicht zu beobachtenatop
,iostat
oder noch leistungsfähigere Werkzeugen wieperf
odersystemtap
). Dinge, nach denen gesucht werden muss, sind möglicherweise übermäßiges Suchen, kleine E / A-Vorgänge, ständiges Umschreiben und Verschieben von Daten usw.quelle
Ich habe das gleiche Problem mit meinem Laptop gehabt, der eine SSD hat, also sollte das Suchen mal kein Problem sein.
Ich habe eine alternative Erklärung gefunden . Hier ist ein Auszug
Es ist also eher ein Kernelproblem als irgendetwas anderes.
quelle
swapoff
wird es umgesetzt. Wenn der ausgelagerte Prozess beendet wird, dauert es nicht so lange.strace swapoff
so ziemlich alles, was es tut, denswapoff
Systemaufruf aufrufen.Ja, der
swapoff
Mechanismus ist entsetzlich ineffizient. Die Problemumgehung ist einfach: Iterieren Sie über Prozesse, anstatt über die ausgetauschten Seiten zu iterieren. Verwenden Sie dieses Python-Skript (ich bin nicht verbunden):Beachten Sie, dass der Daemon-Betriebsmodus nur für Desktops / Laptops gilt, die häufig in den Ruhezustand versetzt werden. Ich würde es nicht als Daemon auf einem Serversystem ausführen - starte es einfach im Vordergrund, warte, bis es meldet, dass es sich um einige Prozesse gekümmert hat, dann stoppe es und versuche:
Da die meisten Seiten jetzt sowohl im Swap als auch im Memory vorhanden sind,
swapoff
hat das sehr wenig zu tun und sollte jetzt rasant schnell sein (ich habe Hunderte von MB / s gesehen).Geschichte Abschnitt voraus
Das oben erwähnte Python-Skript basiert auf dem Rest dieser Antwort, was wiederum meine Verbesserung dieser älteren Antwort war, die von jlong verfasst wurde . Da das Skript viel sicherer ist, empfehle ich, nur den Rest meiner Antwort als letzte Verteidigungslinie zu versuchen :
Dies läuft vielleicht 2 Sekunden und wird nicht wirklich etwas tun, listen nur die Top 10 der Speichersegmente (tatsächlich druckt mehr Einzeiler, ja , ich tun Einzeiler lieben, nur die Befehle prüfen, akzeptieren das Risiko, Kopieren und Einfügen in Ihre Muschel; diese wird tatsächlich aus Swap lesen).
Der Haupt-Einzeiler ist (für mich) sicher, außer er liest viel / proc.
Die für Ihre manuelle Prüfung vorbereiteten Unterbefehle sind nicht sicher . Jeder Befehl hängt einen Prozess für die Dauer des Lesens eines Speichersegments aus dem Swap. Daher ist es bei Prozessen, die keine Pausen tolerieren, unsicher. Die Übertragungsgeschwindigkeiten, die ich sah, lagen in der Größenordnung von 1 Gigabyte pro Minute. (Das oben erwähnte Python-Skript hat diesen Mangel behoben).
Eine andere Gefahr besteht darin, dass das System zu stark belastet wird. Überprüfen Sie dies mit den üblichen Methoden
free -m
Was tut es?
Die Ausgabe dieses Perl-Skripts ist eine Reihe von
gdb
Befehlen,dump memory (range)
die ausgelagerte Seiten in den Speicher zurückrufen.Die Ausgabe beginnt mit der Größe, daher ist es einfach genug, sie
| sort -Vr | head
zu durchlaufen, um die 10 größten Segmente nach Größe (SSIZE) zu erhalten. Das-V
steht für versionsnummerngerechte Sortierung, funktioniert aber für meinen Zweck. Ich konnte nicht herausfinden, wie die numerische Sortierung funktioniert.quelle
sort -t = -k 2n
/proc/$pid/mem
, suchen und lesen. Der PoC basiert größtenteils auf Ihrem Snippet: gist.github.com/WGH-/91260f6d65db88be2c847053c49be5ae Auf diese Weise wird der Prozess nicht gestoppt, AFAIK, es sollten keine Gefahren entstehen.Wenn während des Auslagerungsvorgangs ein in Verwendung befindlicher Auslagerungsschlitz erkannt wird, wird der Kernel zuerst auf der Seite ausgetauscht. Die Funktion unuse_process () versucht dann, alle Seitentabelleneinträge zu finden, die der gerade ausgelagerten Seite entsprechen, und führt die erforderlichen Aktualisierungen der Seitentabellen durch. Die Suche ist erschöpfend und sehr zeitaufwendig: Sie durchsucht jeden Speicherdeskriptor (des gesamten Systems) und überprüft seine Seitentabelleneinträge nacheinander.
Weitere Informationen finden Sie auf Seite 724 unter "Grundlegendes zum Linux-Kernel 3. Version".
quelle