3 ms·
> Direct I/O means no more fsync: no more complexity via background flushes and optimal scheduling of syncs. There's no kernel overhead from copying and coalesc
by rockwotj 11mo ago
> Direct I/O means no more fsync: no more complexity via background flushes and optimal scheduling of syncs. There's no kernel overhead from copying and coalescing. It essentially provides the performance, control, and simplicity of issuing raw 1:1 I/O requests.
Not true, you still need fsync in direct I/O to ensure durability in power loss situations. Some drives have write caches that means acknowledged writes live in non-volatile memory. So maybe the perf is wildly better because you’re sacrificing durability?
- actionfromafar 11mo agoYou mean in volatile memory?
- rockwotj 11mo agoyes thanks
- rrauch 11mo agoLooks like the author is well aware: /// Even when using direct I/O, `fsync` is still necessary, as it ensures the device itself has flushed any internal caches. async fn sync(&self) { let (fut, fut_ctl) = SignalFuture::new(); self.sender.send(Request::Sync { res: fut_ctl }).unwrap(); fut.await } Full code here: https://github.com/wilsonzlin/blobd/blob/master/libblobd-direct/src/backing_store/uring.rs#L275 https://github.com/wilsonzlin/blobd/blob/master/libblobd-dir...