The loop as an object
How do gain and delay decide whether a disturbance dies out or grows, whatever the headroom?
Before the individual pathologies, here is the machinery that makes them all one thing. A feedback loop has three parameters:
- Gain: how much extra load one unit of load creates.
- Delay: how long until the effect returns to the input.
- Sign: whether the correction opposes the change (negative) or reinforces it (positive).
Everything in this article is the same equation with different names attached to the terms.
Gain decides whether a disturbance dies or grows
Suppose each unit of work in a degraded state creates, on average, R units of further work. Think of a rumor: each person who hears it tells R other people. This is called a branching process.
- If R < 1, each generation is smaller than the last and the disturbance dies out. The total extra work is 1 + R + R² + … = 1/(1 − R) units. For R = 0.5, that is 2 units in total.
- units of further work each unit of degraded work creates
Data table
| Gain R | Total work ÷ the disturbance |
|---|---|
| 0 | 1× |
| 0.012 | 1.01× |
| 0.025 | 1.03× |
| 0.037 | 1.04× |
| 0.049 | 1.05× |
| 0.061 | 1.07× |
| 0.074 | 1.08× |
| 0.086 | 1.09× |
| 0.098 | 1.11× |
| 0.11 | 1.12× |
| 0.123 | 1.14× |
| 0.135 | 1.16× |
| 0.147 | 1.17× |
| 0.159 | 1.19× |
| 0.171 | 1.21× |
| 0.184 | 1.23× |
| 0.196 | 1.24× |
| 0.208 | 1.26× |
| 0.221 | 1.28× |
| 0.233 | 1.3× |
| 0.245 | 1.32× |
| 0.257 | 1.35× |
| 0.269 | 1.37× |
| 0.282 | 1.39× |
| 0.294 | 1.42× |
| 0.306 | 1.44× |
| 0.319 | 1.47× |
| 0.331 | 1.49× |
| 0.343 | 1.52× |
| 0.355 | 1.55× |
| 0.367 | 1.58× |
| 0.38 | 1.61× |
| 0.392 | 1.64× |
| 0.404 | 1.68× |
| 0.416 | 1.71× |
| 0.429 | 1.75× |
| 0.441 | 1.79× |
| 0.453 | 1.83× |
| 0.466 | 1.87× |
| 0.478 | 1.91× |
| 0.49 | 1.96× |
| 0.502 | 2.01× |
| 0.514 | 2.06× |
| 0.527 | 2.11× |
| 0.539 | 2.17× |
| 0.551 | 2.23× |
| 0.564 | 2.29× |
| 0.576 | 2.36× |
| 0.588 | 2.43× |
| 0.6 | 2.5× |
| 0.613 | 2.58× |
| 0.625 | 2.66× |
| 0.637 | 2.75× |
| 0.649 | 2.85× |
| 0.661 | 2.95× |
| 0.674 | 3.07× |
| 0.686 | 3.18× |
| 0.698 | 3.31× |
| 0.71 | 3.45× |
| 0.723 | 3.61× |
| 0.735 | 3.77× |
| 0.747 | 3.96× |
| 0.759 | 4.16× |
| 0.772 | 4.38× |
| 0.784 | 4.63× |
| 0.796 | 4.91× |
| 0.808 | 5.22× |
| 0.821 | 5.58× |
| 0.833 | 5.99× |
| 0.845 | 6.46× |
| 0.857 | 7.02× |
| 0.87 | 7.68× |
| 0.882 | 8.47× |
| 0.894 | 9.46× |
| 0.906 | 10.7× |
| 0.919 | 12.3× |
| 0.931 | 14.5× |
| 0.943 | 17.6× |
| 0.956 | 22.5× |
| 0.968 | 31× |
| 0.98 | 50× |
- If R > 1, each generation is larger. The disturbance grows without bound, regardless of how much headroom you had.
Why does headroom not matter? Because divergence is a property of a ratio (R), and headroom is a property of a level (spare capacity). A ratio above 1 multiplies any level. With R = 1.2 and 100 units of headroom, you merely reach the limit a few rounds later.
This is the most important arithmetic here. It is the same mathematics as the spread of an epidemic and as neutron multiplication in a reactor. You do not tune your way out of R > 1. You change the structure that produces R.
Delay decides whether a loop with R < 1 is still useless
A negative-feedback controller (one that tries to reduce an error) acts on what it measured. If it measures a state and corrects it after a dead time d, the state has moved on by the time the correction lands, and the correction pushes in the wrong direction. The result is an oscillation with a period of about 2d. Think of a shower with a long pipe: you turn the tap to "colder" because the water is hot, wait, nothing happens, turn it more, then the cold water arrives all at once. Autoscaling, least-loaded routing and health-check-driven eviction are all negative-feedback controllers whose sense-to-act delay is longer than the phenomenon they correct. We meet each of them below.
Sign flips at the regime boundary
The third parameter is the one that surprises. The regime-flip principle: an optimization is conditional on a regime. At the regime boundary its sign flips, not its magnitude.
- Retry reduces latency when failures are independent, and multiplies load when they are correlated.
- A cache reduces backend load when warm, and multiplies it by 1/(1 − h) when cold.
- A buffer absorbs bursts when λ < μ and manufactures unbounded latency when λ > μ.
- Least-loaded routing balances load with fresh data and oscillates with stale data.
In every case the mechanism does not degrade gracefully past its boundary. It reverses. The predictive form: for any optimization, ask what it assumes about the distribution, then assume that condition inverts, and check whether the mechanism merely stops helping or actively harms. If it actively harms, it needs a regime detector and an off switch, not tuning.