sendfile и tcp_nopush

Тема дорожной карты · Nginx

Директива sendfile включает в Nginx системный вызов Linux sendfile(), позволяющий ядру передавать данные файлов напрямую из кэша файловой системы в сетевой сокет без копирования через пользовательские буферы, что значительно снижает потребление CPU и пропускной способности памяти при отдаче статических файлов. При установке sendfile on Nginx обходит стандартный путь чтения-записи, обеспечивая почти нулевую нагрузку на CPU при доставке статических ресурсов — критически важная оптимизация производительности для высоконагруженных веб-серверов. Директива tcp_nopush on работает совместно с sendfile, включая опцию сокета TCP_CORK, которая объединяет небольшие пакеты так, что Nginx отправляет заголовки ответа и начало тела файла в одном TCP-сегменте, а не по отдельности, сокращая число сетевых обращений. Директива tcp_nodelay on действует противоположным образом и обычно применяется совместно с keepalive_timeout, гарантируя немедленную отправку небольших ответов по keep-alive соединениям без ожидания полного TCP-сегмента. Включение sendfile on, tcp_nopush on и tcp_nodelay on вместе в nginx.conf является стандартной базой производительности для любого развёртывания Nginx, обслуживающего статический контент в масштабе.

Как это работает

sendfile и tcp_nopush начинается с: worker_processes auto, worker_connections 4096 (или больше), worker_rlimit_nofile 65536, multi_accept on, use epoll, sendfile on, tcp_nopush on, tcp_nodelay on. Keepalive на клиентской стороне (keepalive_timeout 65) и к upstream (upstream { keepalive 32; }). Тюньте буферы (client_body_buffer_size, client_max_body_size, proxy_buffer_size). Профайл через nginx_amplify или Lua-tracing.

Когда применять

Тюньте после замеров — не копируйте случайные sysctl + nginx.conf-заклинания из интернета. Дефолты разумны для умеренного трафика. Поднимайте при конкретных боттлнеках (исчерпаны worker connections, file descriptors, upstream-таймауты). nginx -V — для compile-flags; nginx -T — для дампа эффективного полного конфига.

Типичные ошибки

Ловушки sendfile и tcp_nopush: worker_connections 100000 без поднятия OS-лимита файловых дескрипторов (ulimit -n) — nginx упирается в OS-лимит; тюнинг tcp_nopush для streaming-ответов (задерживает их); buffer-настройки cargo-cult из CDN-конфига nginx без понимания (трата RAM). Меряйте, меняйте по одной ручке.

Связанные понятия

Полезные ресурсы