While I was writing Release It!, I was influenced by James R. Chile’s book Inviting Disaster. One of Chile’s sources is Normal Accidents, by Charles Perrow. I’ve just started reading, and even the first two pages offer great insight.
Normal Accidents describes systems that are inherently unstable, to the point that system failures are inevitable and should be expected. These "normal" accidents result from systems that exhibit the characteristics of high "interactive complexity" and "tight coupling".
Interactive complexity refers to internal linkages, hidden from the view of operators. These invisible relations between components or subsystems produce multiple effects from a single cause. They can also produce outcomes that do not seem to relate to their inputs.
In software systems, interactive complexity is endemic. Any time two programs share a server or database, they are linked. Any time a system contains a feedback loop, it inherently has higher interactive complexity. Feedback loops aren’t always obvious. For example, suppose a new software release consumes a fraction more CPU per transaction than before. That small increment might puch the server from a non-contending regime and a contending one. Once in contention, the added CPU usage creates more latency. That latency, and the increase in task-switching overhead, produces more latency. Positive feedback.
High interactive complexity leads operators to misunderstand the system and its warning signs. Thus misinformed, they act in ways that do not avert the crisis and may actually precipitate it.
When processes happen very fast, and there is no way to isolate one part of the system from another, the system is tightly coupled. Tight coupling allows small incidents to spread into large-scale failures.
Classic "web architecture" exhibits both high interactive complexity and tight coupling. Hence, we should expect "normal" accidents. Uptime will be dominated by the occurence of these accidents, rather than the individual probability of failure in each component.
The first section of Release It! deals exclusively with system stability. It shows how to reduce coupling and diminish interactive complexity.