Kiri's numbers, live

Move the sliders and press the buttons. The Mac numbers were measured on an Apple Silicon Mac, macOS 27.0.1, last run 2026-10-24; the Windows table is at the end.

How many containers fit?

Each engine spends memory of its own before your containers use any. Kiri runs one small daemon and no per-container process. OrbStack runs dockerd and containerd, plus a shim process for every container.

Kiri
OrbStack

What's counted
  • Kiri: the daemon and guest agent (9.7 MB) plus Apple's VM helper process (69 MB). No per-container memory: there is no shim.
  • OrbStack: dockerd + containerd (216 MB) plus 7.9 MB for each container's shim (143 shims used 1133 MB).
  • Not counted for either: the Linux kernel inside the VM, page cache, and OrbStack's own VM helper, which we didn't measure. That leaves out memory on OrbStack's side, so the gap is if anything larger than shown.
  • Docker Desktop's engine memory isn't in our results yet, so it isn't here.

Start a container

Create from alpine, run true, exit, remove. Median of 30 runs per engine, on the same Mac, in the same session. The race below plays at real speed.

Kiri reports a --rm container's exit once its record is removed, then deletes its files just after; with the delete inside the timing it was about 3 ms. Through the docker CLI, most of Kiri's ~14 ms is the CLI starting up. OrbStack had 86 containers and a Kubernetes cluster running during the run, which widens its spread.

From 810 ms to 112 ms

Kiri boots a Linux VM before your first container. These are the steps that made it fast: cold boot to agent ready, median of 5.

  1. stock arm64 defconfig kernel810 ms
  2. allnoconfig + only what the VM has175 ms
  3. expedited RCU (cgroup2 mount 23 ms -> 0.1 ms)140 ms
  4. virtio-pci reset poll patch112 ms

Of the 112 ms, 95 ms is Apple's Virtualization.framework starting its helper. The kernel reaches PID 1 in 8 ms, and the agent is ready 0.4 ms after that.

On Windows

The same kind of run against the engines people use on Windows. Best in each column is highlighted.

Enginerunlower is betterexeclower is better200 MB outhigher is better200 MB inhigher is betterbind writehigher is betterbind readhigher is betterpublished porthigher is betterbuildlower is betterpulllower is better
Kiri (main)188 ms187 ms209 MB/snot yet1467 MB/s3851 MB/s10.3 Gbit/s1113 ms2862 ms
Docker Engine 29.9.2697 ms224 ms56 MB/s129 MB/s819 MB/s1307 MB/s100.7 Gbit/s1723 ms2239 ms
Podman 4.9.31105 ms274 ms70 MB/s121 MB/s593 MB/s907 MB/s51.9 Gbit/s1148 ms4921 ms
nerdctl 2.4.1631 ms57 ms72 MB/s131 MB/s845 MB/s1485 MB/s52.4 Gbit/s1211 ms1796 ms
Colima 0.10.3635 ms226 ms20 MB/s70 MB/s493 MB/s1496 MB/s0.8 Gbit/s2472 ms4418 ms
Docker Desktop 29.8.2714 ms224 ms114 MB/s143 MB/s826 MB/s1283 MB/s87.8 Gbit/s2008 ms2114 ms

Kiri's "200 MB in" result wasn't valid in this run, so it's left out rather than guessed. Docker Engine leads on published ports by a wide margin; that's where Kiri has the most work left.

Raw data: runkiri.com/bench. Status "measured" means measured on that machine; design targets are left off this page.