Files
volt-vmm/docs/benchmark-warm-start.md
Karl Clinger 40ed108dd5 Volt VMM (Neutron Stardust): source-available under AGPSL v5.0
KVM-based microVMM for the Volt platform:
- Sub-second VM boot times
- Minimal memory footprint
- Landlock LSM + seccomp security
- Virtio device support
- Custom kernel management

Copyright (c) Armored Gates LLC. All rights reserved.
Licensed under AGPSL v5.0
2026-03-21 01:04:35 -05:00

10 KiB
Raw Permalink Blame History

Volt vs Firecracker — Warm Start Benchmark

Date: 2025-03-08 Test Host: Intel Xeon Silver 4210R @ 2.40GHz, 20 cores, Linux 6.1.0-42-amd64 (Debian) Kernel: Linux 4.14.174 (vmlinux ELF, 21,441,304 bytes) — identical for both VMMs Volt Version: v0.1.0 (with i8042 + Seccomp + Caps + Landlock) Firecracker Version: v1.6.0 Methodology: Warm start (all binaries and kernel pre-loaded into OS page cache)


Executive Summary

Test Volt (warm) Firecracker (warm) Delta
Boot to kernel panic (default) 1,356 ms median 1,088 ms median NF +268ms (+25%)
Boot to kernel panic (no-i8042) 296 ms median
Boot to userspace 548 ms median N/A

Key findings:

  • Warm start times are nearly identical to cold start times — this confirms that disk I/O is not a bottleneck for either VMM
  • The ~268ms gap between Volt and Firecracker persists (architectural, not I/O related)
  • Both VMMs show excellent consistency in warm start: ≤2.3% spread for Volt, ≤3.3% for Firecracker
  • Volt boots to a usable shell in 548ms warm, demonstrating sub-second userspace availability

1. Warm Boot to Kernel Panic — Side by Side

Both VMMs booting the same kernel with console=ttyS0 reboot=k panic=1 pci=off, no rootfs, 128MB RAM, 1 vCPU. Time measured from process start to "Rebooting in 1 seconds.." appearing in serial output.

Volt (20 iterations)

Run Time (ms) Run Time (ms)
1 1,348 11 1,362
2 1,356 12 1,339
3 1,359 13 1,358
4 1,355 14 1,370
5 1,345 15 1,359
6 1,348 16 1,341
7 1,349 17 1,359
8 1,363 18 1,355
9 1,339 19 1,357
10 1,343 20 1,361

Firecracker (20 iterations)

Run Time (ms) Run Time (ms)
1 1,100 11 1,090
2 1,082 12 1,075
3 1,100 13 1,078
4 1,092 14 1,086
5 1,090 15 1,086
6 1,090 16 1,102
7 1,073 17 1,067
8 1,085 18 1,087
9 1,072 19 1,103
10 1,095 20 1,088

Statistics — Boot to Kernel Panic (default boot args)

Statistic Volt Firecracker Delta
Min 1,339 ms 1,067 ms +272 ms
Max 1,370 ms 1,103 ms +267 ms
Mean 1,353.3 ms 1,087.0 ms +266 ms (+24.5%)
Median 1,355.5 ms 1,087.5 ms +268 ms (+24.6%)
Stdev 8.8 ms 10.3 ms NF tighter
P5 1,339 ms 1,067 ms
P95 1,363 ms 1,102 ms
Spread 31 ms (2.3%) 36 ms (3.3%) NF more consistent

2. Firecracker — Boot to Kernel Panic (no-i8042)

With i8042.noaux i8042.nokbd added to boot args, eliminating the ~780ms i8042 probe timeout.

Run Time (ms) Run Time (ms)
1 304 11 289
2 292 12 293
3 311 13 296
4 294 14 307
5 290 15 299
6 297 16 296
7 312 17 301
8 296 18 286
9 293 19 304
10 317 20 283
Statistic Value
Min 283 ms
Max 317 ms
Mean 298.0 ms
Median 296.0 ms
Stdev 8.9 ms
P5 283 ms
P95 312 ms
Spread 34 ms (11.5%)

Note: Volt emulates the i8042 controller, so it responds to keyboard probes instantly (no timeout). Adding i8042.noaux i8042.nokbd to Volt's boot args wouldn't have the same effect since the probe already completes without delay. The ~268ms gap between Volt (1,356ms) and Firecracker-default (1,088ms) comes from other architectural differences, not i8042 handling.


3. Volt — Warm Boot to Userspace

Boot to "VOLT VM READY" banner (volt-init shell prompt). Same kernel + 260KB initramfs, 128MB RAM, 1 vCPU.

Run Time (ms) Run Time (ms)
1 560 11 552
2 576 12 556
3 557 13 562
4 557 14 538
5 556 15 544
6 534 16 538
7 538 17 534
8 530 18 549
9 525 19 547
10 552 20 534
Statistic Value
Min 525 ms
Max 576 ms
Mean 547.0 ms
Median 548.0 ms
Stdev 12.9 ms
P5 525 ms
P95 562 ms
Spread 51 ms (9.3%)

Headline: Volt boots to a usable userspace shell in 548ms (warm). This is faster than either VMM's kernel-only panic time because the initramfs provides a root filesystem, avoiding the slow VFS panic path entirely.


4. Warm vs Cold Start Comparison

Cold start numbers from benchmark-comparison-updated.md (10 iterations each):

Test Cold Start (median) Warm Start (median) Improvement
NF → kernel panic 1,338 ms 1,356 ms ~0% (within noise)
NF → userspace 548 ms 548 ms 0%
FC → kernel panic 1,127 ms 1,088 ms 3.5%
FC → panic (no-i8042) 351 ms 296 ms 15.7%

Analysis

  1. Volt cold ≈ warm: The 3.45MB binary and 21MB kernel load so fast from disk that page cache makes no measurable difference. This is excellent — it means Volt has no I/O bottleneck even on cold start.

  2. Firecracker improves slightly warm: FC sees a modest 3-16% improvement from warm cache, suggesting slightly more disk sensitivity (possibly from the static-pie binary layout or memory mapping strategy).

  3. Firecracker no-i8042 sees biggest warm improvement: The 351ms → 296ms drop suggests that when kernel boot is very fast (~138ms internal), the VMM startup overhead becomes more prominent, and caching helps reduce that overhead.

  4. Both are I/O-efficient: Neither VMM is disk-bound in normal operation. The binaries are small enough (3.4-3.5MB) to always be in page cache on any actively-used system.


5. Boot Time Breakdown

Why Volt with initramfs (548ms) boots faster than without (1,356ms)

This counterintuitive result is explained by the kernel's VFS panic path:

Phase Without initramfs With initramfs
VMM init ~85 ms ~85 ms
Kernel early boot ~300 ms ~300 ms
i8042 probe ~0 ms (emulated) ~0 ms (emulated)
VFS mount attempt Fails → panic path (~950ms) Succeeds → runs init (~160ms)
Total ~1,356 ms ~548 ms

The kernel panic path includes stack dump, register dump, reboot timer (1 second in panic=1), and serial flush — all adding ~800ms of overhead that doesn't exist when init runs successfully.

VMM Startup: Volt vs Firecracker

Phase Volt Firecracker (--no-api) Notes
Binary load + init ~1 ms ~5 ms FC larger static binary
KVM setup 0.1 ms ~2 ms Both minimal
CPUID config 35 ms ~10 ms NF does 46-entry filtering
Memory allocation 34 ms ~30 ms Both mmap 128MB
Kernel loading 14 ms ~12 ms Both load 21MB ELF
Device setup 0.4 ms ~5 ms FC has more device models
Security hardening 0.9 ms ~2 ms Both apply seccomp
Total to VM running ~85 ms ~66 ms FC ~19ms faster startup

The gap is primarily in CPUID configuration: Volt spends 35ms filtering 46 CPUID entries vs Firecracker's ~10ms. This represents the largest optimization opportunity.


6. Consistency Analysis

VMM Test Stdev CV (%) Notes
Volt Kernel panic 8.8 ms 0.65% Extremely consistent
Volt Userspace 12.9 ms 2.36% Slightly more variable (init execution)
Firecracker Kernel panic 10.3 ms 0.95% Very consistent
Firecracker No-i8042 8.9 ms 3.01% More relative variation at lower absolute

Both VMMs demonstrate excellent determinism in warm start conditions. The coefficient of variation (CV) is under 3% for all tests, with Volt's kernel panic test achieving the tightest distribution at 0.65%.


7. Methodology

Test Setup

  • Same host, same kernel, same conditions for all tests
  • 20 iterations per measurement (plus 2-3 warm-up runs discarded)
  • All binaries pre-loaded into OS page cache (cat binary > /dev/null)
  • Wall-clock timing via date +%s%N (nanosecond precision)
  • Named pipe (FIFO) for real-time serial output detection without buffering delays
  • Guest config: 1 vCPU, 128 MB RAM
  • Boot args: console=ttyS0 reboot=k panic=1 pci=off i8042.noaux (Volt default)
  • Boot args: console=ttyS0 reboot=k panic=1 pci=off (Firecracker default)

Firecracker Launch Mode

  • Used --no-api --config-file mode (no REST API socket overhead)
  • This is the fairest comparison since Volt also uses direct CLI launch
  • Previous benchmarks used the API approach which adds ~8ms socket startup overhead

What "Warm Start" Means

  1. All binary and kernel files read into page cache before measurement begins
  2. 2-3 warm-up iterations run and discarded (warms KVM paths, JIT, etc.)
  3. Only subsequent iterations counted
  4. This isolates VMM + KVM + kernel performance from disk I/O

Measurement Point

  • "Boot to kernel panic": Process start → "Rebooting in 1 seconds.." in serial output
  • "Boot to userspace": Process start → "VOLT VM READY" in serial output
  • Detection via FIFO pipe (mkfifo) with line-by-line scanning for marker string

Caveats

  1. Firecracker v1.6.0 (not v1.14.2 as in previous benchmarks) — version difference may affect timing
  2. Volt adds i8042.noaux to boot args by default; Firecracker's config used bare pci=off
  3. Both tested without jailer/cgroup isolation for fair comparison
  4. FIFO-based timing adds <1ms measurement overhead

Raw Data

Volt — Kernel Panic (sorted)

1339 1339 1341 1343 1345 1348 1348 1349 1355 1355
1356 1357 1358 1359 1359 1359 1361 1362 1363 1370

Volt — Userspace (sorted)

525 530 534 534 534 538 538 538 544 547
549 552 552 556 556 557 557 560 562 576

Firecracker — Kernel Panic (sorted)

1067 1072 1073 1075 1078 1082 1085 1086 1086 1087
1088 1090 1090 1090 1092 1095 1100 1100 1102 1103

Firecracker — No-i8042 (sorted)

283 286 289 290 292 293 293 294 296 296
296 297 299 301 304 304 307 311 312 317

Generated by automated warm-start benchmark suite, 2025-03-08 Benchmark script: /tmp/bench-warm2.sh