Platform internals
Millisecond sandboxes come from a stack of kernel mechanisms working together: KVM, userfaultfd, copy-on-write storage, network namespaces and cgroups. These posts go underneath the API into memory, networking, storage and scheduling, with the measurements behind the design choices.
PandaStack benchmarks170 posts
nftables vs iptables for Per-Sandbox Networking: Why I Still Write iptables
PandaStack writes `iptables` into 16,384 pre-allocated network namespaces, which is the unfashionable choice. The reason is that nftables' biggest win — not walking a long linear chain — is an argument about rule count, and our rule count per namespace is four. What actually hurts at fleet scale is the state nobody namespaced properly.
memory.high vs memory.max: Throttle or Kill
Hard limit and soft limit is the wrong mental model. One of these files converts an overcommit mistake into a dead process; the other converts it into a latency problem. For a multi-tenant fleet, that difference is the entire design.
Guest Writeback Throttling: Why dirty_ratio Is Wrong for a 2 GiB MicroVM
The guest is extremely confident about a disk that does not exist. The host is also confident, about different things. Between those two confidences live your tail latencies.
DAMON: Measuring What a Sandbox Actually Touches
Charging a host for every guest's configured RAM is what caps your density, and it is wrong by a lot — a guest handed 4 GiB to run an idle Node server touches a fraction of it. DAMON is the kernel subsystem that can tell you which fraction, at a cost bounded by region count instead of memory size. Here is how it works, and the three different wrong answers you can get instead.
Per-Sandbox Disk I/O Throttling and the Neighbour You Cannot See
CPU contention is visible and roughly fair. Memory contention has pressure signals. Disk contention shows up as latency in somebody else's unrelated workload, with no attribution and no ticket. Here are the three places you can actually throttle it, what each one really controls, and the two layers that quietly lie to you.
Patching the Host Kernel Under Running MicroVMs
The host kernel is the thing your isolation boundary is made of. It cannot be restarted without taking every guest on the box with it, and the clock on the patch is a security clock.
MGLRU and MicroVM Density: Reclaim When Every Page Is Someone's Guest
The host kernel picks reclaim victims using access information already filtered through a second kernel. MGLRU gives it generations instead of two buckets — which changes the shape of your bad days, not how many guests fit on the box.
The I/O Scheduler Inside a MicroVM Is Almost Always Wrong
Your guest's block layer is sorting requests by sector number to optimise seeks on a platter that is a file on somebody else's filesystem. Why `none` is the answer, why it still merges, and why readahead is the knob that actually moves the number.
Build, Boot, Test: Kernel CI on MicroVMs (and Where It Stops)
"Does this patch boot" should be a per-commit check, not a nightly. A microVM makes the boot step sub-second and a git bisect a coffee break — right up to the device model, the nested-virt wall, and the fact that you cannot swap our guest kernel.
More posts in this topic
- Can Firecracker Run Windows? No, and the Reason Is the Point
- Giving a MicroVM Access to a Customer's Private Network
- Rowhammer and the Attacks Below Your Hypervisor
- How to Put a CDN in Front of a Scale-to-Zero App
- Skipping DHCP: the Firecracker boot line you actually ship
- virtiofs vs virtio-blk: How Files Actually Get Into a MicroVM
- What "persistent" actually means in a sandbox
- Interrupts, IRQs, and Where microVM Tail Latency Comes From
- Why the disk under your sandbox fleet decides your boot time
- Your benchmark ran at a different clock speed than production
- Rate-Limiting the Network on a Per-Sandbox Basis
- Spectre, Meltdown, and What a microVM Actually Protects You From
- Conntrack Table Limits: The Shared Resource Under Your MicroVM Fleet
- Hyper-Threading and microVM Isolation: the SMT Decision
- PSI: The Right Instrument for Memory Oversubscription
- EEVDF vs CFS: What the New Linux Scheduler Means for MicroVM Density
- How to Debug a Hung Process in a Sandbox
- Where Sleeping Workloads Live: Storage Tiering Explained
- How to profile code running in a sandbox
- PID namespaces and process isolation, explained: what CLONE_NEWPID actually gives you
- Container Escape CVEs, by Class: What the Pattern Tells You
- tmpfs in a microVM: The Filesystem That Eats Your RAM
- How a Sandbox Scheduler Decides Where Your VM Lands
- How Many Sandboxes Fit on One Machine?
- Where Scale-to-Zero Wake Time Actually Goes
- UFFDIO_ZEROPAGE vs UFFDIO_COPY: Stop Paying RAM for Zeros
- The Snapshot-Restore Thundering Herd, Explained
- How to Benchmark Sandbox Cold Start Honestly
- Scheduling sandbox bursts: why 50 creates land on one host
- eBPF for sandbox observability: what it can and cannot see
- How to Expose a Sandbox Port on a Public URL
- userfaultfd in Production: How the Pager Fails
- Sparse Files and Hole Punching: Why Your Snapshot Lies About Its Size
- MAP_PRIVATE vs MAP_SHARED: The mmap Flag That Decides Everything
- Mount namespaces and pivot_root, explained for sandboxing: how filesystem isolation really works
- Your Firecracker Snapshot Restore Failed: A Field Guide
- You Ship the Kernel: Firecracker Guest 5.10 vs 6.1
- Should You Compress Firecracker Memory Snapshots?
- How to handle file uploads in a deployed app
- The best load testing platforms in 2026
- Per-Room WebRTC Media Servers in MicroVMs
- Guest kernel lockdown and module loading in Firecracker microVMs
- fsfreeze and the Three Tiers of Snapshot Consistency
- IPv6 for Firecracker MicroVM Fleets
- KSM Memory Deduplication for MicroVMs — And Why It's a Trap
- overlayfs Inside the Guest: Read-Only Rootfs, Writable Upper Layer
- Firecracker on arm64 vs x86_64: What Actually Differs
- Confidential computing for microVMs: SEV-SNP, TDX, and arm CCA explained
- Linux capabilities, explained for sandboxing: five sets, one bounding ceiling, and the bits that are still root
- io_uring and sandbox security: the fast path that walks around your syscall filter
- IP Address Planning for a MicroVM Fleet
- How to persist data in a sandbox
- Firecracker Guest DNS Resolution Explained
- CPU Steal Time in microVMs: Your VM Isn't Slow, It's Waiting
- MicroVM Rootfs Filesystems: ext4 vs XFS vs Btrfs
- AppArmor vs SELinux for sandboxing: what mandatory access control actually buys you
- Firecracker vCPU Hotplug, and How CPU Scaling Actually Works
- Firecracker Guest MTU and Network Tuning Explained
- Side-channel attacks in multi-tenant compute, explained
- Memory Prefetch: The Working Set Is the Real Unit of a Fast Restore
- Why your JavaScript build runs out of memory
- Connection pooling, and why you ran out of connections
- How much memory does your Postgres actually need?
- The Postgres metrics worth watching
- How many browsers can one machine actually run?
- Firecracker config file vs REST API: two ways to boot a microVM
- Snapshot-Restore vs Live Migration: Not the Same Problem
- Routing Postgres connections by SNI
- Building a load-testing fleet on microVMs
- How to Write a userfaultfd Handler for Firecracker
- Firecracker Boot Sources: initrd vs a Root Block Device
- User namespaces, explained for sandboxing: what root-in-a-namespace actually buys you
- The Firecracker REST API: booting a microVM by hand with curl
- Firecracker boot_args, argument by argument
- Snapshot, Restore, and the Connections You Left Open
- VM exits: the actual currency of virtualization overhead
- cgroups v2 Explained for Sandboxing Untrusted Code
- Firecracker Shutdown and Reboot Semantics, Explained
- Nested virtualization and Firecracker: what actually works
- What Runs as PID 1 Inside a MicroVM (and Why It Matters)
- virtio-blk Discard and TRIM in Firecracker, Explained
- Landlock explained: unprivileged filesystem sandboxing in the Linux kernel, and where it stops
- Database Branching with Copy-on-Write MicroVMs
- Firecracker Hugepages for Guest Memory, Explained
- What's Actually Inside a Firecracker Snapshot
- Firecracker Metrics and Logger FIFOs, Explained
- Firecracker virtio-net RX/TX Queues Explained
- NUMA Locality and Firecracker Snapshot Restore
- Snapshot Restore vs Process Preforking: Same Idea, Different Boundary
- Snapshot Restore vs Cold Boot: The Tradeoffs Nobody Lists
- Snapshot Restore vs Container Image Pull: Two Ways to Start Fast
- The Snapshot Clone Randomness Problem
- Swap and zram Inside a Firecracker MicroVM: What Actually Happens
- Guest Clock Drift After a Firecracker Snapshot Restore
- Firecracker's seccomp-BPF filters explained: locking down the VMM's own syscalls
- Firecracker vhost-user-block Devices Explained
- Firecracker CPUID masking, explained
- Guest page cache: why it bloats microVM snapshots
- Firecracker Dirty Page Tracking, Explained
- Why Firecracker Uses virtio-MMIO, Not virtio-PCI
- How Network Namespaces Isolate Each Firecracker MicroVM
- Firecracker Guest Memory Layout, Explained
- How Firecracker Restores Guest Memory: mmap & MAP_PRIVATE
- Guest Clocks and the TSC After a Firecracker Restore
- Firecracker's vsock-over-UDS Handoff, Explained
- Best Firecracker Networking Tools & Approaches (2026)
- Restoring a Firecracker Snapshot on a Different CPU
- How Firecracker uses the Linux KVM API: an internals explainer
- Designing a Guest-Agent Control Protocol Over vsock
- Memory Oversubscription in MicroVM Fleets, Explained
- The Firecracker VMGenID Device, Explained
- Firecracker Networking: TAP vs macvtap (and netns)
- CPU Pinning and Noisy Neighbors in microVM Fleets
- Firecracker Block Device Cache Modes Explained
- How Copy-on-Write Page Tables Work (and Why VM Fork Is Fast)
- Giving AI Agents Persistent Memory & State via microVM Snapshots
- Firecracker virtio-rng and Guest Entropy Explained
- Firecracker Snapshot Version Compatibility & Cross-Version Restore
- microVM Memory: Balloon vs Hotplug vs Re-Provision
- The PVH Boot Protocol: How Firecracker Skips Firmware
- Firecracker Diff Snapshots Explained
- Copy-on-Write and the Page-Fault Lifecycle, Step by Step
- Firecracker Snapshot-Restore vs AWS Lambda SnapStart
- The OOM Killer and Guest Memory in Firecracker
- Firecracker Doesn't Use vhost-net (On Purpose)
- Copy-on-Write Memory: Why Forking a VM's RAM Is Cheap
- How Firecracker Schedules vCPUs: The Threading Model
- Debugging a Firecracker microVM That Won't Boot
- The Zygote Pattern: Fork One Warm Snapshot Into Thousands of MicroVMs
- Firecracker Snapshot/Restore vs CRIU Checkpoint/Restore
- The Serverless Cold-Start Problem, Explained
- Building a Minimal Firecracker Guest Kernel
- Firecracker's Rate Limiter, Explained
- Firecracker CPU Templates, Explained
- Shared Pages & Copy-on-Write: Packing MicroVMs Densely
- Building an ephemeral web-scraper fleet on microVMs
- Firecracker's io_uring Block Backend Explained
- Snapshot-Restore vs Warm Pools: Two Ways to Kill Sandbox Cold Starts
- How gVisor intercepts syscalls: the Sentry, the Gofer, and platforms explained
- The Security Gotchas of Firecracker Snapshots (Secrets Frozen in RAM)
- Copy-on-Write Rootfs: dm-snapshot vs reflink for MicroVMs
- The Anatomy of a Sub-200ms MicroVM Create
- VM escape attacks explained: what they are and why microVMs shrink the target
- The Firecracker security model: how a microVM actually contains untrusted code
- Kill Cold Starts with microVM Snapshotting: Warm Starts Without a Warm Pool
- The Firecracker virtio-balloon Device, Explained
- Memory Overcommit & Page Sharing: How MicroVMs Get Dense
- The Firecracker Jailer Explained
- How Firecracker's virtio Devices Work
- The Snapshot-Restore Boot Path: Every Sandbox in Under 200ms
- Controlling Network Egress for Untrusted Code
- seccomp explained for developers: filtering syscalls to shrink the kernel attack surface
- vsock Explained: How the Host Talks to a microVM
- How to Optimize MicroVM Cold Start
- How Firecracker Memory Snapshots Actually Work
- Firecracker Networking Explained: TAP, netns, NAT
- Copy-on-Write Rootfs: Why MicroVM Create Is O(metadata)
- userfaultfd: Lazy Memory for Instant VM Restore
- How PandaStack Creates a MicroVM in Under 200ms
- Stop an AI Agent Touching the Host Filesystem & Network
- Why Docker Isn't a Sandbox