这个坑值得记一笔。推理服务用 httpx 设了 timeout=Timeout(60),长文档摘要经常在 60 秒整抛 ReadTimeout,服务端日志显示首 token 在 88 秒才产出,之后每秒都有输出。
刚开始盯着「重试把同一条长请求又发一遍 加重排队」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。总超时和读间隔没分开 两个值混用;首包慢是排队造成的 不是生成慢;网关的 idle timeout 比客户端更短。
上来先把连接、读、总超时分开设置
python -c "import httpx;print(httpx.Timeout(connect=5,read=120,write=10,pool=5))"
量一次首包与总耗时
curl -N -o /dev/null -w '%{time_starttransfer}' https://api.example.com/stream
然后对长请求单独放宽读超时
python client.py --read-timeout 180 --only-long
同步调大网关的空闲超时
nginx -T 2>&1 | Select-String proxy_read_timeout
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
怎么算真的好了,看的是同一批现象。长请求完成率回到 100%,ReadTimeout 只在真的没有任何输出时出现,重试次数明显下降。
读超时管的是两次数据之间的间隔,总超时才是整段上限,混用会一边误杀一边漏杀。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
