Можно ли использовать O_DIRECT для запросов на запись, чтобы избежать потери данных при сбое питания?
Нет!
В Linux, пока O_DIRECT
пытается обойти вашу операционную систему кеширует ее никогда не обходит кеш вашего диска 1011 *. Если ваш диск имеет энергозависимый кэш записи, вы все равно можете потерять данные, которые были только в дисковом кеше, при внезапном отключении питания!
Означает ли O_DIRECT
, что данные полностью обходят кэш ОС?
Обычно, но некоторые файловые системы Linux могут использовать буферизованный ввод / вывод с O_DIRECT
( Ext4 Wiki, разъясняющий семантику Direct IO
страница предупреждает, что это может произойти при выделении записей ).
Если запрос возвращается в приложение успешно, означает ли это, что данные должны быть сброшены на диск?
Обычно это означает, что диск «видел» его, но видит вышеупомянутые предостережения (например, данные могли попасть в буферный кеш / данные могут находиться только в энергозависимом кеше диска).
Если я открою обычный файл в одной файловой системе, как насчет метаданных FS? Это также немедленно очищается или кэшируется?
Отличный вопрос! Метаданные все еще могут перемещаться в кеше и еще не синхронизироваться с диском, даже если запрос завершен успешно.
Все вышеперечисленное означает, что вам НЕОБХОДИМО выполнить соответствующую команду fsync()
в правильных местах (и проверить их результаты!), Если вы хотите быть уверены, что операция достигла энергонезависимой памяти. Подробнее см. https://thunk.org/tytso/blog/2009/03/15/dont-fear-the-fsync/ и статью LWN «Обеспечение доступа к диску» .