Suppose a backend service runs normally for days, then suddenly stops accepting new connections. Existing requests still work for a while, but database connections fail, log rotation breaks, and even opening a configuration file returns:
These failures seem unrelated, but they share one dependency: each operation needs a new file descriptor.
File-descriptor exhaustion happens when the process or system reaches its descriptor limit.
The immediate question is which limit was reached. The deeper question is why descriptors accumulated: high but expected concurrency, a limit that is too low, or a resource leak where descriptors were never closed.
This chapter distinguishes process and system-wide exhaustion, verifies live limits and descriptor ownership, measures and classifies growth, traces acquisition and release, and develops a response that preserves evidence while separating capacity from lifecycle bugs.