I benchmarked boxr 0.1.53 against Podman 6.1.2 on a 4 vCPU / 3.9 GiB arm64 host. This was a local build of boxr containing the pasta netns fix, not the released 0.1.55, because rootless pasta is broken in 0.1.55 on this SELinux-enforcing host.
Five runs per case, medians. No CPU pinning, no cache dropping, and the boxr daemon was already warm.
Results
Cold pull
| Tool | Median | Mean | CPU median |
|---|---|---|---|
| boxr | 11.26 s | 12.24 s | 0.93 s |
| Podman | 18.68 s | 20.87 s | 3.71 s |
Podman was 1.66x slower by median, and used about 4x the CPU.
Full --no-cache build
| Tool | Median | Mean | CPU median |
|---|---|---|---|
| boxr | 131.04 s | 134.23 s | 15.39 s |
| Podman | 52.93 s | 51.73 s | 22.48 s |
Podman was 2.48x faster in wall time. boxr used less CPU, which is consistent with Podman doing more parallel build work.
I checked whether Podman’s advantage came from skipping the base-image pull. It did not: forcing --pull=always changed its median by about 1.3 s, and with an explicit base pull before every build Podman stayed about 1.9x faster.
Run
| Case | boxr | Podman | Podman / boxr |
|---|---|---|---|
alpine true, no network | 0.120 s | 1.575 s | 13.2x slower |
alpine true, default network | 0.119 s | 1.024 s | 8.6x slower |
| Python service image, no network | 1.320 s | 1.634 s | 1.24x slower |
| Python service image, batch of 5, per container | 1.202 s | 1.840 s | 1.53x slower |
boxr’s startup is much faster for a trivial container and modestly faster for the Python image. The Python image also used about 3.5x more CPU under boxr, which is worth profiling separately.
Memory
boxr’s process-tree peak RSS was lower (122.4 MiB vs 210.9 MiB in the detailed run), but its system memory delta was much higher (834.5 MiB vs 151.4 MiB). The reason was concrete: boxr copied stage rootfs directories into tempfile::tempdir(), and /tmp on this host is tmpfs. The copies were charged to Shmem and peaked around 832 MiB. That is reclaimable page cache, not anonymous memory, but it is real transient pressure on a 3.9 GiB host. On a disk-backed /tmp the same copies would be page cache and I/O.
Takeaways
- boxr’s cold pull is faster and cheaper in CPU.
- Podman’s parallel build wins on wall time; boxr’s build is not slow because of image pulling.
- boxr’s build memory profile depends heavily on where
TMPDIRpoints. HonoringTMPDIRor avoiding repeated whole-rootfs copies would be a useful optimization. - Container startup is boxr’s strongest result.
The full method and raw numbers are in the project page.