Вот объяснение того, как fdatasync()работает против того, как fsync()работает
fdatasync()сбрасывает все буферы данных файла на диск (до возврата системного вызова). Это напоминает, fsync()но не требуется для обновления метаданных, таких как время доступа. Приложения, которые обращаются к базам данных или файлам журналов, часто записывают крошечный фрагмент данных (например, одну строку в файле журнала), а затем fsync()немедленно вызывают , чтобы убедиться, что записанные данные физически хранятся на жестком диске. К сожалению, fsync()всегда будут инициировать две операции записи
- одна операция записи для вновь записанных данных
- одна операция записи для обновления времени модификации, хранящегося в индексе
Если время модификации не является частью концепции транзакции, то fdatasync()ее можно использовать, чтобы избежать ненужных операций записи на диск inode.
В английском языке, O_DSYNCбыстрее , O_DIRECTтак как O_DIRECTзвонки в fsync()два раза (один для журналов и один для данных) и fsync()проверяет запись данных с помощью двух операций записи. Использование O_DSYNCзвонков fdatsync()и fsync(). Вы можете думать о том, fdatasync()как делать асинхронные fsync()(не проверяющие данные) данные.
Глядя на числа, O_DSYNCвыполняется четыре fsync()операции записи, две из которых проверяются, в то время как выполняется четыре операции записи, после чего все проверяются.
ВЫВОД
O_DSYNC
- быстрее, чем
O_DIRECT
- Данные могут / не могут быть согласованными из-за задержки или прямого сбоя
O_DIRECT
- более стабильный
- данные согласуются
- естественно медленнее
Я надеюсь, что этот ответ поможет, и я надеюсь, что я не усугубил ситуацию для вас.