У чому полягає вся функція та ефект програми "Вимкнення буфера кешу запису Windows на пристрої"


11

У Windows 7 за допомогою диспетчера пристроїв, що відображає властивості диска та переходить на вкладку "Політика", є два елементи комутації. Кеш запису, про який це питання він не йде.

і

[X] Вимкніть промивання буфера кешу запису Windows на пристрої <--- лише цей!

Microsoft ставить відмову від відповідальності на вкладку для цього елемента. "Щоб запобігти втраті даних, не встановлюйте цей прапорець, якщо пристрій не має окремого джерела живлення, який дозволяє пристрою змивати його буфер у разі втрати електроенергії."

Простіше кажучи, що це змінить для написання файлів, збереження файлів, копіювання файлів?

1. Зміна дій запису для параноїдальних програм: (факт чи вигадка)
Чи змінюється спосіб роботи флеш-записів для програми, яка змушує виникати флеш кешу? Деякі програми мають намір закінчити запис, не роздумуючи, чи здатні ці програми продовжувати своє захисне написання, чи це також змінюється для цих програм?

2. Види програм, які здійснюються:
Які типи дій / програм, які були б чи не були застосовані зміною? Введіть, деякі програми потоку, деякі швидко виписують, деякі - безперервні, деякі - захисні (або будь-який інший тип, який ви можете визначити простими словами).

3. Ви бачили щось, або тест навіть:
Якщо налаштування увімкнено, то які зміни в письмовій формі можна помітити ? Будь-які нечіткі приклади спостережуваної зміни в поведінці. або не спостерігається зміни в поведінці?

4. Що таке затримка або затримка:
Ми знаємо, що більшість цих дій дуже швидкі на більшості комп'ютерів. Дані, можливо, будуть записані. Чи відносно швидкості приводу чи велика кількість часу?

Для мого запитання ризик, який існує, не є одним із запитань, якщо ви хочете його покрити, він би не заважав.

Що означає "Промивання буфера кеш-пам'яті" , майже не відповідає цьому, але посилання стосується іншої ОС. Хоча A має деяку інформацію, навіть термін, що використовується у посиланні, не є однаковим. Це також не відповідає найважливішим речам, про які хотів би знати користувач, що я спробував окреслити тут.



1
NTFS використовує журнал для захисту від пошкодження метаданих файлової системи (хоча вміст файлу не занесений у друк), але він працює лише в тому випадку, якщо певні записи можна гарантувати в правильному порядку, а Windows певний час очищає кеш запису, щоб забезпечити правильне впорядкування.
Девід

Відповіді:


9
  1. Ваше твердження в першому питанні - це вигадка. Виклики API Windows, такі як, як і раніше, гарантують, що дані будуть виходити повністю на фізичні носії, навіть якщо вимикання буфера запису вимкнено. Отже, програми, які є "безпечними" і знають, що вони роблять, будуть просто чудовими. Виклики, такі як .NET і т.д., врешті-решт викликають цей API.FlushFileBuffers() FileStream.Flush()

  2. Програми, які роблять багато вводу / виводу диска без виклику FlushFileBuffers()безпосередньо, або будь-який помічник API, який врешті-решт викликає його, побачать найбільш помітне підвищення продуктивності. Наприклад, якщо ви працювали з неістотними введеннями-виводами, де це нормально, якщо дані втрачаються, наприклад, BOINC (якщо вони втрачаються, ви просто повторно завантажуєте файл або намагаєтесь повторно обчислити обчислення), ви можете уникнути виклику FlushFileBuffers()і просто викликати API , як WriteFile()- дані будуть отримувати буферний бути написано, але це не буде на самому справі написано для потенційно тривалого часу, наприклад, коли дескриптор файлу закривається, або при виході з програми. На жаль, можливо також, що при збої системи (наприклад, BSOD) всі дані втрачаються, тому це дійсно важливощо якщо ви маєте справу з яким - або цінними / незнімних даних , які ви робите виклик FlushFileBuffers(), чи включена буфер для промивання чи ні! В іншому випадку проста помилка драйвера (наприклад, у вашому графічному драйвері) може призвести до втрати багатьох даних.

  3. Неможливо знайти жодних орієнтирів, але ви помітите це більше при програмах, що відповідають опису в другому пункті вище.

  4. Синхронізація даних на диску насправді не така швидка, особливо якщо це робиться часто у вузькому циклі. За замовчуванням, якщо я пам'ятаю правильно з читання книг Windows Internals, NTFS за замовчуванням синхронізує всі диски буфери файлової системи на диск кожні 5 секунд . Це, мабуть, гідний компроміс між стабільністю та ефективністю. Проблема часто синхронізації даних полягає в тому, що він змушує жорсткий диск робити багато запитів і записів.

Розглянемо наступний псевдокод:

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

З автоматичним 5 секунд буфера промивання на :

  • Записи, що відбуваються на рядках 2, 5 і 7, відбуваються в оперативній пам'яті, і диск не рухається, поки не минуло 5 секунд з моменту першого запису, а потім останні дані (з рядка 7) записуються в блок (1) і записуються лише дані, записані в блок (2).
  • Записи, що виникають у рядках 10 та 13, які перезаписують дані в блоках (1) та (2), повинні знову виписатись на диск
  • Таким чином, загальна кількість записів блоку (1) до оперативної пам’яті дорівнює 3, а на диск - 2. Загальна кількість записів блоку (2) в оперативну пам’ять становить 2, а на диск - 2.

З автоматичними 5 секундами буфером промивання від (ефекту прапорця в вашому питанні):

  • Записи, що виникають у рядках 2, 5, 7, 10 і 13, трапляються в оперативній пам'яті, і диск не переміщується, поки не буде виконано рядок 14, а потім останні дані (з рядків 10 і 13) записуються в блоки (1) і (2). Старі дані з рядків 2, 5 і 7 ніколи не потрапляють на жорсткий диск!

Зважаючи на те, що напружена система може відчувати від сотень до десятків тисяч записів у файли в секунду, це чудово підходить для продуктивності, особливо на традиційних спінінг-жорстких дисках (це менш вражає на SSD). Оперативна пам’ять у 20 разів швидша, ніж жорсткі диски, як загальний показник, хоча цей розрив менший у SSD.

Причина, по якій вони кажуть, що ви повинні використовувати резервну копію акумулятора, полягає в тому, що ви не хочете мати 35 хвилин письмових даних, завантажених в оперативній пам'яті, які не записуються на диск, просто тому, що ваш програміст був ледачий і не дзвонив FlushFileBuffers(), а потім відключення живлення. Звичайно, резервна копія акумулятора не захищає вас від помилок драйверів, які спричиняють BSOD ....


0

На підтримку відповіді ChatBot Джона Кавіла я написав невелику тестову програму:

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

І запустіть його на диску Samsung 950pro NVMe з увімкненою опцією "Вимкнути буфер кешу запису Windows на пристрої".

Результат:

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

Таким чином, ви бачите, що FlushFileBuffersзапит не пропущено системою (Windows не ігнорує FlushFileBuffersвиклик, навіть якщо параметри включені).


Видаліть коментар із своєї відповіді. Ні разу не прийнятно представити коментар в якості відповіді.
Рамхаунд

@ASBai: (1) Я знаю C ++ (я вважаю, що так написано у вашій програмі), але я не знаю API Windows. Чи можете ви трохи пояснити свій код? (Майте на увазі , що деякі користувачі Super User не є програмісти взагалі, сам по собі .) Зокрема, те, що swTest(і чому він не оголошений)? (2) Ви хочете сказати, що ви зробили дві копії програми, одну, включаючи sfTest.Flush()виклик, а одну не (тобто з цим прокоментував), і порівняли їх? Будь ласка, поясніть. (3) Я знаю англійську, але не можу зрозуміти ваше останнє речення.
Скотт

@Ramhound, але у мене недостатньо репутації, щоб проголосувати або залишити коментар, як це вирішити?
ASBai

@Scott (1), swTest - таймер високої роздільної здатності, він використовує QueryPerformanceCounter API на платформі Windows, щоб зробити час (я думаю, це не критичний момент :-). (2) Так, саме так. (3) Вибачте за мою погану англійську мову, я просто хочу сказати: ChatBot John Cavil має рацію, Windows не ігнорує FlushFileBuffersвиклик, навіть якщо параметри включені (я бачив деякі інші джерела, сумно, що виклик буде ігноровано, коли ця опція була включена ). Я додам ще кілька коментарів у відповідь, дякую :-)
ASBai

@ASBai - не слід надсилати коментарі як відповідь. Це насправді не має значення, у вас немає репутації, необхідної для надання коментаря, оскільки коментар ніколи не повинен надсилатися як відповідь.
Рамхаунд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.