Вот объяснение того, как 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
- более стабильный
- данные согласуются
- естественно медленнее
Я надеюсь, что этот ответ поможет, и я надеюсь, что я не усугубил ситуацию для вас.