Tokio 排障:任务、Waker 与调用链证据怎么留
异步服务卡住时,线程数看起来正常,任务却可能都在等同一个资源。需要记录任务在哪里进入等待,又因什么被唤醒。
先从运行时外部缩小范围
记录请求队列、并发许可和下游耗时,确认问题是没有被 poll、长时间 pending,还是 poll 本身阻塞。不要一上来就在每次 poll 里打印日志。
证据要能关联到任务
为关键任务设置 span,记录创建、等待资源、取消和完成。配合 tokio-console 或 tracing 查看繁忙任务与资源占用,再回到代码核对 Waker 注册。
- 检查阻塞调用是否进入 spawn_blocking。
- 区分锁等待和通道背压。
- 保存运行时配置与采样时段。
修复后复跑同一条件
用原来的并发方式和失败依赖验证任务能被取消、许可会释放、队列会收敛。只看服务恢复响应,可能遗漏后台泄漏。
异步排障的关键不是日志密度,而是任务生命周期。创建和结束能对上,等待点才有解释。