Ось пояснення щодо того, як fdatasync()
працює проти того, як fsync()
працює
fdatasync()
видаляє всі буфери даних файлу на диск (до того, як системний виклик повернеться). Він нагадує, fsync()
але не потребує оновлення метаданих, таких як час доступу. Програми, які отримують доступ до баз даних або файлів журналів, часто записують крихітний фрагмент даних (наприклад, один рядок у файлі журналу), а потім fsync()
негайно дзвонять для того, щоб записані дані фізично зберігалися на жорсткому диску. На жаль, fsync()
завжди буде ініціювати дві операції запису
- одна операція запису для нещодавно записаних даних
- одна операція запису з метою оновлення часу модифікації, що зберігається в inode
Якщо час модифікації не є частиною концепції транзакції, тоді fdatasync()
можна використовувати, щоб уникнути зайвих операцій запису диска в дію.
По-англійськи, O_DSYNC
це швидше, ніж O_DIRECT
з моменту O_DIRECT
виклику fsync()
двічі (один для журналів і один для даних) і fsync()
перевіряє запис даних через дві операції запису. Використання O_DSYNC
дзвінків fdatsync()
та fsync()
. Можна подумати fdatasync()
як про асинхронність fsync()
(не віршування даних).
Дивлячись на цифри, O_DSYNC
чи є чотири операційні записи, два з яких перевірені, а fsync()
чотири операції запису, після чого всі підтверджуються.
ВИСНОВОК
O_DSYNC
- швидше за
O_DIRECT
- Дані можуть / можуть бути невідповідними через затримку або відверту збій
O_DIRECT
- більш стійкий
- дані узгоджуються
- природно повільніше
Я сподіваюся, що ця відповідь допомагає, і я сподіваюся, що я не погіршив для вас.