Index · TL;DR
1 min readRapid 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.