Skip to content

Benchmarks

Measured on 2026-10-25

DataplaneRuns inProtocol and cipher
ranet3UserspaceESP in UDP, AES-256-GCM
wireguard-goUserspaceWireGuard, ChaCha20-Poly1305
TailscaleUserspaceWireGuard, ChaCha20-Poly1305
NetBirdUserspaceWireGuard, ChaCha20-Poly1305
WireGuardKernelWireGuard, ChaCha20-Poly1305
NetBirdKernelWireGuard, ChaCha20-Poly1305
IPsecKernel (xfrm)ESP in UDP, AES-256-GCM

2 runs under saturation

Head to head

DataplaneThroughputhigher is betterCPU per Gbit/slower is betterLatency p99lower is better
wireguard-go user1.3-1.5x better0.8-0.9x better0.6-1.2x mixed
Tailscale user1.3-1.5x better0.8-0.9x better0.2-0.6x better
NetBird user1.3-1.5x better0.8-0.9x better0.2-1.4x mixed
WireGuard kernel2.0-2.7x better0.5-0.6x better1.4-4.8x worse
NetBird kernel2.1-2.6x better0.5-0.6x better1.6-6.4x worse
IPsec kernel2.2-4.0x better1.1-1.6x worse1.7-5.6x worse

Each range is ranet3's result divided by the other dataplane's across the 6 tests below.

Kernel and userspace

Userspace dataplanes copy every packet into their own process and are usually expected to be slower than kernel ones.

1 stream, Gbit/sOne wayBoth waysShare of lineone way
Line limit (10 GbE)8.8418.76*100%
Kernel, best of 34.436.1750%
Userspace, wireguard-go6.8710.6078%
Userspace, Tailscale6.8710.9878%
Userspace, ranet38.7915.8199%

* Plain TCP without tunnel

Kernel WireGuard stays at 4.0 to 4.4 Gbit/s one way.

Kernel IPsec stays at 3.5 to 4.5 Gbit/s because its single flow lands on 1 NIC receive queue.

Full results

Throughput, saturatedGbit/s receivedHigher is better
ranet3userwireguard-gouserTailscaleuserNetBirduserWireGuardkernelNetBirdkernelIPseckernel
1 stream, out8.796.876.876.584.434.184.07
1 stream, in8.806.866.866.774.344.104.08
1 stream, both15.8110.6010.9810.696.176.144.45
8 streams, out8.736.406.345.704.224.003.80
8 streams, in8.746.526.456.734.023.973.54
8 streams, both15.2410.1310.1710.205.585.933.81
CPU cost at 3 Gbit/s offeredBusy cores per Gbit/s, both hostsLower is better
ranet3userwireguard-gouserTailscaleuserNetBirduserWireGuardkernelNetBirdkernelIPseckernel
1 stream, out0.9261.0701.1021.0381.5691.6300.670
1 stream, in0.9141.0811.0861.0391.5771.6520.677
1 stream, both0.8571.0260.9680.9961.5291.5110.541
8 streams, out0.9271.2051.1111.1671.7881.8250.864
8 streams, in0.9311.1711.1211.1631.7831.8490.849
8 streams, both0.9131.0880.9821.0581.5421.5540.683

In the "both" rows kernel IPsec carried only 4.45 and 3.82 of the 6 Gbit/s offered, and NetBird 5.84 at 8 streams.

Latency under saturationRTT p99, msLower is better
ranet3userwireguard-gouserTailscaleuserNetBirduserWireGuardkernelNetBirdkernelIPseckernel
1 stream, out2.742.294.872.341.181.091.39
1 stream, in2.962.634.812.131.001.071.26
1 stream, both2.633.116.023.021.851.671.57
8 streams, out6.6512.0025.2034.801.381.351.42
8 streams, in7.817.7630.206.651.911.221.39
8 streams, both4.636.0318.908.572.982.532.63

Setup

Hardware

Hosts
2 x Dell PowerEdge C6420
Processor
Intel Xeon Gold 6130 with 16 cores and 32 threads
Memory
192 GiB
NIC
Intel X710
Connector
SFP+
Bandwidth
10 Gbit/s each way
Switch
Both hosts on the same Dell S5296F-ON

Software

OS
Debian 13
Kernel
Linux 6.12.111
wireguard-go
0.0.20250522
wireguard-tools
1.0.20260223
Tailscale
1.104.2
headscale
0.29.5
NetBird
0.81.2
iproute2
7.1.0
iperf3
3.21

Method

Traffic
TCP with cubic at inner MTU 1400
Streams
1 and 8
Load
Saturated for throughput and latency and 3 Gbit/s each way for CPU cost
Direction
One way in each direction and both ways at once
Runs
2 runs of 10 seconds with the dataplanes interleaved, throughput and CPU cost averaged, RTT p99 over both runs' pings
Paths
Direct between the hosts for every dataplane, with no relay, checked on every run
Control
headscale for Tailscale and NetBird's own servers on one host, at most 0.002 cores during a run
Outer IP
IPv4, except where Tailscale and NetBird chose IPv6, whose header adds about 1.3% on the wire
CPU cost
Busy cores from /proc/stat summed over both hosts with every dataplane unpinned
Line limit
8.84 Gbit/s of TCP payload one way after ESP in UDP framing and 18.76 Gbit/s both ways without a tunnel