Гайд: Настройка сетевого стека Linux под высокие нагрузки (10G/40G): sysctl net.core и net.ipv4
Архитектура обработки сетевых пакетов в ядре Linux при экстремальных нагрузках
По умолчанию сетевой стек ядра Linux оптимизирован для серверов общего назначения и сетевых интерфейсов 1 Gbps. При переходе на высокоскоростные каналы 10GbE / 40GbE / 100GbE и трафик в сотни тысяч пакетов в секунду (PPS / High RPS) стандартные размеры буферов сокетов (Socket Ring Buffers) и очереди ядра переполняются за миллисекунды, приводя к массовым сетевым сбоям:
- TCP Listen Drops / TCP SYN Drops: Очередь не принятых сокетов (Listen Backlog) переполнена, новые клиенты получают отказ в TCP-соединении (Connection Refused / Timeout);
- Переполнение очередей сетевого интерфейса (Packet Drops): Рост счетчика
rx_dropped / tx_droppedв выводеip -s linkилиifconfig; - Зависание процессора в SoftIRQ (ksoftirqd): Одно ядро CPU перегружено обработкой аппаратных сетевых прерываний из-за отсутствия распределения очередей RSS (Receive Side Scaling);
- Исчерпание портов и сокетов в TIME_WAIT: Ошибки
Cannot assign requested addressпри частых исходящих соединениях к микросервисам/базам данных.
Бизнес-риски
Потеря до 30% входящего клиентского трафика, катастрофический рост задержек TTFB (Time to First Byte), сбои в работе балансировщиков (NGINX, HAProxy, Envoy).
Ключевые лимиты сетевого стека ядра Linux
| Параметр sysctl | Значение по умолчанию | Значение для HighLoad 10G/40G | Что контролирует |
|---|---|---|---|
net.core.somaxconn | 128 / 4096 | 65535 | Максимальная длина очереди полностью установленных соединений (Accept Queue). |
net.ipv4.tcp_max_syn_backlog | 128 / 512 | 65535 | Максимальное число полуоткрытых соединений (SYN Queue). |
net.core.netdev_max_backlog | 1000 | 250000 | Очередь пакетов, ожидающих обработки ядром после приема драйвером сетевой карты. |
net.ipv4.tcp_congestion_control | cubic | bbr | Алгоритм контроля перегрузки сети от Google (максимизирует пропускную способность). |
Регламент комплексного тюнинга сетевого стека Linux
Сценарий 1: Проверка и увеличение кольцевых буферов сетевой карты (NIC Ring Buffers)
Увеличьте аппаратные буферы приема (RX) и передачи (TX) сетевой карты утилитой ethtool:
# 1. Просмотр текущих и максимально поддерживаемых размеров Ring Buffer:
sudo ethtool -g eth0
# 2. Установка максимальных значений буферов (например, 4096):
sudo ethtool -G eth0 rx 4096 tx 4096
# 3. Включение разгрузок процессора (Hardware Offloading: TSO, GSO, GRO):
sudo ethtool -K eth0 tso on gso on gro onСценарий 2: Комплексная конфигурация sysctl для 10G/40G серверов
Создайте конфигурационный файл оптимизации сетевого стека:
sudo tee /etc/sysctl.d/99-network-highload.conf <<EOF
# --------------------------------------------------
# Оптимизация сетевого стека Linux для HighLoad 10G/40G
# --------------------------------------------------
# 1. Очереди соединений и пакетов ядра
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 250000
# 2. Буферы памяти сокетов TCP (min, default, max в байтах):
# Выделение до 16-32 МБ на сокет для высокоскоростных BDP каналов
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
# 3. Управление диапазоном портов и состояниями TIME_WAIT
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 2000000
# 4. Алгоритм контроля перегрузки Google BBR и справедливое планирование fq
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 5. Защита от SYN-Flood атак и MTU Probing
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_mtu_probing = 1
EOF
# Применение настроек:
sudo sysctl --systemСценарий 3: Мониторинг сетевых дропов и потерь через netstat и nstat
# Мониторинг дропов в очереди SYN и Accept queue в реальном времени:
watch -d 'nstat -az TcpExtListenOverflows TcpExtListenDrops TcpExtTCPZeroWindowDrop'
# Если счетчики TcpExtListenOverflows растут -> приложение (NGINX) не успевает вызывать accept().
# Увеличьте директиву backlog в конфигурации веб-сервера (nginx: listen 80 backlog=65535;).Типовые ошибки администраторов
- Включение устаревшего параметра net.ipv4.tcp_tw_recycle: Данный параметр категорически запрещен и удален из ядра Linux (начиная с 4.12), так как он ломает работу всех клиентов, находящихся за одним общим корпоративным NAT. Используйте ТОЛЬКО
net.ipv4.tcp_tw_reuse = 1. - Забытый backlog в конфигурациях пользовательских демонов: Если в
sysctlнастроенsomaxconn = 65535, но в конфиге NGINX/Node.js/Gunicorn оставлен дефолтныйbacklog = 511, размер очереди будет ограничен меньшим значением (511).
Специалисты ITSTM настроят аппаратное распределение прерываний сетевых карт (RPS/RFS/XPS), переведут трафик на BBRv2/v3 и оптимизируют TCP-буферы.
Частые вопросы (FAQ)
Как проверить, активирован ли алгоритм BBR на сервере?
Выполните команду sysctl net.ipv4.tcp_congestion_control (должно вернуть bbr) и проверьте наличие модуля ядра: lsmod | grep bbr.
Что такое Bandwidth-Delay Product (BDP) и как он связан с tcp_rmem?
BDP (произведение пропускной способности на RTT) определяет объем данных 'в полете'. Для полного насыщения 10G канала при пинге 20 мс размер буфера TCP rmem_max обязан быть не менее: 10 Gbps * 0.02 c = 25 МБ.
Как распределить прерывания сетевой карты по всем ядрам процессора (RPS)?
Установите и включите службу irqbalance: sudo systemctl enable --now irqbalance, либо вручную задайте маску CPU в /sys/class/net/eth0/queues/rx-0/rps_cpus.
Почему tcp_tw_reuse безопасен, а tcp_tw_recycle опасен?
tcp_tw_reuse повторно использует сокеты TIME_WAIT только для безопасных исходящих соединений, сверяя временные метки TCP Timestamps. tcp_tw_recycle сбрасывал входящие соединения от NAT-клиентов со сбитыми часами.