Wie kann Windows so schnell den gesamten Arbeitsspeicher in der Ruhezustandsdatei sichern?


65

Ich habe einen Artikel durchgearbeitet, in dem die Vorgehensweise im Ruhezustand in Microsoft Windows erläutert wurde. Die wichtigsten Punkte, die ich dabei heraushole, sind:

  1. Windows speichert den gesamten Arbeitsspeicher (möglicherweise nach der Verarbeitung) in der hiberfil.sysDatei.
  2. Während des Hochfahrens wird die Ruhezustandsdatei gelesen und der Inhalt in den RAM geladen.

Meine Frage ist, wenn ich normalerweise eine Datei mit einer Größe von 1 GB kopiere, dauert es ungefähr 2 Minuten, bis sie fertig ist.

Allerdings , wenn Windows die Überwinterungsdatei (im Ruhezustand Verfahren) schreiben, der gesamte Prozess dauert vielleicht 10 bis 15 Sekunden. Warum ist die Schreibgeschwindigkeit so unterschiedlich?

Meine RAM-Größe beträgt 4 GB. (Ich spreche nicht von Fast-Boot-Technologie.)

Benchmarks:

  1. Kopieren einer 1-GB-Datei von Datenträger 1 auf Datenträger 2 (extern): 2,3 Minuten.
  2. Ruhezustand des Systems: 15 Sekunden.

3
Ich kenne die Antwort nicht, aber ich wette, wenn Sie das Buch Windows Internals "Chapter 13: Startup and Shutdown" überprüft haben, würde es Ihnen sagen (wenn ich das Buch selbst hätte, würde ich es überprüfen).
Scott Chamberlain

2
Das ist eine gute Frage. Als der Ruhezustand 1998 zum ersten Mal implementiert wurde, war er bei weitem nicht so schnell.
Gabe

22
@coder: Das NT-System stellt sicher, dass hyberfil.sys den gesamten zugewiesenen Speicherplatz hat und dass die gesamte Datei nicht fragmentiert ist. In diesem Zustand treten während des Betriebs keine Kopfsprünge auf der Festplatte auf. So erhalten Sie effektive Geschwindigkeiten von 150Mo / s. Sie können überprüfen, was ich gesagt habe fsutil.
user2284570

3
Externe Festplatte ist in der Regel auch langsamer als interne Festplatte.
Harry Johnston

2
@EricLippert - es speichert mit Sicherheit nicht den gesamten Arbeitsspeicher, aber das erklärt es immer noch nicht. Ich habe regelmäßig einige Gigabyte an aktivem RAM, die gespeichert werden müssen (VS2013 oder Eclipse + einige Dinge erfordern viel RAM), und sie werden mit einer Geschwindigkeit gespeichert, die mir größer erscheint als die theoretische Schreibgeschwindigkeit meiner Nicht-SSD Fahrt.
Davor

Antworten:


45

Dies ist wahrscheinlich eine dreifache Antwort.

Eine Sache, die hier möglicherweise im Spiel ist, ist das neue Herunterfahren von Hybriden in Windows, das Ihre Anwendungen effektiv schließt, Sie abmeldet und dann den Kern des Betriebssystems in den Ruhezustand versetzt. Das Speichern dieser Daten würde bedeuten, dass sie möglicherweise nicht erneut in den Ruhezustand versetzt werden müssen.

Das zweite wäre, dass der Ruhezustand keine Speicherseiten speichern müsste, die entweder in die Auslagerungsdatei ausgelagert oder nicht verwendet werden (dies wäre ein Grund, die Auslagerungsdatei aggressiv zu füllen und auch Daten im Speicher zu halten). .

Das dritte wäre, dass die Daten der Ruhezustandsdatei ebenfalls komprimiert werden . Kombiniere das mit meinem zweiten Punkt und wenn du nur einen kleinen Satz von Daten zum Exportieren hast, der stark komprimierbare Daten enthält (ausführbare Dateien werden im Allgemeinen gut komprimiert), kann die Datenmenge, die in die Ruhezustandsdatei ausgegeben werden soll, wesentlich kleiner sein als die Arbeitsmenge von Dateien. Beachten Sie, dass, wie in den Kommentaren angegeben, Datei-Caches und andere unnötige Pufferdaten leicht und ohne negative Auswirkungen gelöscht werden können, um die Datenmenge zu verringern, die in der Ruhezustandsdatei gespeichert werden muss.

Darüber hinaus sind aktuelle Festplatten recht schnell. Mit einer Festplatte mit einem dauerhaften Schreibzugriff in der Größenordnung von 100 MB / s können Sie 4 GB RAM (unkomprimiert) in weniger als einer Minute ausgeben. Da der Ruhezustand als letztes nach dem Anhalten aller Benutzerprozesse und vor dem Anhalten der CPU erfolgen kann, verfügt das Betriebssystem im Allgemeinen über die volle Schreibgeschwindigkeit der Festplatte. Dies ist eine Sache, die Ihr einfacher Benchmark nicht hat, und das Kopieren von Festplatte zu Festplatte ist möglicherweise langsamer als das einfache Schreiben von RAM auf Festplatte.

Kombinieren Sie diese Dinge und die Datenmenge, die in die Ruhezustandsdatei geschrieben werden soll, könnte recht klein sein, möglicherweise in der Größenordnung von 1 GB, und würde wahrscheinlich in weniger als 10 Sekunden in einen großen fortlaufenden Block geschrieben.


37
Oder um es klarer zu machen: Ihr RAM ist wahrscheinlich nicht voll. Die Puffer werden geleert und der Cache wird im Ruhezustand gelöscht. Nur der von Anwendungen tatsächlich verwendete Speicher muss auf die Festplatte geschrieben werden. Durch das hybride Herunterfahren wird die Menge des verwendeten Speichers reduziert, indem der Benutzer abgemeldet wird.
Daniel B

2
Seiten, die nicht verschmutzt sind, sind eine allgemeinere Aussage von "in die Auslagerungsdatei ausgelagert", dies würde ausführbare Dateien einschließen. (Da die ausführbaren Dateien auf der Festplatte etwas fragmentiert sind, kann dies das Aufwecken verlangsamen.) Außerdem können saubere Dateipuffer möglicherweise einfach gelöscht werden, selbst wenn sie nicht Teil einer Speicherzuordnungsdatei sind.
Paul A. Clayton

3
@ user2284570 aus dem Dokument, das ich in dieser Antwort verlinkt habe "Windows unterstützt den Ruhezustand, indem der Inhalt des Speichers auf die Festplatte kopiert wird. Das System komprimiert den Speicherinhalt, bevor er auf der Festplatte gespeichert wird.
Mokubai

4
@ user2284570: Das liegt daran, dass das Worst-Case-Szenario eine 1: 1-Komprimierung ist. Windows muss sicherstellen, dass in hyberfil.sys genügend (reservierter) Speicherplatz für eine mögliche Speicherkonfiguration vorhanden ist - auch wenn für einen bestimmten Ruhezustand nur ein Zehntel der RAM-Größe benötigt wird. Hinzu kommt, dass ein beträchtlicher Teil des Arbeitsspeichers aus Dateien besteht, die in den Arbeitsspeicher geladen werden (ausführbare Dateien, Ressourcen ...), aber immer noch von der Festplatte zugeordnet sind, und dass Sie in der Tat viel Schreibarbeit sparen können. Lassen Sie ein Programm 4 GB Krypto-Zufallsdaten im RAM generieren, und der Ruhezustand dauert erheblich länger - und selbst dann könnte ein Teil davon im Swap-Modus gewesen sein.
Luaan

3
@ user2284570: Die Datei ist so groß, dass auf der Festplatte ausreichend Speicherplatz vorhanden ist. Nicht der gesamte Speicherplatz wird im Ruhezustand verwendet. Manchmal enthält die Datei (sagen wir) 7% komprimierten Speicherinhalt und 93% Junk.
Psmears

31

Erstens ist die Menge an RAM, die eingespart werden muss, überraschend gering. Tatsächlich muss nur der Satz zugeordneter unsauberer Seiten ("Lazy Writeback") gelöscht werden, und alle privaten Seiten, die in ausführbaren Code geschrieben und an einen anderen Ort verschoben wurden, müssen geschrieben werden.

  • Die .text-Segmente von ausführbaren Dateien werden immer durch eine Dateizuordnung gesichert. Dies gilt zumindest auch für einige DLLs (aber nicht für alle, hängt davon ab, ob sie verschoben werden müssen).
  • Speicher, der auf ähnliche Weise durch Dateizuordnungen gesichert ist, kann verworfen werden (vorausgesetzt, er ist nicht CoW oder RW und verschmutzt).
  • Lazy Writeback muss weiterhin durchgeführt werden, aber ansonsten können Caches verworfen werden.
  • Speicher, der reserviert, aber nicht beschrieben wurde (normalerweise der größte Teil der Anwendungsdaten!), Wird durch die Nullseite gesichert und kann verworfen werden.
  • Der größte Teil der Speicherseiten, die sich im "Standby" -Status befinden (der tatsächliche prozessspezifische Arbeitsspeicher unter Windows ist überraschend klein, nur 16 MB), wurde irgendwann in die Auslagerungsdatei im Hintergrund kopiert und kann verworfen werden .
  • Speicherbereiche, die von bestimmten Geräten wie der Grafikkarte zugeordnet wurden, müssen (möglicherweise) nicht gespeichert werden. Benutzer sind manchmal überrascht, dass sie 8GiB oder 16GiB an einen Computer anschließen und 1GiB oder 2GiB ohne ersichtlichen Grund einfach "weg" sind. Die wichtigsten Grafik-APIs setzen voraus, dass Anwendungen in der Lage sind, Pufferinhalte "unter bestimmten Umständen" ungültig zu machen (ohne genau zu sagen, was dies bedeutet). Es ist daher nicht unangemessen zu erwarten, dass der vom Grafiktreiber festgelegte Speicher ebenfalls einfach verworfen wird. Immerhin wird der Bildschirm sowieso dunkel.

Zweitens, im Gegensatz zum Kopieren einer Datei, besteht das Speichern der zu speichernden RAM-Seiten aus einem einzelnen sequentiellen, zusammenhängenden Schreibvorgang aus Sicht des Laufwerks. Die Win32-API stellt für diesen Vorgang sogar eine Funktion auf Benutzerebene zur Verfügung. Gather Write wird direkt von der Hardware unterstützt und arbeitet so schnell, wie die Festplatte Daten physisch aufnehmen kann (der Controller ruft Daten direkt über DMA ab).
Es gibt eine Reihe von Voraussetzungen dafür (wie Ausrichtung, Blockgröße, Fixieren), und es spielt keine Rolle beim Zwischenspeichern, und es gibt kein "Lazy Writeback" (was im Normalbetrieb eine sehr wünschenswerte Optimierung ist) ).
Das ist der Grund, warum nicht jeder schreibtfunktioniert die ganze Zeit so. Wenn das System jedoch die Ruhezustandsdatei speichert, sind alle Voraussetzungen automatisch erfüllt (alle Daten sind seitenausgerichtet, seitengroß und gepinnt), und das Zwischenspeichern ist gerade irrelevant geworden, weil der Computer in einem Moment ausgeschaltet wird.

Drittens ist das Ausführen eines einzelnen zusammenhängenden Schreibvorgangs sowohl für rotierende als auch für Solid-State-Festplatten sehr vorteilhaft .

Die Auslagerungsdatei und die Ruhezustandsdatei gehören normalerweise zu den frühesten Dateien, die auf der Festplatte erstellt und reserviert wurden. Sie haben normalerweise ein, höchstens zwei Fragmente. Sofern also keine Sektoren beschädigt sind und die Festplatte physische Sektoren neu zuordnen muss, wird ein logischer sequentieller Schreibvorgang in einen physischen sequentiellen Schreibvorgang auf einer sich drehenden Festplatte umgewandelt.

Es sind keine Lese-, Änderungs- und Schreibvorgänge auf der Festplatte erforderlich, wenn eine große Menge aufeinanderfolgender, zusammenhängender Daten geschrieben wird. Dieses Problem ist auf sich drehenden Festplatten weniger ausgeprägt, die einzelne Sektoren schreiben können, die recht klein sind. (Vorausgesetzt, Sie schreiben keine einzelnen Bytes, was in der Regel durch Caching verhindert wird, muss das Gerät den ursprünglichen Inhalt nicht abrufen und die geänderte Version zurückschreiben.) .
Dies ist jedoch auf SSD sehr auffällig, da bei jedem Schreibvorgang z. B. ein 512-KB-Block (das ist eine übliche Zahl, die jedoch größer sein kann) vom Controller gelesen, geändert und auf einen anderen zurückgeschrieben werden muss Block. Du kannst zwar prinzipiell schreiben (aber nicht überschreiben) kleinere Einheiten auf Flash-Disks, man kann immer nur riesige Blöcke löschen, so funktioniert die Hardware. Dies ist der Grund, warum SSDs bei großen sequenziellen Schreibvorgängen so viel besser abschneiden.


Selbst wenn eine DLL verschoben wird, ist das Einzige, was erforderlich ist, um sie zurückzubringen, die verschobene Adresse. Die Verlagerung ist ein deterministischer Prozess und kann wiederholt werden.
MSalters

"Schreiben sammeln"? Meinst du "Lieber schreiben"?
Peter Mortensen

3
@ PeterMortensen: Nein, ich meine wirklich sammeln schreiben (im Gegensatz zu Scatter Read). Dies bedeutet, in eine einzelne Datei zu schreiben, während die Daten von mehreren Orten gesammelt werden . Sie stellen ein Array von Strukturen bereit, von denen jede eine Startadresse und eine Länge enthält (mit strengen Ausrichtungsanforderungen). Das Betriebssystem leitet diese an den Controller weiter, den Rest übernimmt die Hardware.
Damon

1
@MSalters: Bei einem Umzug wird jedoch eine private Kopie der Seite erstellt, und es ist äußerst schwierig festzustellen, ob andere Änderungen an der privaten Kopie vorgenommen wurden. Vergleichen Sie die Zuordnungen, für die keine Korrektur erforderlich war, und verwenden Sie Copy-on-Write. Wenn andere Änderungen vorgenommen werden, wird eine private Kopie erstellt. Wenn nicht, wird die Seite immer noch für CoW konfiguriert.
Ben Voigt

1
@MSalters Möglicherweise handelt es sich um einen deterministischen Prozess, dies bedeutet jedoch nicht, dass der Ruhezustand-Code auf derselben Ebene des Software-Stacks wie der Linker ausgeführt wird. Befindet sich der Ruhezustand auf der Kernelebene und ist die Verknüpfung auf der Benutzerebene, kann der Ruhezustand keine Annahmen darüber treffen, was der Linker tut.
Kasperd

10

Im Ruhezustand wird nicht der gesamte Arbeitsspeicher entleert.

Es ist bereits ein großer Teil des Arbeitsspeichers auf der Festplatte vorhanden. Dies ermöglicht nicht nur einen schnellen Ruhezustand, sondern auch die schnelle Bereitstellung von Speicher für neue Programme (damit diese schnell gestartet werden können).

Daher muss es nur einen kleinen Bruchteil der 4GB schreiben und das kann in 10-15s erledigt werden.

Von Microsoft :

Wenn der Arbeitsspeicher knapp ist (zum Beispiel Committed Bytes ist größer als der installierte Arbeitsspeicher), versucht das Betriebssystem, einen bestimmten Teil des installierten Arbeitsspeichers für die sofortige Verwendung verfügbar zu halten, indem Seiten mit virtuellem Speicher, die nicht aktiv verwendet werden, in die Auslagerungsdatei kopiert werden . Daher erreicht dieser Indikator nicht Null und ist nicht unbedingt ein guter Indikator dafür, ob auf Ihrem System nicht genügend RAM vorhanden ist.


2

Zusätzlich zu all dem, denke ich, spielen noch ein paar andere Faktoren eine Rolle.

Zum einen muss beim Kopieren einer Datei diese gelesen und geschrieben werden. Bei der Vernichtung muss nur die Datei geschrieben werden. Es ist per definitionem schon in Erinnerung!

In enger Beziehung dazu ist der Prozess, wenn eine Datei gelesen und gleichzeitig geschrieben wird, um Speicherplatz zu sparen: Lesen eines Blocks, Schreiben eines Blocks, Aktualisieren des Verzeichnisses (um die neue Größe anzuzeigen); Lesen Sie einen Block, schreiben Sie einen Block, aktualisieren Sie das Verzeichnis.

Jedes Mal, wenn Sie sich von einem Teil der Festplatte zu einem anderen bewegen (z. B. Datei a lesen, um Datei b zu schreiben, Datei b schreiben, um das Verzeichnis zu schreiben, und das Verzeichnis, um den nächsten Block zu lesen), muss die Festplatte suchen - bewegen Sie die Köpfe, Lassen Sie die Köpfe sich niederlassen und warten Sie, bis der rechte Teil der Platte vorbeikommt. Dies ist einer der Vorteile einer Solid State Disk - Suche dauert überhaupt keine Zeit. Im Ruhezustand werden die Daten Ende-zu-Ende geschrieben. Die Ruhezustandsdatei (Auslagerungsdatei) ist vorab zugeordnet, sodass das Verzeichnis nicht aktualisiert werden muss (Sie ändern nicht die Größe der Ruhezustandsdatei, sondern nur den Inhalt).

Und schließlich hat Ihr Computer alle anderen Aufgaben angehalten - dies ist das EINZIGE, was er tut (ich bezweifle, dass dies einen großen Unterschied machen wird, aber es wird bestimmt einige bewirken!). Auch Dinge wie Speicherverwaltung und Taskwechsel werden ausgesetzt.


Es wird bestimmt einen großen Unterschied machen!
Leichtigkeit Rennen mit Monica

@LightnessRacesinOrbit: CPU-Konflikte werden kaum einen Unterschied machen. Das Fehlen von E / A-Konflikten ist eine große Sache, aber in dieser Antwort wurde bereits festgestellt, dass das Suchen die Leistung beeinträchtigt und das Suchen, nicht der Mangel an Gesamtbandbreite, das Hauptproblem bei E / A-Konflikten ist.
Ben Voigt

@BenVoigt: Ja, ich stimme zu. Und wenn Sie 40 Prozesse haben, die versuchen, Dinge auf der Festplatte zu erledigen, wird dies die Suche nach Festplatten erheblich steigern. (tl; dr Ich habe nicht über CPU-Konflikte gesprochen)
Lightness Races mit Monica

@LightnessRacesinOrbit: Das scheint ... selbst im normalen Betrieb ungewöhnlich zu sein (alles außer dem Betreten und Verlassen des Ruhezustands). Ich weiß, dass ich den Saugnapf deinstalliere und durch etwas ersetze, das nur auf die Festplatte zugreift, wenn ich sie nach etwas frage, wenn ich eine Hintergrundaufgabe erhalte, die auf die Festplatte trifft.
Ben Voigt

@BenVoigt: Das scheint unwahrscheinlich. Die Daemon-Protokollierung ist das offensichtlichste Gegenbeispiel, gefolgt von Dingen wie der Aktualisierung der Drift-Datei von ntpd. Ich behaupte nicht, dass eines dieser Beispiele hier einen großen Effekt hat, aber ich halte es nicht für vernünftig, zu erwarten, dass keine Hintergrundaufgaben die Festplatte autonom berühren.
Leichtigkeit Rennen mit Monica

0

Dies liegt wahrscheinlich daran, dass der RAM viel schnellere Eingabe- / Ausgabegeschwindigkeiten aufweist als die Festplatte, sodass der RAM die darin enthaltenen Daten so schnell ausgeben kann, wie die Festplatte sie einlesen kann.

Beim Kopieren von Dateien sind Sie auch durch verschiedene Faktoren eingeschränkt - die Geschwindigkeit des Datenträgers, wenn er auf denselben Datenträger ein- und auslesen muss, dauert länger, die begrenzte Geschwindigkeit der Verbindung (wenn zum externen Laufwerk) wird überprüft überschreibt nichts etc


9
aber immer noch benötigt OS die 4 GB RAM - Daten auf der Festplatte zu schreiben , die von der I / O - Engpass geregelt
Coder

Unter der Annahme günstiger Parameter bedeutet dies, dass die Schreibgeschwindigkeit meiner Festplatte im Ruhezustand von 40 MB / s auf ~ 260 MB / s steigt. Kann es das richtige sein?
Kodierer

1
Wahrscheinlich - es sollte nicht zu viel von einem E / A-Engpass geben, da nur die Daten geschrieben werden müssen (es ist wahrscheinlich etwas vorhanden, damit es weiß, dass keine Daten überschrieben werden und wo die Daten abgelegt werden sollen, damit dies nicht der Fall ist müssen die Festplatte zu viel lesen). Auf meinem (Linux Dual Booted) Laptop, den ich benutzen dd if=/dev/zero of=/tmp/output.img bs=8k count=256kund bekommen kann 1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s, scheint es also möglich zu sein (ich möchte hinzufügen, dass das Kopieren von Dateien unter Windows ohnehin unnötig lange dauert).
Wilf

Sie können auch eine viel schnellere Übertragung erhalten, wenn Sie Dateien über das lokale Internet kopieren. Außerdem muss möglicherweise nicht alles im RAM kopiert werden - einige der Daten im RAM werden möglicherweise nur zwischengespeichert und nicht zum Wiederherstellen des Systems im Ruhezustand benötigt.
Wilf

Ich habe gerade den dd-Benchmark auf meinem System ausprobiert. Es ist nie mehr als 52 MB / s gelaufen: / (alte Maschine) Allerdings glaube ich, dass "wahrscheinlich etwas vorhanden ist, so dass es weiß, dass es keine Daten überschreibt und wo die Daten abgelegt werden sollen, damit es die Festplatte nicht lesen muss zu viel " Ist der Schlüssel für schnelle Geschwindigkeit.
Kodierer
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.