Was ist die gesamte Funktion und Wirkung von "Deaktivieren der Windows-Cache-Schreibpuffer-Leerung auf dem Gerät"?

11

In Windows 7 gibt es unter Verwendung des Geräte-Managers, Aufrufen der Eigenschaften eines Datenträgers und Aufrufen der Registerkarte Richtlinien zwei Optionen. Den Schreibcache, um den es bei dieser Frage nicht geht.

und

[X] Deaktivieren Sie das Leeren des Windows-Schreibcache-Puffers auf dem Gerät & lt; --- nur dieser!

Microsoft stellt einen Haftungsausschluss auf die Registerkarte für dieses Element. "Um Datenverlust zu vermeiden, aktivieren Sie dieses Kontrollkästchen nur, wenn das Gerät über ein separates Netzteil verfügt, mit dem das Gerät seinen Puffer im Falle eines Stromausfalls leeren kann."

Was ändert sich in einfachen Worten für das Schreiben, Speichern und Kopieren von Dateien?

1. Schreibaktionen für paranoide Programme ändern: (Fakt oder Fiktion)
Ändert es die Art und Weise, wie Schreiblöschvorgänge für ein Programm ausgeführt werden, bei dem ein Cache-Leeren erzwungen wird? Einige Programme sind sehr darauf bedacht, den Schreibvorgang zu beenden, ohne zu spekulieren. Können diese Programme ihr Schutzschreiben fortsetzen, oder ändert sich dies auch für diese Programme?

2. Arten der betroffenen Programme:
Welche Arten von Aktionen / Programmen wären von der Änderung betroffen oder nicht betroffen? Typ, manche Programme streamen, manche schreiben schnell, manche sind fortlaufend, manche sind schützend (oder jeder andere Typ, den Sie in einfachen Worten definieren könnten).

3. Haben Sie etwas gesehen oder sogar einen Benchmark:
Wenn die Einstellung aktiviert ist, welche schriftlichen Änderungen sind zu beobachten? Alle losen Beispiele einer beobachteten Verhaltensänderung. oder keine Verhaltensänderung festgestellt?

4. Was ist die Verzögerung oder Verzögerung:
Wir wissen, dass die meisten dieser Aktionen auf den meisten Computern sehr schnell sind. Die Daten werden möglicherweise geschrieben. Ist der Zeitaufwand im Verhältnis zur Geschwindigkeit des Laufwerks von Bedeutung?

Für die Zwecke meiner Frage ist das vorhandene Risiko nicht eine der Fragen. Wenn Sie es abdecken möchten, würde es nicht stören.

Was bedeutet "Cache-Puffer leeren"? ist fast ein Trick, aber der Link ist für ein anderes Betriebssystem. Obwohl das A einige Informationen enthält, ist selbst der im Link verwendete Begriff nicht derselbe. Es beantwortet auch nicht die wichtigsten Dinge, die ein Benutzer wissen möchte, die ich hier zu skizzieren versucht habe.

Psycogeek
quelle
1
NTFS verwendet die Journalfunktion zum Schutz vor Beschädigung der Metadaten des Dateisystems (obwohl der Inhalt der Dateien nicht im Journal gespeichert ist). Dies funktioniert jedoch nur, wenn bestimmte Schreibvorgänge garantiert in der richtigen Reihenfolge ausgeführt werden können. Windows leert den Schreibcache zu bestimmten Zeiten, um die richtige Reihenfolge sicherzustellen.
David

Antworten:

9
  1. Ihre Behauptung in der ersten Frage ist Fiktion. Windows API-Aufrufe wie FlushFileBuffers() werden Stellen Sie dennoch sicher, dass die Daten vollständig auf den physischen Datenträger gelangen, auch wenn das Löschen des Schreibpuffers deaktiviert ist. Programme, die "sicher" sind und wissen, was sie tun, werden also in Ordnung sein. Anrufe wie FileStream.Flush() Rufen Sie in .NET usw. diese API auf.

  2. Programme, die viele Datenträger-E / A-Vorgänge ausführen, ohne aufzurufen FlushFileBuffers() Direkt oder jede Helfer-API, die sie schließlich aufruft, würde die deutlichste Leistungssteigerung verzeichnen. Wenn Sie beispielsweise nicht unbedingt erforderliche E / A-Vorgänge ausführen, bei denen es in Ordnung ist, wenn Daten verloren gehen, z. B. BOINC (wenn Daten verloren gehen, laden Sie einfach die Datei erneut herunter oder versuchen Sie, die Berechnungen erneut zu berechnen), können Sie einen Aufruf vermeiden FlushFileBuffers(), und rufen Sie einfach eine API wie WriteFile() - Die Daten werden erhalten gepuffert geschrieben werden, aber es wird möglicherweise für eine lange Zeit nicht geschrieben, beispielsweise wenn der Dateideskriptor geschlossen wird oder wenn das Programm beendet wird. Leider ist es auch möglich, dass bei einem Systemabsturz (z. B. BSOD) alle Daten verloren gehen wirklich wichtig das, wenn Sie mit irgendeiner Art von wertvollen / nicht ersetzbaren Daten zu tun haben, die Sie tun tun Anruf FlushFileBuffers(), ob die Pufferspülung aktiviert ist oder nicht! Andernfalls kann ein einfacher Treiberfehler (z. B. in Ihrem Grafiktreiber) dazu führen, dass Sie viele Daten verlieren.

  3. Ich kann keine Benchmarks finden, aber Sie werden es bei Programmen bemerken, die der Beschreibung im zweiten Punkt oben entsprechen.

  4. Das Synchronisieren von Daten auf die Festplatte ist eigentlich nicht so schnell. insbesondere wenn es häufig in einer engen Schleife gemacht wird. Wenn ich mich beim Lesen von Windows Internals-Büchern korrekt erinnere, synchronisiert NTFS standardmäßig alle fehlerhaften Dateisystempuffer auf alle Datenträger 5 Sekunden . Dies ist anscheinend ein angemessener Kompromiss zwischen Stabilität und Leistung. Das Problem beim häufigen Synchronisieren von Daten besteht darin, dass die Festplatte viele Such- und Schreibvorgänge ausführt.

Betrachten Sie den folgenden Pseudocode:

1: seek to a certain block (1)
2: write a couple megabytes of data into blocks starting at (1)
3: wait 2 seconds
4: seek to another block (2)
5: write some more megabytes of data into blocks starting at (2)
6: seek back to block (1)
7: write some more megabytes of data into blocks starting at (1)
8: wait 10 minutes
9: seek to block (1)
10: write some megabytes of data into blocks starting at (1)
11: wait 5 seconds
12: seek to block (2)
13: write some megabytes of data into blocks starting at (2)
14: explicit call to FlushFileBuffers()

Mit automatischer 5 Sekunden Pufferspülung auf :

  • Die Schreibvorgänge in den Zeilen 2, 5 und 7 werden ausgeführt im RAM und die Platte bewegt sich nicht, bis 5 Sekunden seit dem ersten Schreiben vergangen sind, und dann werden die neuesten Daten (von Zeile 7) in Block (1) und die einzigen Daten, die in Block (2) geschrieben wurden, geschrieben.
  • Die auf den Zeilen 10 und 13 auftretenden Schreibvorgänge, die Daten in den Blöcken (1) und (2) überschreiben, müssen erneut auf die Festplatte geschrieben werden
  • Also die Gesamtanzahl, wie oft dieser Block (1) geschrieben wurde in RAM ist 3 und auf die Festplatte , 2. Die Gesamtanzahl der Schreibvorgänge für Block (2) in RAM ist 2 und auf die Festplatte , 2.

Mit automatischer 5 Sekunden Pufferspülung aus (die Auswirkung des Kontrollkästchens in Ihrer Frage):

  • Die Schreibvorgänge in den Zeilen 2, 5, 7, 10 und 13 werden ausgeführt im RAM und die Platte bewegt sich nicht, bis Zeile 14 ausgeführt wird, und dann werden die neuesten Daten (aus den Zeilen 10 und 13) in die Blöcke (1) und (2) geschrieben. Die alten Daten aus den Zeilen 2, 5 und 7 treffen nie auf die Festplatte!

In Anbetracht der Tatsache, dass ein ausgelastetes System Hunderte bis Zehntausende Schreibvorgänge in Dateien pro Sekunde ausführen kann, ist dies für die Leistung hervorragend. insbesondere auf herkömmlichen rotierenden Festplatten (auf SSDs weniger beeindruckend). RAM ist im Allgemeinen 20-mal schneller als Festplatten, obwohl diese Lücke bei SSDs geringer ist.

Der Grund, warum sie sagen, dass Sie eine Batteriesicherung verwenden sollten, ist, dass Sie keine geschriebenen Daten im Wert von 35 Minuten im RAM haben möchten, die nicht auf die Festplatte geschrieben wurden, nur weil Ihr Programmierer faul war und nicht anrief FlushFileBuffers()und dann einen Stromausfall haben. Natürlich schützt Sie ein Batterie-Backup nicht vor Treiberfehlern, die einen BSOD verursachen ....

ChatBot John Cavil
quelle
0

Zugunsten Antwort von ChatBot John Cavil , Ich habe ein kleines Testprogramm geschrieben:

// ...
byteEx btTest;
btTest.resize(1024*1024, 0xff); // 1MB data

CSysFile sfTest(byT("test.bin"));

swTest.Start(); // Begin timing by call `QueryPerformanceCounter` API
for (UINT i=0; i<10000; ++i) // Write 1MB data for 10000 times
{
    sfTest.SeekBegin();
    sfTest.Write(btTest); // Call `WriteFile` API 
//  sfTest.Flush();       // Call `FlushFileBuffers` API
}
swTest.Stop(); // Calculate the time-consuming start from `swTest.Start() `
// ...

Führen Sie es auf einer Samsung 950 pro NVMe-Festplatte mit aktivierter Option "Deaktivieren Sie das Leeren des Windows-Schreibcache-Puffers auf dem Gerät" aus.

Das Ergebnis ist:

D:\tmp> test        // without sfTest.Flush();
00:00:00.729766     // use 0.73 seconds without FlushFileBuffers()

D:\tmp> test        // with sfTest.Flush();
00:00:06.736167     // use 6.74 seconds with FlushFileBuffers()

So können Sie das sehen FlushFileBuffers Anforderung wird vom System nicht ausgelassen (Windows wird nicht ignoriert FlushFileBuffers anrufen, auch wenn die Optionen aktiviert sind).

ASBai
quelle
Bitte entfernen Sie Ihren Kommentar aus Ihrer Antwort. Es ist noch nie Es ist akzeptabel, einen Kommentar als Antwort einzureichen.
Ramhound
@ASBai: (1) Ich kenne C ++ (I annehmen In diesem Programm ist Ihr Programm geschrieben), aber ich kenne die Windows-API nicht. Können Sie Ihren Code ein bisschen erklären? (Bedenken Sie, dass einige Benutzer von Super User sind überhaupt keine Programmierer, an sich .) Insbesondere was ist swTest (und warum ist es nicht deklariert)? (2) Wollen Sie damit sagen, dass Sie zwei Kopien Ihres Programms erstellt haben, eine davon einschließlich der sfTest.Flush() call und one not (d. h. mit auskommentiert), und verglichen sie? Bitte erkläre. (3) Ich kann Englisch, aber ich kann Ihren letzten Satz nicht verstehen.
Scott
@Ramhound, aber ich habe nicht genug Ruf, um abzustimmen oder einen Kommentar zu hinterlassen, wie man es löst?
ASBai
@Scott (1), swTest ist ein hochauflösender Timer. Er verwendet die QueryPerformanceCounter-API auf der Windows-Plattform, um das Timing durchzuführen (ich denke, das ist kein kritischer Punkt :-). (2) Ja, genau. (3) Entschuldigung für mein schlechtes Englisch, ich möchte nur sagen: ChatBot John Cavil hat recht, Windows wird nicht ignoriert FlushFileBuffers Rufen Sie an, auch wenn die Optionen aktiviert sind. Ich werde in der Antwort noch ein paar Kommentare hinzufügen, danke :-)
ASBai
@ASBai - Sie sollten keinen Kommentar als Antwort senden. Es spielt keine Rolle, Sie haben nicht den Ruf, einen Kommentar abzugeben, da ein Kommentar niemals als Antwort eingereicht werden sollte.
Ramhound