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

- 👍 4