Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

SLOW_STATIC_IO Linux / DevOps

Траблшутинг медленной отдачи статики в Nginx: тюнинг sendfile, tcp_nopush, tcp_nodelay

Обновлено: 21.08.2026
  • Медленная скорость загрузки крупных файлов (дистрибутивы, видео, бэкапы) с веб-сервера.
  • Высокое потребление процессора (высокий %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
💡 Практика специалистов: Если Nginx запущен внутри контейнера или виртуальной машины с VirtualBox/Vagrant shared folders, директива sendfile on может приводить к отдаче поврежденных или закэшированных нулей. В средах Vagrant отключайте sendfile.

Частые вопросы (FAQ)

Как работают tcp_nopush и tcp_nodelay одновременно?

В Nginx tcp_nopush используется только вместе с sendfile. Nginx собирает полный пакет данных перед отправкой файла, а после его завершения переключается на tcp_nodelay для моментальной финализации TCP транзакции.

Зачем нужен sendfile_max_chunk?

Он предотвращает блокировку рабочего процесса Nginx на одном медленном клиенте при передаче гигабайтных файлов, освобождая воркер для обработки параллельных запросов.

Полезные материалы
Рекомендуем