Оптимизация производительности WireGuard в Linux: CPU Pinning и тюнинг очереди
- Пропускная способность 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 100003. Оптимизация сетевого стека в /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 = 0sysctl --system4. Тюнинг физического адаптера (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 on5. Проверка балансировки нагрузки по ядрам
# Мониторинг прерываний и очередей в реальном времени
mpstat -P ALL 1
hopwatch -i 1 || htop Частые вопросы (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 без векторных инструкций.