Порядок очистки кэша страниц linux
Существует кэш страницы, прежде чем мы записываем данные на диск.
Так что, если у меня есть две операции.
write(fileA)
write(fileB)
Затем, если система внезапно отключается. Мы не инициируем вызов sync().
Я хочу знать, возможно ли, что данные, которые мы записали в файл B, были записаны на диск, а данные, которые мы записали в файл A, не были записаны на диск?
2 ответа
Я полагаю, что файл B может быть записан на диск до файла A, так как записи будут объединены в запросы блочного ввода-вывода и могут быть переупорядочены на уровне блочных устройств планировщиком ввода-вывода в попытке минимизировать поиск на диске.,
См. Документацию ядра для получения дополнительной информации о планировщике ввода / вывода (элеватор): http://lxr.free-electrons.com/source/Documentation/block/biodoc.txt
Чтобы ответить на ваш вопрос вкратце, вы можете рассмотреть вопрос о звонке sync()
или же fsync()
Системный вызов в вашем приложении после write()
чтобы убедиться, что данные синхронизируются на диск немедленно.
flush (или pdflush) потоки ядра отвечают за синхронизацию грязных страниц на диске. Когда система находится в shutdown
правильно, все грязные буферы синхронизируются / записываются на диск. Однако это не то же самое в случае резких сбоев питания, так как данные, которые еще не были сброшены / синхронизированы на диск, очевидно, потеряны.
Если ты не позвонишь sync()
в вашем приложении, грязные буферы записываются на диск после определенных настроек ядра. Вы можете контролировать, как данные приложения синхронизируются (неактивные грязные страницы) через sysctl
настраиваемое ядро. Возможно, вы захотите прочитать больше о следующем:
vm.dirty_expire_centisecs - сколько лет (в 1/100 секунды) грязных страниц должно быть до их записи на диск
vm.dirty_writeback_centisecs - как часто ядро пробуждает поток очистки BDI для синхронизации грязных страниц на диске
vm.dirty_background_ratio - процент системной памяти, который при загрязнении может начать запись данных на диски
vm.dirty_ratio - процент системной памяти, который при загрязнении должен блокировать процесс, выполняющий запись, чтобы записать грязные страницы на диски