There is exactly one bottleneck at any moment — find it.
Identifying Bottlenecks: there is exactly one bottleneck at any moment
make the invisible limits visible
Bigger pool risks DB saturation.
Performance work is a hunt. A system has many resources, but at any throughput one of them is the binding constraint. The USE method — measure utilization, saturation, errors per resource — is the fastest way to find it.
CPU saturated → run flame graphs; algorithm or hot loop.
Memory pressured → GC pauses, swap, OOM kills.
Disk I/O saturated → iostat shows 100% util; investigate WAL, indexes, page cache.
Network → check TCP retransmits, NIC saturation, cross-AZ surprises.
Locks/contention → tail latency without resource saturation often points here.
API p99 spikes at noon, p50 unchanged.