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

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

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

WIREGUARD_THROUGHPUT_DEGRADATION Сетевое оборудование и VPN

Оптимизация производительности WireGuard в Linux: CPU Pinning и тюнинг очереди

Обновлено: 25.08.2026 · Официальная документация ↗
  • Пропускная способность WireGuard упирается в 1–2 Гбит/с при наличии 10G/40G сетевого адаптера.
  • Одно ядро CPU загружено на 100% процессами ksoftirqd или системными прерываниями kworker/wg-crypt.
  • Высокий показатель сброса сетевых пакетов (packet drops) в выводе netstat -s или ifconfig wg0.
  • Аномальный рост джиттера (Jitter) и задержек под высокой конкурентной нагрузкой тысяч пиров.

1. Архитектура параллелизации WireGuard в ядре Linux

WireGuard по умолчанию распределяет задачи шифрования/дешифрования (ChaCha20-Poly1305) по ядрам CPU с помощью очередей padata. Однако при обработке входящих пакетов конкретного интерфейса драйвер сетевой карты может направлять все прерывания на одно ядро, создавая затор в подсистеме NAPI.

2. Тюнинг сетевых очередей (RPS / XPS) для интерфейса WireGuard

Включите программное распределение пакетов (Receive Packet Steering) по всем доступным физическим ядрам процессора:

# Скрипт активации RPS для wg0 на 8-ядерном сервере (битовая маска ff)
echo "ff" > /sys/class/net/wg0/queues/rx-0/rps_cpus

# Увеличение длины очереди сетевого интерфейса
ip link set dev wg0 txqueuelen 10000
ip link set dev eth0 txqueuelen 10000

3. Оптимизация сетевого стека в /etc/sysctl.d/99-wireguard-tuning.conf

# Увеличение буферов сокетов для передачи больших объемов данных
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432

# Увеличение размера входящей очереди ядра
net.core.netdev_max_backlog = 250000

# Оптимизация TCP BBR для снижения влияния потерь
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# Отключение задержек медленного старта
net.ipv4.tcp_slow_start_after_idle = 0
sysctl --system

4. Тюнинг физического адаптера (ethtool)

# Увеличение кольцевых буферов сетевой карты до максимума
ethtool -G eth0 rx 4096 tx 4096

# Включение аппаратных оффлоадов (GSO, GRO)
ethtool -K eth0 rx-gro-list off
ethtool -K eth0 gro on gso on tso on

5. Проверка балансировки нагрузки по ядрам

# Мониторинг прерываний и очередей в реальном времени
mpstat -P ALL 1
hopwatch -i 1 || htop
💡 Практика специалистов: Если сервер обслуживает более 2000 активных клиентов, обязательно разделите их на несколько виртуальных интерфейсов (wg0, wg1, wg2) на разных UDP-портах. Это позволит ядру создать независимые рабочие потоки для каждого сетевого пространства имен.

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

Почему WireGuard в Go (wireguard-go) работает медленнее модуля ядра?

Реализация в пространстве пользователя (wireguard-go) требует постоянного переключения контекста между User Space и Kernel Space через интерфейс /dev/net/tun, что снижает скорость в 3–5 раз по сравнению с нативным модулем ядра.

Какой MTU является оптимальным для WireGuard поверх стандартного Ethernet?

Стандартный безопасный MTU для WireGuard через IPv4 — 1420 байт (1500 - 60 байт на IPv4/UDP/WireGuard заголовок) и 1400 байт для IPv6.

Помогает ли CPU Pinning повысить стабильность WireGuard?

Да, изоляция ядер процессора через isolcpus и привязка очередей сетевых карт через smp_affinity предотвращают переключение контекстов и исключают сброс L1/L2/L3 кэшей процессора.

Поддерживает ли WireGuard алгоритмы аппаратного ускорения Intel QAT?

WireGuard использует потоковый шифр ChaCha20-Poly1305, который отлично оптимизирован под векторные инструкции AVX-512/AVX2 современных CPU, но не поддерживается старыми чипами AES-NI без векторных инструкций.

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