Requests time out but CPU is normal (thread pool starvation)
Latency climbs, requests queue, and CPU looks deceptively normal. This usually points to blocked worker threads, sync-over-async hotspots, or retry/time budget behavior pinning resources.
Common symptom variants
Primary playbook
When requests time out but CPU is low and restarting fixes it temporarily: how thread pool starvation happens, how to prove queueing, and the smallest fixes that stop repeat incidents.
Recommended resource
A small incident package: a triage checklist plus a dependency-call logging schema for proving queueing and stopping repeat timeouts in legacy ASP.NET services.
Related posts
Requests hang forever: why missing timeouts cause recurring outages in .NET
When requests hang forever and recycling releases stuck work: why missing timeouts create backlog, how to add budgets safely, and the rollout plan that prevents new incidents.
Background jobs stuck but look healthy: why workers hang forever with no alerts in .NET
When background jobs hang but workers look healthy and queue pileup grows: why jobs fail silently without timeouts or heartbeats, and the runbook that stops repeat incidents.