这个坑值得记一笔。Agent 调本地 pandas 查询,数据量大时单次执行超过 60 秒,客户端读超时设在 30 秒,连接被断开但服务端还在跑,用户看到的是空白回复。
刚开始盯着「超时后没有中断下游 任务继续占连接」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。工具函数没有超时上限 同步阻塞;数据源没加索引 每次全表扫描;客户端超时短于服务端最长执行时间。
给工具加执行超时 15 秒
python -c "from concurrent.futures import ThreadPoolExecutor;ex=ThreadPoolExecutor(4);print(ex.submit(lambda: 1).result(timeout=15))"
随后在查询上加时间范围与索引
python -c "print('CREATE INDEX idx_orders_created ON orders(created_at);')"
超时返回结构化失败让 Agent 换路径
python -c "print({'ok': False, 'reason': 'timeout'})"
压五十并发看 P95 与超时占比
python bench_tool.py --concurrency 50 --repeat 20
同事提醒我看一下最近一次发布,时间点确实对得上。
怎么算真的好了,看的是同一批现象。P95 降到 8 秒以内,所有超时请求都有明确提示,空白回复归零。
工具超时必须短于客户端超时,否则断了客户端也断不了任务,只会留下空回复。这类问题最好一次改到位,反复小改反而容易把原因搅混。
