В Linux флаг
O_DIRECT позволяет читать и писать файл почти напрямую, минуя page cache ядра.Зачем это нужно базам данных?
У PostgreSQL, MySQL, RocksDB и других систем часто уже есть свой buffer pool.
Если ещё и ядро будет кэшировать те же страницы, получится двойное кэширование и лишняя трата памяти.
Но у
O_DIRECT есть неприятное условие: всё должно быть выровнено по блоку.• buffer
• file offset
• размер чтения / записи
Например, под 4 KB блоки нельзя просто так прочитать 123 байта в любой `malloc`-буфер.
Промахнулся с alignment —
read() вернёт EINVAL.Именно поэтому низкоуровневый I/O в базах выглядит таким странным: там важны не только данные, но и то, как они лежат в памяти.
