症状
Gunicorn 日志出现 [CRITICAL] WORKER TIMEOUT 并在客户端等待时杀掉工作进程,常返回 502 或 504。负载下 worker 可能反复重启,整体延迟因排队而在阻塞的 worker 之后上升。本地数据量与网络延迟较低时代码可能看起来正常。
诊断
在日志中定位超时的请求路径;临时调低 –timeout 以确定性复现;再切换 worker 类型或线程数,判断是阻塞等待还是真正的长计算。
grep -n "WORKER TIMEOUT" gunicorn.log | tail
根因
某个 worker 在超时内未回报,原因是处理器被阻塞,通常卡在同步 I/O 或无响应的依赖上,于是 Gunicorn 杀掉并替换了它。
修复
让处理器在超时预算内完成:为数据库与 HTTP 调用设置超时,把重活移到队列,避免在异步处理器中阻塞。再按工作负载选择 worker 类型与数量,而不是仅抬高 timeout 而只是推迟失败。
验证
重跑负载,确认不再出现 WORKER TIMEOUT、响应时间低于上限、worker 不再反复重启;对处理器耗时做度量有助于确认修复而非掩盖问题。
常见陷阱
盲目提高 timeout 会让慢请求拖垮吞吐并掩盖真正阻塞的调用;应优先缩短处理时间。