thrashing — thrashing — spend the whole quantum moving work, none of it doing work
thrashing [--overcommit] [--no-yield] [--evict=LRU] WORKLOAD throughput → 0 as working_set > RAM effort == 100% ∧ progress == 0
thrashing is the state a scheduler enters when the cost of preparing to do work exceeds the work itself. Demand for resident set exceeds capacity, so every unit of progress requires evicting a unit that is about to be needed again. The system remains fully utilized and produces nothing.
It is not a slowdown. A slowdown degrades gracefully; thrashing is a cliff. Cross the threshold by one task and useful output does not decline — it collapses, while the utilization meter stays pinned at the ceiling to the very end. Observers routinely misread the pinned meter as health.
Recovery is not automatic. Because the machine is busy, it cannot notice it is busy with nothing. Load must be removed from outside, by an operator or a killer, before the resident set fits and reads begin to land again.
"From Old English þerscan, to thresh — to beat grain loose from the husk, work whose flailing was the point. Peter Denning attached the modern sense in his 1968 working-set papers, formalizing program locality and the resident set a process needs to run without constant faulting. Overcommit that set on a paging system and throughput does not taper but falls off a cliff, a result reproduced on early time-shared System/360 hardware. Later kernels declined to endure it: Linux's out-of-memory killer terminates a chosen process rather than page forever."
Utilization reports 100 percent throughout and is technically correct, which is the worst kind of correct.
The subsystem cannot detect its own condition, being fully occupied not detecting it.
Adding capacity raises the threshold without removing the cliff. Reported since 1968. Status: geometry.
livelock(8), backpressure(8), quiescence(5). The living exhibit demonstrates the word in motion:
▸ operate thrashing