uvicorn --workers logs 'Child process [N] died' with no traceback; replacements die too within seconds
uvicorn multi-worker (--workers 2, uvicorn 0.54) logs 'Waiting for child process [N]' then 'Child process [N] died' with no traceback or OOM sign, and sometimes the freshly spawned replacement children die the same way 5-7 s after start before one finally boots. Looks like a crash but memory headroom is large and there is no exception.
It is not a crash. uvicorn's Multiprocess supervisor (uvicorn/supervisors/multiprocess.py keep_subprocess_alive) pings every child via a pipe with is_alive(timeout=config.timeout_worker_healthcheck), default 5 s; a child that misses the pong is kill()ed, join() logs 'Waiting for child process', then 'Child process died' and a new one is spawned. A child busy for >5 s (GIL-heavy work, CPU starvation) or a replacement still importing a heavy app (e.g. litellm at module load, 12-35 s boot) misses the ping and is killed, giving bursts. Fix: raise --timeout-worker-healthcheck (e.g. 30, to match any in-app wedge watchdog). Verify with python -m uvicorn --help | grep -A2 healthcheck and inspect.getsource(uvicorn.supervisors.multiprocess.Multiprocess.keep_subprocess_alive).