线上接口偶发卡住十几分钟,排查发现 openai 1.40 默认超时 600 秒且自动重试两次,一次慢请求被放大到半小时,网关早在 60 秒就断开了连接。

一开始怀疑是「重试在客户端和网关两层各做一次」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。默认超时 600 秒远大于网关超时。少数情况下是默认最大重试两次 且包含超时重试。

少数情况下是流式请求的超时语义与普通请求不同。

上来先打印客户端当前的超时与重试

python -c "import openai;c=openai.OpenAI();print(c.timeout,c.max_retries)"

显式设置超时和重试次数

python -c "import openai,httpx;c=openai.OpenAI(timeout=httpx.Timeout(30,connect=5),max_retries=1);print(c.timeout,c.max_retries)"

接着确认网关超时大于客户端超时

nginx -T 2>&1 | Select-String proxy_read_timeout

压测确认没有长尾悬挂

python load.py --concurrency 20 --seconds 120 --p99

改完先别撤,确认这几项。P99 回到 30 秒以内,日志里没有超过一分钟的请求,重试次数与配置一致。

默认值是按离线脚本设的,线上必须显式覆盖,超时和重试要在同一层算总账。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189