Траблшутинг медленной отдачи статики в Nginx: тюнинг sendfile, tcp_nopush, tcp_nodelay
- Медленная скорость загрузки крупных файлов (дистрибутивы, видео, бэкапы) с веб-сервера.
- Высокое потребление процессора (высокий %system CPU) в операциях копирования памяти User/Kernel space.
- Искусственные задержки (RTT) при передаче небольших HTTP-пакетов и веб-сокетов.
1. Архитектурная оптимизация протокола TCP в nginx.conf
Откройте /etc/nginx/nginx.conf и настройте директивы в блоке http:
http {
# Прямая передача данных из кэша ядра на сокет в обход буфера приложения
sendfile on;
# Отправка заголовков и начала файла в одном полноразмерном TCP-пакете
tcp_nopush on;
# Отключение задержек алгоритма Nagle для мгновенной отправки пакетов
tcp_nodelay on;
# Ограничение размера одного блока sendfile во избежание монополизации воркера
sendfile_max_chunk 512k;
# Асинхронный Direct I/O для файлов больше 10MB (AIO)
directio 10m;
directio_alignment 4096;
aio threads=default;
# Кэширование открытых файловых дескрипторов
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}2. Настройка пула потоков (Thread Pools) для AIO
В начале /etc/nginx/nginx.conf (в главном контексте) добавьте:
thread_pool default threads=32 max_queue=65536;3. Применение и проверка отдачи
nginx -t && systemctl reload nginx Частые вопросы (FAQ)
Как работают tcp_nopush и tcp_nodelay одновременно?
В Nginx tcp_nopush используется только вместе с sendfile. Nginx собирает полный пакет данных перед отправкой файла, а после его завершения переключается на tcp_nodelay для моментальной финализации TCP транзакции.
Зачем нужен sendfile_max_chunk?
Он предотвращает блокировку рабочего процесса Nginx на одном медленном клиенте при передаче гигабайтных файлов, освобождая воркер для обработки параллельных запросов.