Порядок очистки кэша страниц 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 - процент системной памяти, который при загрязнении должен блокировать процесс, выполняющий запись, чтобы записать грязные страницы на диски

Другие вопросы по тегам