Benchmarks
Automated benchmark results from CI.
Environment: Proxmox VM, i9-13900H, 4 vCPU (pinned), Ubuntu 24.04.
Per-commit Results
Benchmarks run on every push to main.
Hybrid TCP-lane aggregation (v0.9.0)
Symmetric 2×100 Mbit / 25 ms, TCP uplink, iperf3 -P {1,2,4,8,16}, 3 reps.
The hybrid TCP stream lane terminates TCP at the client and relays it in-order over a QUIC STREAM, so even a single flow aggregates both paths — reaching ~187 Mbps (≈93 % of the 200 Mbps aggregate) at every stream count. Raw multipath (datagram tunneling) instead makes a single flow back off on cross-path reorder, so it only catches up as parallel streams grow (WLB -P 1: 96 → 187 Mbps, +95 %).


Asymmetric paths — same bench on A = 300 Mbit / 10 ms + B = 80 Mbit / 30 ms (380 Mbps aggregate). Hybrid ON saturates the aggregate on asymmetric paths too — 350–357 Mbps (≈93 % of 380 Mbps) at -P ≥ 2. Raw multipath never fully recovers here: with WLB the cross-path reorder penalty (20 ms vs 60 ms RTT legs) caps it at 330 Mbps even at 16 streams, and MinRTT keeps everything on the fast path (~275 Mbps) since it only spills when cwnd-blocked. Unlike the symmetric case, the lane's gain therefore persists at every stream count: MinRTT +29–35 %, WLB +26 % (-P 1) → +7 % (-P 16).


SRT live streaming
SRT contribution feeds over emulated impaired links (netns). mqvpn defaults (WLB scheduler, BBR v2) + SRT receiver lossmaxttl=32.
Bonding two weak or lossy links turns an unwatchable SRT feed into a stable one. Below, an 8 Mbps FHD stream where each uplink alone is only 6 Mbit — a single connection (left) vs the same two connections bonded by mqvpn (right):
| Scenario | Direct (single link) | mqvpn (2-path) |
|---|---|---|
| Starved uplinks (8 Mbps FHD over 2 × 6 Mbit) | VMAF 8.6, 1.2 s frozen | VMAF 87.7, 0 s frozen |
| Exceeds any single link (120 Mbps over 2 × 100 Mbit) | 31.5 % stream loss | 0.06 % stream loss |
| Dual cellular (42 Mbps over 40 + 30 Mbit lossy links) | 20–40 % stream loss | 0.9 % stream loss |
VMAF: perceptual video quality score, 0–100 (higher is better).
Full report and comparison videos: bench_results/srt/
RTMP live streaming
RTMP publishing over emulated impaired links (netns), through mqvpn's hybrid TCP lane. OBS-like publisher behaviour: 10 s stall detection, 2 s reconnect retry.
RTMP runs over a single TCP connection and cannot bond links by itself. Through mqvpn it bonds transparently — the encoder and the streaming service stay unmodified. Below, one of two bonded links is cut for 30 seconds mid-stream — direct (left) stops for ~33 s; mqvpn (right) never stops:
| Scenario | Direct (single link) | mqvpn (2-path) |
|---|---|---|
| Two weak uplinks (8 Mbps over 2 × 6 Mbit) | capped at 5.7 Mbps, drifts behind live | 7.8 Mbps, stays live |
| Bursty mobile-style loss | repeated disconnects, barely delivers | stable, no disconnects |
| One link cut for 30 s | stream drops until the link returns | keeps streaming |
Full report with all numbers: RTMP bonding benchmark — data and videos: bench_results/rtmp/