Runtime Footprint and Data Access ยท 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.