Buffered I/O (Page Cache) Versus Direct I/O (O_DIRECT)
TradeoffNetworking & OSSeniorStaffUpdated
Database is doing its own page cache and you do not want the kernel double-buffering. Buffered or direct I/O?
Short answer: Direct I/O (O_DIRECT). When the app already manages its own buffer pool (Postgres, MySQL, RocksDB, ScyllaDB), the kernel page cache is wasted RAM and double work.
The Two Options
A
Buffered I/O (page cache)
B
Direct I/O (O_DIRECT)
Drill This: Your Pick First
The Better Pick
Option B
Direct I/O (O_DIRECT)
When the app already manages its own buffer pool (Postgres, MySQL, RocksDB, ScyllaDB), the kernel page cache is wasted RAM and double work. O_DIRECT bypasses it and gives the DB deterministic control over what is cached.
When the Other One Wins
Buffered I/O (page cache)
For file servers, log shippers, or apps that benefit from OS read-ahead and free shared caching across processes, buffered I/O is faster and simpler. O_DIRECT requires aligned buffers and is unforgiving.