Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

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

Гайд: Настройка сетевого стека Linux под высокие нагрузки (10G/40G): sysctl net.core и net.ipv4

Обновлено: 21.08.2026  ·  Официальная база знаний

Архитектура обработки сетевых пакетов в ядре 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.somaxconn128 / 409665535Максимальная длина очереди полностью установленных соединений (Accept Queue).
net.ipv4.tcp_max_syn_backlog128 / 51265535Максимальное число полуоткрытых соединений (SYN Queue).
net.core.netdev_max_backlog1000250000Очередь пакетов, ожидающих обработки ядром после приема драйвером сетевой карты.
net.ipv4.tcp_congestion_controlcubicbbrАлгоритм контроля перегрузки сети от 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-буферы.
Практический опыт инженера: На высоконагруженных ingress-узлах с миллионами одновременных WebSocket/HTTP-keepalive соединений не выставляйте максимальные буферы rmem_default для абсолютно всех сокетов сразу. Используйте автоматический тюнинг ядра (tcp_moderate_rcvbuf = 1), который динамически выделяет память сокетам только при реальной передаче больших объемов данных.

Частые вопросы (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-клиентов со сбитыми часами.