Index · TL;DR

1 min read
Foundational1 min read
Rapid overview

TL;DR

For "many small mostly-idle services" on a single host, the per-process memory floor is the binding constraint — not throughput. Default .NET 9 sits at 120–200 MB idle per service, Native AOT brings the same C# down to 30–60 MB, and Go sits at 10–25 MB. The catch isn't the runtime — it's how migrations, ORMs, and Redis access change as you move down that ladder.

Decision (2026-05-23): AOT rejected as a retrofit-hack risk. Strategy is default .NET 9 for the existing fleet, pure Go for new services where footprint matters. See Why not AOT? below.