Sweaty Imposter

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.