В master ядра Linux принята серия патчей, позволяющая отдельным программам работать с файловой системой без использования страничного кеша.
Современные NVMe устройства работают настолько быстро, что страничный кеш оказывается полностью заполнен в течении нескольких секунд, в результате чего начинается экстренный сброс данных на диск. После сброса данных круг повторяется заново. Такой цикл не позволяет достичь пика производительности диска, ведет к неоптимальному использованию памяти и непредсказуемым задержкам, что сказывается на работе как десктопных GUI приложений, так и баз данных, веб-серверов, и т.д.
В ядре уже существует возможность небуферизированного чтения/записи с помощью открытия файла с флагом O_DIRECT, однако от приложения требуется использовать выравненные блоки данных по 512 или 4096 байт (в зависимости от размера блока диска). Это делает затруднительным использование этой техники в таких приложениях как PostgreSQL.
Предложенный подход решает эту проблему: вместо отправки запроса напрямую в диск, запрос все ещё проходит через страничный кеш, но только для буферизации. Как только данные попадают в кеш, ядро инициирует необходимые дисковые операции, дожидается их выполнения, завершает системный вызов, и инвалидирует страницу кеша. На приложение не накладывается никаких дополнительных ограничений.
По словам автора (Jens Axboe), ему удалось добиться увеличения производительности на 65% в тестовом сценарии, обеспечив предсказуемые задержки операций и заметно снизив нагрузку на CPU.
Чтобы использовать новую возможность, нужно установить флаг операции RWF_UNCACHED. Для приложений, использующих традиционные интерфейсы вроде read(3) и write(3), потребуется переход на функции preadv2(2) и pwritev2(2), т.к. только эти функции позволяют передавать флаги операций. Для приложений, использующих io_uring, достаточно выставить флаг в sqe->rw_flags. Таким образом, приложение может контролировать, какие данные нужно кешировать, а какие – нет.
Перемещено dataman из kernel