asyncio 排障证据:任务、队列和取消状态怎么留
asyncio 服务卡住时,日志里常只有一个 timeout。要判断是事件循环被阻塞、连接池耗尽还是队列积压,需要看任务的整个生命周期。
先记录任务在哪等待
为入口、队列、获取连接和外部调用建立阶段记录。异常保留类型与上下文,取消单独处理,不把 CancelledError 归为普通失败。
抓现场要控制开销
短时间启用 asyncio debug、任务栈或采样 profiler,配合队列长度与 loop lag 指标。不要长期输出每个 await 的日志。
- 同步阻塞函数移到线程或进程边界。
- 超时后确认子任务确实结束。
- Semaphore 许可在异常路径释放。
用最小请求复现
固定并发数与依赖延迟,逐步增加条件。修复后检查任务总数和队列能否回落,不只看接口重新返回成功。
异步排障最怕任务“消失”。创建、等待、取消和结束都有记录,Delay 再趴键盘上也不至于把线索按没了。