16 containers on 2 cores: what my ZimaBlade home server actually uses

16 containers on 2 cores: what my ZimaBlade home server actually uses

# performance# ai# learning# devops
16 containers on 2 cores: what my ZimaBlade home server actually usesChristian Anderson

Per-container RAM and CPU from a 2016 dual-core Celeron running Immich, SSO, a proxy and monitoring, 17 days up. RAM mattered more than CPU. Mostly.

People ask if a little box like a ZimaBlade can really run a homelab. Mine runs 16 containers on a dual-core Celeron N3350 from 2016. So I measured what each one actually uses.

The box: 2 cores (1.1 GHz, boosts to 2.4), 16 GB of RAM, two 6 TB IronWolf drives on SATA. It had been up 17 days when I took these, and Docker hadn't restarted a single container.

RAM: Immich is most of it

docker stats on the ZimaBlade: per-container CPU and memory

Added up, the 16 containers use just under 3 GB. The Immich stack (server, Postgres, machine learning, Redis) is about 2.2 GB of that, roughly three quarters:

  • immich-server: 1.34 GB
  • immich-postgres: 602 MB
  • immich-machine-learning: 239 MB
  • uptime-kuma: 183 MB
  • npmplus (reverse proxy): 137 MB
  • homepage: 112 MB

Everything else is tiny. Authelia, the thing every login goes through, is 32 MB. The Cloudflare tunnel is 29 MB. CrowdSec is 57 MB.

The OS says 5.4 GB "used" overall, but 10.5 GB is still available because the rest is file cache it'll hand back. It's also got about 1 GB sitting in swap.

CPU: idle, mostly

Two snapshots 20 seconds apart and almost everything was under 1% CPU. The busiest were Uptime Kuma (4% then 1%) and immich-server (under 1%, then nearly 3%). Earlier in the day the load average sat around 0.9 on 2 cores, so about half busy, and it sat at 41-44 °C.

So for always-on stuff that mostly waits for requests, 2 old cores are fine.

Where 2 cores hurt

Here's the bit I didn't expect. While I was taking these measurements, the 1-minute load jumped from about 0.9 to 3.4 and the kernel's CPU pressure figure said something was stuck waiting for CPU about 75% of the last 10 seconds:

Load average and CPU pressure while measuring

docker stats itself isn't free, and I can't promise nothing else kicked off at the same time. But it shows the shape: with only 2 cores, any burst queues up behind everything else. Idle services are cheap. Bursty work, like ML indexing, video transcoding or someone uploading 300 photos, is where this CPU runs out. And my Immich machine learning runs on the CPU (the P600 is too old for Immich's GPU build), so that work lands on these same 2 cores.

Disk, not CPU, is the other limit

The fast storage is a 17 GB eMMC partition, now 72% full, mostly a 5.2 GB swap file and 3 GB of OS update files. Docker's images (12.5 GB, 5.4 GB of it old ones I could prune) live on the big array, which is only 36% used. So the thing I watch isn't CPU or RAM, it's that little eMMC.

What it means if you're picking hardware

From my numbers, not a benchmark:

  • RAM was the right thing to have plenty of. 16 GB means Immich can be greedy and nothing else notices.
  • The CPU is fine for services that idle. It's not fine for bursts, so keep heavy jobs off it or schedule them.
  • Real SATA mattered more to me than CPU speed. Photos live on proper drives, not USB.
  • On paper I'd expect a Raspberry Pi 5 to beat this CPU. I haven't benchmarked that yet. That's the next post, with prices and power once I've got real numbers.

Pi or mini PC for your homelab? And what's the biggest RAM hog on yours?


🤖 Drafted with AI assistance from my own homelab notes, logs and repos, then reviewed and edited before publishing.