WireGuard 튜닝: UDP 버퍼와 CPU 오프로드
WireGuard UDP 버퍼와 CPU 오프로드를 중심으로 시스템별 핵심 설정, 측정 방법, 예제 명령을 정리한 성능 튜닝 체크리스트
목차
소개
WireGuard는 설계가 단순하고 빠른 VPN이다. 하지만 고성능 환경에서는 기본 설정만으로 한계가 있다. 특히 UDP 버퍼와 CPU 할당이 병목이 되는 경우가 흔하다. 이 글은 처음 접하는 운영자도 이해하기 쉽게 UDP 버퍼 조정과 CPU 오프로드(IRQ, XPS/RPS) 중심의 실무적 설정과 검증 절차를 정리한다.
사전 준비
필요한 도구
- iperf3: 네트워크 성능 측정
- ethtool: NIC 설정 확인·변경
- sysctl 또는 /etc/sysctl.d: 커널 파라미터 적용
- tcpdump 또는 perf: 트래픽·성능 분석
측정 포인트
- 유실률(packet loss)과 지연(latency)
- WireGuard 암호화 오버헤드(CPU 사용률)
- NIC 큐별 처리량 및 IRQ 분배
UDP 버퍼 기본 개념
UDP는 연결 지향이 아니므로 커널 소켓 버퍼 크기가 중요하다. 버퍼가 작으면 수신 큐가 넘쳐 패킷 손실이 발생한다. WireGuard는 UDP를 사용하므로 송수신 버퍼를 충분히 확보해야 안정적인 처리와 높은 처리량을 확보할 수 있다.
WireGuard UDP 버퍼 설정
기본적으로 다음 커널 파라미터를 조정한다. 변화는 시스템 메모리와 응용 부하를 고려해 점진적으로 적용한다.
# sysctl 설정 예시 (/etc/sysctl.d/99-wireguard.conf)
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.netdev_max_backlog=250000
net.ipv4.udp_mem=65536 131072 196608
net.ipv4.udp_rmem_min=8192
net.ipv4.udp_wmem_min=8192
적용은 다음과 같이 진행한다.
sudo sysctl --system
적용 후에는 wg 인터페이스와 루트의 소켓 버퍼가 증가했는지 확인한다.
# 확인 명령
ss -u -a | grep wg
cat /proc/sys/net/core/rmem_max
WireGuard CPU 오프로드 개요
암호화·복호화는 CPU 집약적 작업이다. NIC에서 다수의 큐와 하드웨어 오프로드를 활용하면 CPU 부담을 분산해 처리량을 높일 수 있다. 대표적인 방법은 IRQ 분산, XPS(Transmit), RPS(Receive) 설정이다.
IRQ 분산과 affinity
기본 IRQ 분배는 균등하지 않을 수 있다. 특정 CPU에 IRQ가 몰리면 암호화가 병목된다. IRQ 번호와 연관된 인터럽트를 확인하고 적절히 분산시킨다.
# IRQ 확인
grep -i "eth0\|enp" -n /proc/interrupts
# IRQ affinity 예시 (CPU 0~3 사용)
echo 0f | sudo tee /proc/irq/123/smp_affinity
자동화는 irqbalance를 사용하거나 systemd 서비스로 고정 스크립트를 적용할 수 있다.
XPS/RPS 설정
XPS는 송신 큐의 CPU 마스킹, RPS는 수신 소프트웨어 큐의 CPU 마스킹이다. 적절히 설정하면 각 큐가 다른 CPU에서 처리되어 병렬성이 좋아진다.
# 모든 tx 큐에 대해 xps_cpus 설정 예시 (enp3s0 인터페이스)
for q in /sys/class/net/enp3s0/queues/tx-*; do
echo 0000000f | sudo tee $q/xps_cpus
done
# 모든 rx 큐에 대해 rps_cpus 설정 예시
for q in /sys/class/net/enp3s0/queues/rx-*; do
echo 0000000f | sudo tee $q/rps_cpus
echo 32768 | sudo tee $q/rps_flow_cnt
done
마스크는 CPU 수에 맞춰 변경한다(예: CPU 0~3 사용 시 0000000f).
ethtool 기반 오프로드 제어
NIC 하드웨어 옵션에 따라 GRO/GSO/TSO를 켜거나 끌 수 있다. 일부 환경에서는 GRO를 끄면 WireGuard 지연이 줄지만 CPU 사용이 늘어난다. 테스트로 확인한다.
# 예시: GRO 비활성화
sudo ethtool -K enp3s0 gro off gso off tso off
# 현재 오프로드 상태 확인
sudo ethtool -k enp3s0
성능 측정 절차
- 1) 기본 상태에서 iperf3로 측정(UDP/TCP 모두)
- 2) UDP 버퍼만 조정 후 재측정
- 3) IRQ/XPS/RPS 적용 후 재측정
- 4) 각 단계별 CPU 사용률과 패킷 손실 비교
# 예시: iperf3 UDP 측정
iperf3 -c <서버_IP> -u -b 1G -t 60
예제 적용 스크립트
아래는 핵심 설정을 빠르게 적용하는 스크립트 예시다. 운영 환경에 맞춰 인터페이스 이름과 CPU 마스크를 수정한다.
#!/bin/bash
# apply-wireguard-tune.sh
IFACE=enp3s0
CPU_MASK=0000000f
# sysctl 적용
sudo tee /etc/sysctl.d/99-wireguard.conf <<EOF
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.netdev_max_backlog=250000
net.ipv4.udp_mem=65536 131072 196608
net.ipv4.udp_rmem_min=8192
net.ipv4.udp_wmem_min=8192
EOF
sudo sysctl --system
# XPS/RPS 적용
for q in /sys/class/net/$IFACE/queues/tx-*; do echo $CPU_MASK | sudo tee $q/xps_cpus; done
for q in /sys/class/net/$IFACE/queues/rx-*; do echo $CPU_MASK | sudo tee $q/rps_cpus; echo 32768 | sudo tee $q/rps_flow_cnt; done
주의사항
- 버퍼와 큐 설정은 메모리 사용량을 증가시킨다. 과도한 값은 시스템 전반에 영향이 있다.
- IRQ·XPS 설정은 CPU 토폴로지와 NUMA를 고려한다. 잘못 적용하면 성능이 악화될 수 있다.
- 변경 시 단계별로 측정해 효과를 검증한다.
결론
WireGuard 성능을 끌어올리려면 UDP 버퍼와 CPU 오프로드를 함께 튜닝하는 접근이 효과적이다. 작은 변경을 순차적으로 적용하면서 iperf3와 시스템 통계를 통해 검증하면 안정적으로 성능을 개선할 수 있다.