This episode covers measuring and testing Firecracker: measuring cold boot versus snapshot time, memory overhead, IOPS and bandwidth throughput, running load tests with thousands of microVMs per host, and failure injection drills to validate platform resilience.

Firecracker claims ~125 ms boot and < 5 MiB overhead. Claims like that must be tested — on your host, with your workloads. Episode 16 turns you from a Firecracker user into an engineer who measures Firecracker: proper benchmark methodology, the numbers to measure, and how to validate platform resilience under pressure.
Why is this episode important? Every production decision — how many microVMs per host, when to use snapshots, how big the overhead is — must be based on numbers, not intuition. This episode gives you the framework for getting those numbers in a defensible way.
Boot time is the most iconic metric. What you must distinguish clearly:
A practical measuring method — use timestamps inside the guest and compare with host time:
# In the guest: note the kernel load time (from dmesg) and when the app is ready
cat /proc/uptimeFor precise measurement from the host side, measure the difference between InstanceStart and when the guest output is "ready":
time curl --unix-socket /tmp/firecracker.sock -X PUT http://localhost/actions \
-d '{ "action_type": "InstanceStart" }'The correct interpretation:
Watch out for variability: measure 10+ times, take the median and p95, not a single run. Boot time is affected by host load, NUMA, and page cache.
Firecracker's overhead (< 5 MiB per VM above guest memory) can be measured with cgroup or /proc:
ps -o pid,rss,comm -C firecrackerRead it correctly:
mem_size_mib).mem_size_mib + overhead = total VM footprint.For a thorough measurement, also add the page cache from a shared rootfs — this is why a read-only rootfs lets 10 VMs with the same image use the same page cache. An honest measurement: measure the host before and after adding N VMs, divide the difference by N — not just summing RSS.
Storage and networking need throughput numbers. Two standard tools:
fio --name=test --rw=randread --size=64m --bs=4k \
--direct=1 --numjobs=4 --runtime=30 --group_reportingiperf3 -s # on one guest
iperf3 -c <ip-other-guest> # on another guestInterpretation: storage IOPS and network bandwidth are measured after the rate limiter and cgroup are active — those are the numbers relevant to production. Also compare numbers without the rate limiter to understand the available margin. Measure multiple directions (rx/tx) and multiple block sizes; a single number doesn't tell the whole story.
The biggest architectural decision — how many microVMs per host — must be verified with real load testing. A healthy methodology:
A simple script for scale testing using the jailer + API:
for i in $(seq 1 200); do
jailer --id "vm-$i" --exec-file /usr/local/bin/firecracker \
--uid 123 --gid 100 --chroot-base-dir /srv/jailer &
doneWatch the boot time curve against the number of VMs. Healthy density keeps boot stable; too-high density makes boot slow down exponentially. This data is what determines the capacity numbers in episode 19.
Warning
During a load test, don't change other variables at the same time. Increase just one dimension at a time (number of VMs, or memory size, or bandwidth) — otherwise you won't know the cause of the performance drop. This is a basic experiment rule that's often violated.
A healthy platform isn't visible when things are normal — it's visible when things fail. Failure injection simulates failures to validate that the system recovers:
tc netem or throttling) — does timeout handling work?kill -9 <firecracker-pid>Observe: is the socket cleaned up? Is the TAP released? Is the cgroup empty? A good system leaves little garbage behind; a bad system accumulates leaked resources until the host runs out.
For your own platform on top of Firecracker, three levels of testing:
A key pattern for stable tests: always clean up resources at the end of a test (remove chroot, TAP, cgroup), and don't run parallel tests that share the same socket or port. Good Firecracker tests can be repeated thousands of times without degrading the host.
The key takeaways:
In the next episode 17 we'll look at the latest features: Firecracker 1.16 & The Latest Features — the CVE-2026-5747 fix in v1.16.1, VMClock device support, testing on Intel Granite Rapids, snapshot improvements, experimental VFIO device passthrough, and the rust-vmm integration direction.