directio
Директива 'directio' включает прямой ввод-вывод для чтения и записи файлов, обходя кэш ОС. — NGINX HTTP Core
Описание
Директива 'directio' в NGINX используется для настройки операций прямого ввода-вывода при работе с файлами, особенно полезна в случаях, когда требуется высокая производительность при отдаче больших файлов. При включении данные читаются и записываются напрямую между диском и приложением, минуя кэш операционной системы. Это может привести к снижению задержки и увеличению пропускной способности для приложений, которые часто обращаются к большим файлам. Эта директива принимает один аргумент, задающий размер буфера прямого ввода-вывода. Указанный размер выравнивается по размеру блока, используемому базовой файловой системой. Например, если размер блока равен 4 KB, будет уместно установить 'directio 4k;'. При использовании директива помогает оптимизировать обработку данных файлов, особенно в сценариях с высокой производительностью или на системах с ограниченными ресурсами памяти. Директиву 'directio' можно объявлять в контекстах `http`, `server` и `location`, что обеспечивает гибкость конфигурации на разных уровнях иерархии NGINX. Важно помнить, что хотя эта функция может давать существенные преимущества, она не всегда необходима — особенно для нагрузок, которые не предполагают регулярной работы с большими файлами, так как накладные расходы на управление прямым I/O иногда могут перевешивать преимущества по производительности.
Пример конфига
location /downloads {
directio 4k;
root /var/www/files;
}Убедитесь, что файловая система поддерживает direct I/O; в противном случае директива может не иметь никакого эффекта.
Будьте внимательны при выравнивании buffer size с block size используемой файловой системы, чтобы избежать потерь производительности.
Использование direct I/O может обходить kernel page cache, что может привести к снижению производительности при шаблонах доступа, ориентированных на небольшие файлы.