vxedge Phase 3 · in progress

Results · phases 1–2

Evidence, not claims

Each hypothesis with its number, its figure, its archive and the caveat that matters most. Every value is quoted from FACTS.md, the registry that copies each frozen summary in vxperiments/results/.

HypothesisExperimentVerdictHeadline
H1 — slice isolation under overloadexp-001holdsadas p99 81.9 µs at 600 mbit vs 89.6 µs baseline
H2 — real S-NSSAI slicing vs static VLANexp-010holdsp99 growth 0.95× vs 0.91×
H3 — virtual-ECU packagingexp-002bholdstransport Δp50 −26.0 µs
H4 — OTA co-locationexp-003holdsΔp50 −0.3 µs, inside IQR

Every campaign: 5 reps per arm or load point, 1000 pps × 60 s per point (60 000 probes), 10 s warmup discarded. Each result was reproduced by an independent second campaign (--repro) that reached the same verdict. Hover a point or bar for its value and IQR. Every number here is quoted from the facts registry.

H1

Slice isolation under overload

VLAN mapping plus a tc HTB queue-tree reservation keeps the adas slice's tail at baseline while the infotainment slice is driven from idle to 1.2× overload of the 500 mbit uplink. Loss is 0.0 % at every load level. Holds.

exp-001: adas p99 RTT by offered infotainment load. 89.6 µs at 0 mbit falling to 81.9 µs at 600 mbit; zero loss at every load.7080901000100250400600offered infotainment load (mbit)baseline 89.60 mbit: p99 89.6 µs (IQR 6.4), loss 0.0 %100 mbit: p99 87.5 µs (IQR 7.0), loss 0.0 %250 mbit: p99 84.5 µs (IQR 4.7), loss 0.0 %400 mbit: p99 85.2 µs (IQR 4.2), loss 0.0 %600 mbit: p99 81.9 µs (IQR 5.0), loss 0.0 %p99 81.9 µsµs
Figure 1 — exp-001, 5 reps × 5 loads, 60 000 probes per point. adas p99 RTT; dashed line is the 0-load baseline. Manifest sha256 2666fbf561ae…. Archive: vxperiments/results/exp-001/.
load (mbit)p50 µs (IQR)p95 µs (IQR)p99 µs (IQR)loss %
049.9 (0.8)71.4 (6.7)89.6 (6.4)0.0
10051.1 (3.0)72.0 (6.1)87.5 (7.0)0.0
25049.8 (1.9)70.1 (3.3)84.5 (4.7)0.0
40050.6 (1.3)72.3 (3.1)85.2 (4.2)0.0
60051.4 (1.8)69.2 (2.8)81.9 (5.0)0.0

Caveat. An earlier version of this campaign measured loopback delivery instead of the gateway path, because probe and reflector sat in the same network namespace. That defect was fixed with real netns isolation and is now covered by a CI regression test; the numbers above are the corrected re-run. Summary →

H2

Real slicing vs static mapping

S-NSSAI PDU sessions through Open5GS and UERANSIM, compared against exp-001's VLAN arm. The 5G path has a higher absolute floor — p99 ≈ 317–337 µs, since it crosses a software UPF and GTP-U — but its tail grows no faster under load than the VLAN path's. Holds, inside the 1.1× tolerance.

  • S-NSSAI (exp-010)
  • VLAN (exp-001)
exp-010 vs exp-001: p99 indexed to its own 0-load value. At 600 mbit, S-NSSAI 0.95× and VLAN 0.91×.0.85×0.9×0.95×1×1.05×0100250400600offered infotainment load (mbit)VLAN (exp-001), 0 mbit: p99 89.6 µs = 1.00× its 0-load valueVLAN (exp-001), 100 mbit: p99 87.5 µs = 0.98× its 0-load valueVLAN (exp-001), 250 mbit: p99 84.5 µs = 0.94× its 0-load valueVLAN (exp-001), 400 mbit: p99 85.2 µs = 0.95× its 0-load valueVLAN (exp-001), 600 mbit: p99 81.9 µs = 0.91× its 0-load valueVLAN 0.91×S-NSSAI (exp-010), 0 mbit: p99 335.1 µs = 1.00× its 0-load valueS-NSSAI (exp-010), 100 mbit: p99 324.1 µs = 0.97× its 0-load valueS-NSSAI (exp-010), 250 mbit: p99 336.6 µs = 1.00× its 0-load valueS-NSSAI (exp-010), 400 mbit: p99 318.7 µs = 0.95× its 0-load valueS-NSSAI (exp-010), 600 mbit: p99 317.2 µs = 0.95× its 0-load valueS-NSSAI 0.95×
Figure 2 — exp-010 vs exp-001, 5 reps × 5 loads each. p99 RTT indexed to each path's own 0-load value, so the two floors compare on one axis. Manifest sha256 4fa24418b7a1…. Archive: vxperiments/results/exp-010/.
load (mbit)p50 µs (IQR)p95 µs (IQR)p99 µs (IQR)loss %
0269.3 (7.3)305.2 (11.5)335.1 (14.1)0.0
100254.1 (3.6)299.5 (2.6)324.1 (6.9)0.0
250261.6 (4.0)313.1 (4.7)336.6 (12.7)0.0
400260.9 (1.9)294.7 (7.4)318.7 (23.0)0.0
600260.7 (4.7)293.4 (5.9)317.2 (10.8)0.0

Caveat. The first campaign did not hold: nothing in the 5G path applied per-slice QoS. Configuring 5QI/AMBR alone was checked first and changed nothing; the fix was real HTB enforcement on the slice path, then a re-run with host-noise mitigations (CPU governor, core pinning, randomized load order). Every intermediate campaign is kept in the results directory. Summary →

H3

Packaging choice — and the obvious explanation was wrong

exp-002 found microVMs slowest and attributed it to the machine type. exp-002b was built to separate the factors, and the ranking survived while the cause did not: the virtio transport dominates, and machine type alone has no measurable effect. Holds.

exp-002b: adas p50 RTT by zone packaging arm, container 54.6 µs fastest, microvm-mmio 113.9 µs slowest.0 µs40 µs80 µs120 µscontainer: p50 54.6 µs (IQR 1.3), CPU 4.3 %, RSS 7.3 MBcontainer54.6 · IQR 1.3libvirt-q35: p50 70.3 µs (IQR 1.6), CPU 8.15 %, RSS 166.2 MBlibvirt-q3570.3 · IQR 1.6q35-vhost: p50 78.1 µs (IQR 2.5), CPU 9.12 %, RSS 150.6 MBq35-vhost78.1 · IQR 2.5q35-pci: p50 87.6 µs (IQR 2.0), CPU 11.28 %, RSS 150.9 MBq35-pci87.6 · IQR 2.0microvm-pci: p50 87.9 µs (IQR 2.2), CPU 11.4 %, RSS 150.2 MBmicrovm-pci87.9 · IQR 2.2microvm-mmio: p50 113.9 µs (IQR 2.0), CPU 14.95 %, RSS 146.4 MBmicrovm-mmio113.9 · IQR 2.0
Figure 3 — exp-002b, 5 reps × 6 arms, 1.8M probes over 30 archives. adas p50 RTT per packaging arm. Manifest sha256 625840eeeb0c…. Archive: vxperiments/results/exp-002b/.
factorarms comparedΔp50verdict
virtio transport (MMIO → PCI)microvm-pci vs microvm-mmio−26.0 µsmatters (IQR 2.2 µs)
management (libvirt vs raw QEMU)libvirt-q35 vs q35-pci−17.3 µsmatters (IQR 2.0 µs)
vhost-net (on vs off)q35-vhost vs q35-pci−9.5 µsmatters (IQR 2.5 µs)
machine type (q35 vs microvm)q35-pci vs microvm-pci−0.3 µsno measurable effect
armp50 µs (IQR)p99 µs (IQR)CPU %RSS MB
container54.6 (1.3)94.4 (2.8)4.37.3
libvirt-q3570.3 (1.6)117.6 (2.4)8.2166.2
q35-vhost78.1 (2.5)122.9 (4.4)9.1150.6
q35-pci87.6 (2.0)138.6 (2.6)11.3150.9
microvm-pci87.9 (2.2)138.2 (3.2)11.4150.2
microvm-mmio113.9 (2.0)165.0 (6.3)15.0146.4

Caveat. libvirt beating raw QEMU is likely because libvirt enables vhost and optimized virtio settings a bare QEMU invocation does not; that attribution is an inference, not a separate measurement. Summary →

H4

A co-located OTA burst vs the safety slice

Sustained back-to-back 5 MB artifact delivery — 361 deliveries per repetition, 0 failed — runs alongside the adas probe. The median moves by less than the baseline's own spread. Holds.

  • baseline
  • OTA burst
exp-003: adas p50/p95/p99 RTT, baseline vs OTA burst. p50 52.2 vs 51.9 µs, p95 80.7 vs 79.9 µs, p99 97.7 vs 93.1 µs.40 µs60 µs80 µs100 µsp50baseline: p50 52.2 µs (IQR 6.0)ota-burst: p50 51.9 µs (IQR 1.7)Δ -0.3 µsp95baseline: p95 80.7 µs (IQR 4.9)ota-burst: p95 79.9 µs (IQR 6.3)Δ -0.8 µsp99baseline: p99 97.7 µs (IQR 5.6)ota-burst: p99 93.1 µs (IQR 5.5)Δ -4.6 µs
Figure 4 — exp-003, 5 reps × 2 arms, 60 000 probes per arm-repetition, 0.0 % loss in both arms. adas RTT percentiles. Manifest sha256 1efebdef615f…. Archive: vxperiments/results/exp-003/.
armp50 µs (IQR)p95 µs (IQR)p99 µs (IQR)OTA deliveries ok/fail
baseline52.2 (6.0)80.7 (4.9)97.7 (5.6)n/a
ota-burst51.9 (1.7)79.9 (6.3)93.1 (5.5)361 / 0

Caveat. The v1 OTA transport binds a plain host address, so this measures host-level CPU and scheduling contention between OTA and the probe, not gateway-QoS-enforced network contention. A same-day second campaign moved every absolute number outside the first campaign's IQR (0 of 6 metric/arm pairs inside) while the comparative verdict held — session-to-session host drift that within-campaign IQRs do not bound. Summary →

—

What applies to everything above

These are properties of the host class used for phases 1–2, not of one machine:

  • Shared-host gateway — vxgateway runs on the same host as the zones it serves.
  • Non-PREEMPT_RT kernel, performance CPU governor, measurement cores pinned.
  • Userspace-monotonic timestamps — kernel SO_TIMESTAMPING is tracked open work.

Every archive carries metadata.json, the manifest, raw Prometheus scrapes, structured samples and run-env.json. Host requirements per tier, the full methodology and every caveat are in the docs. To reproduce a number: Getting started.