Сброс Кэша на Диск в Windows
При работе с файловыми системами Windows понимание принципов работы дискового кэша важно для обеспечения целостности данных и оптимизации производительности. Дисковое кэширование повышает производительность системы за счёт временного хранения операций записи в памяти перед их сохранением на диск. Однако это также означает, что в случае отключения питания или сбоя системы данные могут быть потеряны, если они не были сброшены из кэша в постоянное хранилище.
Если дисковое кэширование включено, Windows сохраняет запросы записи в энергозависимой памяти (RAM) вместо немедленной записи на диск. Это обеспечивает повышение производительности, но влечет за собой риски:
- Преимущества: более высокая производительность приложений, снижение нагрузки на дисковый ввод-вывод.
- Риски: возможная потеря данных при сбоях питания или системных сбоях.
Вы можете управлять кэшированием записи на уровне тома через диспетчер устройств или управление дисками, но в большинстве случаев, когда целостность данных критически важна, требуется программно сбрасывать кэш на диск.
Для приложений .NET, простейший способ сделать это - вызвать метод
FileStream.Flush(true):using System.Text.Encoding;
using var fs =
new FileStream(@"C:\data.txt", FileMode.Create);
var data = UTF8.GetBytes("Важные данные");
fs.Write(data);
// Сброс в операционную систему
fs.Flush();
// Сброс на диск (обходит буферы ОС)
fs.Flush(flushToDisk: true);
Параметр
flushToDisk: true гарантирует, что данные будут записаны в обход любых промежуточных буферов непосредственно на устройство хранения.Предотвращение кэширования при небуферизованном вводе-выводе
Если нужно полностью избежать кэширования, можно использовать флаг
FileOptions.WriteThrough при создании файла:await using var fs =
new FileStream(path,
FileMode.Create,
FileAccess.Write,
FileShare.None,
4096,
FileOptions.WriteThrough);
Обратите внимание, что этот вариант может работать медленнее, чем использование буферизованного ввода-вывода с
Flush(flushToDisk: true). В большинстве случаев вы можете произвести запись в файл несколько раз без сброса, а затем выполнить один сброс, чтобы гарантировать запись всех данных на диск.Источник: https://www.meziantou.net/flushing-disk-caches-on-windows-a-comprehensive-guide.htm