Previous Entry Share Next Entry
Сброс производительности в канаву
enrutranslation

Некоторое время назад Ларри Остерман писал о резком ухудшении производительности вследствие сброса на диск данных реестра. Это частный случай общей проблемы производительности: сброс данных на диск обойдется вам очень дорого. 

 

Ранее я писал о высокой стоимости функции "commit", когда все операции сброса превращаются в "commit" в конце дня. Функции FlushFileBuffers, RegFlushKey ожидают подтверждения окончания записи на диск. Операции явного сброса данных на диск не дают кэш-памяти диска выполнять свою работу. Эти операции необходимы только в том случае, если вы пытаетесь поддерживать целостность транзакции. Если вы всего лишь сбрасываете данные - "Ну вот, я закончил и хочу убедиться в том, что данные записаны", - то просто теряете свое время (и время пользователя). Не волнуйтесь, данные будут записаны. Этому может помешать только отключение электричества в последующие 2 секунды, но вряд ли это проблема вашей программы. Если питание пропадет во время вызова FlushFileBuffers (скажем, после записи данных, содержащих новый индекс, но перед записью данных, на которые указывает индекс), то, вероятно, будет записана только часть данных. Если вы не производите транзакцию, вызов FlushFileBuffers ничего не исправит. У вас все еще остается интервал, в течение которого на диске находятся противоречивые данные.

Вывод: тщательно обдумывайте каждый вызов FlushFileBuffers, RegFlushKey. Они сведут на нет быстродействие вашей программы. В тех случаях, когда вы действительно хотите вызвать эти функции, в наше время есть способы выполнить задачу получше.

Замечания по старой статье в журнале Technet. В Windows 7 текст для флажка "Включить повышенную производительность" изменился и более точно описывает смысл действия: "Отключить очистку буфера кэша записей Windows для этого устройства". Есть даже пояснение, для каких условий подходит данная настройка:

 

"Чтобы предотвратить потерю данных, эту функцию следует включать только для устройств с отдельным источником питания, т.к. в случае сбоя электропитания такие устройства смогут сами очистить собственный буфер."
 

Политика кэширования записей


Примечание. В исходной статье изображение отсутствует.

Современные жесткие диски - это не просто магнитные тарелки. На плате жесткого диска также есть ОЗУ, которое используется прошивкой диска в качестве буфера. Если диску говорят: "Запиши эти данные на диск в такое-то место", диск копирует данные в свой закрытый буфер в ОЗУ и сразу же возвращает операционной системе код успешного завершения операции. Затем диск приступает к поиску головки, сектора и физической записи данных.

Когда ваша программа отдает файловой системе команду записи (предполагая, что разрешено кэширование записи), выполняется запись в дисковый кэш операционной системы, а из дискового кэша операционной системы данные периодически сбрасываются на диск. Как мы видели ранее, жесткий диск обманывает операционную систему и говорит: "Да, я записал эти данные", хотя в действительности он еще не сделал это. Данные, которые попросила записать операционная система, находятся в буфере ОЗУ диска, и, в свою очередь, записываются на физический носитель прошивкой диска.

Если вы делаете вызов одной из Flush-функций, Windows сбрасывает содержимое буферов своего дискового кэша на диск, как вы и ожидаете. Но, как я уже писал выше, данные только помещаются в буфер ОЗУ жесткого диска. Windows понимает это и отдает диску другую команду: "Эй, я знаю, что ты один из этих коварных дисков с внутренним буфером в ОЗУ. Да, я тебе говорю, не изображай из себя невинного младенца. Сделай одолжение, сбрось содержимое своих внутренних буферов, и дай знать, когда закончишь". Эта дополнительная фраза вида "Я знаю, чем ты занимался прошлым летом" гарантирует, что данные действительно попадут на физический носитель. Flush-функция возвращает управление программе только после получения от жесткого диска сигнала "Я закончил запись данных из моего внутреннего буфера в ОЗУ".

Дополнительная команда "Очисти и свой буфер в ОЗУ" является правильной, но ее можно благополучно пропустить в особых условиях. Представьте себе жесткий диск с независимым относительно компьютера питанием, которое позволяет сбросить содержимое внутреннего ОЗУ на диск даже в случае неожиданного отключения внешнего питания. Например, это может быть внешний диск, получающий питание от ИБП. В этой ситуации Windows не требуется отдавать команду "Пожалуйста, очисти свои внутренние буферы ОЗУ", потому что данные гарантированно будут записаны на диск независимо от будущих событий. Даже если трансформатор выйдет из строя, оставив без электричества все здание, остаточная энергия позволит диску записать данные из внутреннего буфера ОЗУ на физический носитель. Если ваш диск находится в таких условиях, можно безопасно установить флажок "Отключить очистку буфера кэша записей Windows для этого устройства".

Учтите, что аккумулятор ноутбука не гарантирует, что жесткому диску хватит остаточной энергии для сброса содержимого ОЗУ на физический носитель. Вы можете случайно вытащить аккумулятор из ноутбука или полностью разрядить его. В таких случаях у жесткого диска не будет шанса завершить очистку внутреннего буфера ОЗУ.

Конечно, если для вас не важна целостность дисков, можете включить настройку даже при отсутствии резервного питания. Это будет кстати при наличии отдельного диска, для которого не критична потеря данных в случае отключения электричества. У многих разработчиков в команде Windows есть целый диск для размещения файлов сборки операционной системы. Перед началом сборки они форматируют диск. Если во время сборки пропадет питание, они просто отформатируют диск и начнут сборку снова. В этом случае установите флажок "Включить повышенную производительность". Но если вы беспокоитесь о файлах на диске, не делайте так для дисков без резервного питания.


Автор: Рэймонд Чен.
Оригинал статьи: Flushing your performance down the drain, that is.


?

Log in