这个坑值得记一笔。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 秒以内,所有超时请求都有明确提示,空白回复归零。

工具超时必须短于客户端超时,否则断了客户端也断不了任务,只会留下空回复。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189