Add the simultaneous memory budget
Start with processes that overlap, not their quiet averages. An illustrative 4 GB worksheet could reserve 700 MiB for host tooling, 900 MiB for API processes, 1,200 MiB for a database, 500 MiB for one worker and 700 MiB for uncertainty: 4,000 MiB total. This nearly consumes the nominal profile and leaves little confidence for a larger release overlap.
Estimate CPU demand from measured work
Measure CPU time for one representative request or job, then multiply by the peak completion rate. For example, 25 ms of CPU time × 20 requests per second = 500 ms of CPU each second, or 0.5 core on average. Repeat with a realistic worker active and inspect peaks; averages hide bursts, scheduling and database waits.
Separate the constraint signals
| Observed signal | Likely next check |
|---|---|
| High CPU with runnable work | Profile the hot path, then compare more CPU. |
| Memory pressure or process termination | Reduce overlap or add measured RAM. |
| Low CPU with slow requests | Inspect database, pool and external waits. |
| Queue age rises as workers increase | Lower concurrency and inspect the shared dependency. |
Make the resource decision
Choose more CPU only when profiling shows sustained compute contention. Choose more RAM when the simultaneous working set lacks reserve. Lower concurrency when parallel work harms API latency or useful completion rate. Record the triggering measurement, then repeat the same workload after changing one variable.