Jaka jest cała funkcja i efekt „Wyłącza opróżnianie bufora pamięci podręcznej zapisu Windows na urządzeniu”

11

W systemie Windows 7, przy użyciu Menedżera urządzeń, przywołując właściwości dysku i przechodząc do karty Zasady, dostępne są 2 elementy przełączania. Pamięć podręczna zapisu, o której nie chodzi w tym pytaniu.

i

[X] Wyłącz opróżnianie bufora pamięci podręcznej zapisu systemu Windows na urządzeniu <--- tylko to!

Microsoft umieszcza zastrzeżenie na karcie dla tego elementu. „Aby zapobiec utracie danych, nie zaznaczaj tego pola wyboru, chyba że urządzenie ma osobne źródło zasilania, które pozwala mu opróżnić bufor w przypadku utraty zasilania.”

Mówiąc najprościej, co to zmienia w przypadku zapisywania, zapisywania i kopiowania plików?

1. Zmiana akcji zapisu dla programów paranoicznych: (fakt czy fikcja)
Czy zmienia to sposób, w jaki operacje czyszczenia pamięci działają w przypadku programu, który wymusza wykonanie operacji czyszczenia pamięci podręcznej? Niektóre programy są bardzo skupione na zakończeniu zapisu, bez spekulacji, czy te programy są w stanie kontynuować swój zapis ochronny, czy też zmienia się to również w przypadku tych programów?

2. Rodzaje realizowanych programów:
Jakie są rodzaje działań / programów, które zostałyby lub nie zostałyby wprowadzone przez zmianę? Pisz, niektóre programy przesyłają strumieniowo, niektóre wykonują szybkie zapisywanie, niektóre są ciągłe, niektóre mają charakter ochronny (lub każdy inny rodzaj, który można zdefiniować w prosty sposób).

3. Czy widziałeś cokolwiek, a nawet punkt odniesienia:
Jeśli ustawienie jest włączone, jakie są obserwowalne zmiany w piśmie? Wszelkie luźne przykłady zaobserwowanej zmiany zachowania. lub nie zauważyłeś żadnych zmian w zachowaniu?

4. Co to jest zatrzymanie lub opóźnienie:
Wiemy, że większość tych działań jest bardzo szybka na większości komputerów, Dane zostaną ostatecznie zapisane. Czy w stosunku do prędkości napędu ilość czasu jest znacząca?

Na potrzeby mojego pytania istniejące ryzyko nie jest jednym z pytań, jeśli chciałbyś je ująć, nie przeszkadzałoby.

Co oznacza „Opróżnianie bufora pamięci podręcznej zapisu”, jest prawie duplikatem tego, ale link dotyczy innego systemu operacyjnego. Chociaż A ma pewne informacje, nawet termin użyty w łączu nie jest taki sam. Nie odpowiada również na najważniejsze rzeczy, które użytkownik chciałby wiedzieć, o których starałem się tutaj nakreślić.

Psycogeek
źródło
1
NTFS używa kronikowania do ochrony przed uszkodzeniem metadanych systemu plików (chociaż zawartość pliku nie jest kronikowana), ale działa to tylko wtedy, gdy można zagwarantować, że pewne zapisy przebiegną w prawidłowej kolejności, a system Windows opróżnia pamięć podręczną zapisu w określonych momentach, aby zapewnić prawidłowe porządkowanie.
David

Odpowiedzi:

9
  1. Twoje twierdzenie w pierwszym pytaniu to fikcja. Windows API wywołuje takie jak będzie nadal zapewniają, że dane pobiera się całą drogę do mediów fizycznych, nawet przy zapisie buforowym spłukiwania wyłączone. Programy, które są „bezpieczne” i wiedzą, co robią, będą w porządku. Połączenia takie jak .NET itp. Ostatecznie wywołują ten interfejs API.FlushFileBuffers() FileStream.Flush()

  2. Programy, które wykonują wiele operacji we / wy dysku bez FlushFileBuffers()bezpośredniego wywoływania lub dowolnego interfejsu API pomocnika, który ostatecznie je wywołuje, odnotują najbardziej zauważalny wzrost wydajności. Na przykład, jeśli korzystasz z nieistotnych operacji we / wy, w przypadku gdy dane są zgubione, np. BOINC (jeśli się zgubi, wystarczy pobrać plik lub spróbować ponownie obliczyć obliczenia), możesz uniknąć dzwonienia FlushFileBuffers()i po prostu wywołaj interfejs API typu WriteFile()- dane zostaną zbuforowane do zapisania, ale tak naprawdę nie zostaną zapisane przez potencjalnie długi czas, na przykład gdy deskryptor pliku zostanie zamknięty lub gdy program zakończy działanie. Niestety możliwe jest również, że w przypadku awarii systemu (np. BSOD) wszystkie dane zostaną utracone, więc jest to naprawdę ważneże jeśli masz do czynienia z jakimikolwiek cennymi / niewymiennymi danymi, które wywołujesz FlushFileBuffers(), niezależnie od tego, czy opróżnianie bufora jest włączone, czy nie! W przeciwnym razie prosty błąd sterownika (na przykład w sterowniku karty graficznej) może spowodować utratę dużej ilości danych.

  3. Nie można znaleźć żadnych testów porównawczych, ale zauważysz to bardziej w programach pasujących do opisu w drugim punkcie powyżej.

  4. Synchronizowanie danych na dysku nie jest tak szybkie, szczególnie jeśli odbywa się to często w ciasnej pętli. Domyślnie, jeśli dobrze pamiętam z lektury książek Windows Wewnętrznych, NTFS domyślnie synchronizuje wszystkie brudne bufory systemu plików na dysk co 5 sekund . Jest to najwyraźniej przyzwoity kompromis między stabilnością a wydajnością. Problem z częstą synchronizacją danych polega na tym, że powoduje, że dysk twardy wykonuje wiele prób i zapisów.

Rozważ następujący pseudokod:

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()

Dzięki automatycznemu 5 drugi bufor płukania na :

  • Zapisy występujące w wierszach 2, 5 i 7 występują w pamięci RAM, a dysk nie porusza się, dopóki nie upłynęło 5 sekund od pierwszego zapisu, a następnie najnowsze dane (z wiersza 7) zostają zapisane w bloku (1), a zapisywane są tylko dane zapisane w bloku (2).
  • Zapisy zachodzące w wierszach 10 i 13, które nadpisują dane w blokach (1) i (2), muszą zostać ponownie zapisane na dysk
  • Tak więc łączna liczba zapisów bloku (1) w pamięci RAM wynosi 3, a na dysku 2. Całkowita liczba zapisów tego bloku (2) w pamięci RAM to 2, a na dysku 2.

Z automatyczną 5 drugi bufor płukania off (efekt wyboru w swoim pytaniu):

  • Zapisy występujące w wierszach 2, 5, 7, 10 i 13 występują w pamięci RAM, a dysk nie porusza się, dopóki linia 14 nie zostanie wykonana, a następnie najnowsze dane (z linii 10 i 13) zostaną zapisane w blokach (1) i (2). Stare dane z linii 2, 5 i 7 nigdy nie trafiają na dysk twardy!

Biorąc pod uwagę, że zajęty system może wykonywać od setek do dziesiątek tysięcy zapisów do plików na sekundę, jest to świetny sposób na wydajność, szczególnie na tradycyjnych wirujących dyskach twardych (mniej imponujący na dyskach SSD). Pamięć RAM jest ogólnie 20 razy szybsza niż dyski twarde, chociaż ta różnica jest mniejsza w przypadku dysków SSD.

Powodem, dla którego mówią, że powinieneś użyć kopii zapasowej baterii jest to, że nie chcesz mieć 35 minut zapisanych danych buforowanych w pamięci RAM, które nie są zapisywane na dysku tylko dlatego, że twój programista był leniwy i nie zadzwonił FlushFileBuffers(), a następnie miał awaria zasilania. Oczywiście zapasowa bateria nie chroni przed błędami sterownika, które powodują BSOD ....

ChatBot John Cavil
źródło
0

Na poparcie odpowiedzi ChatBota Johna Cavila napisałem mały program testowy:

// ...
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() `
// ...

I uruchom go na dysku Samsung 950pro NVMe z włączoną opcją „Wyłącz opróżnianie bufora pamięci podręcznej zapisu Windows na urządzeniu”.

Wynik to:

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()

Możesz więc zobaczyć, że FlushFileBuffersżądanie nie zostało pominięte przez system (system Windows nie ignoruje FlushFileBufferspołączenia, nawet jeśli opcje są włączone).

ASBai
źródło
Usuń komentarz z odpowiedzi. Przesłanie komentarza jako odpowiedzi nigdy nie jest dopuszczalne.
Ramhound
@ASBai: (1) Znam C ++ ( zakładam, że w tym jest napisany twój program), ale nie znam API Windows. Czy możesz trochę wyjaśnić swój kod? (Należy pamiętać, że niektórzy użytkownicy Super User w ogóle nie są programistami per se .) W szczególności, co to jest swTest(i dlaczego nie zostało zadeklarowane)? (2) Czy mówisz, że zrobiłeś dwie kopie swojego programu, jedną obejmującą sfTest.Flush()połączenie, a drugą nie (tj. Z komentarzem) i porównałeś je? Proszę wytłumacz. (3) Znam angielski, ale nie rozumiem twojego ostatniego zdania.
Scott,
@Ramhound, ale nie mam wystarczającej reputacji, aby zagłosować lub zostawić komentarz, jak go rozwiązać?
ASBai
@Scott (1), swTest jest zegarem wysokiej rozdzielczości, używa interfejsu API QueryPerformanceCounter na platformie Windows do pomiaru czasu (myślę, że nie jest to punkt krytyczny :-). (2) Tak, właśnie. (3) Przepraszam za mój zły angielski, chcę tylko powiedzieć: ChatBot John Cavil ma rację, Windows nie ignoruje FlushFileBufferspołączenia, nawet jeśli opcje są włączone (widziałem, że inne źródła są smutne, że połączenie zostanie zignorowane, gdy ta opcja zostanie włączona ). Dodam jeszcze kilka komentarzy w odpowiedzi, dzięki :-)
ASBai 11.04.17
@ASBai - Nie należy przesyłać komentarzy jako odpowiedzi. To naprawdę nie ma znaczenia, nie masz reputacji wymaganej do przesłania komentarza, ponieważ komentarz nigdy nie powinien być przesyłany jako odpowiedź.
Ramhound