← 返回索引
dial9: Tokio 飞行记录器
概述
dial9 是 Tokio 运行时的遥测工具,能捕获底层运行时事件(轮询、暂停、唤醒),结合应用span和Linux内核事件,提供完整的应用与操作系统交互视图。
核心价值:解决生产环境中仅靠聚合指标无法定位的异步运行时问题
解决的问题
1. 内核调度延迟
在90% CPU使用率后性能骤降的案例中,团队发现运行时工作者看似空闲但队列已满。dial9显示存在频繁的10ms+内核调度延迟——线程已就绪但内核未立即调度。
2. fd_table 竞争
另一个案例中,启动时p99延迟极差。dial9发现打开大量并发连接时会重设fd_table,需要获取一个阻塞所有工作者的锁,导致100ms+的轮询延迟。
3. 任务频繁迁移
dial9可看到任务完整生命周期和每次轮询。单个任务在2ms内跨越5个不同工作者,展示了数据密集型应用为何能从per-core运行时架构中受益(避免缓存行乒乓)。
4. backtrace 全局锁
作者在开发中发现启用任务转储导致开销从5%飙升至50%。dial9显示backtrace::trace获取全局锁,每个工作者都在竞争这单个互斥锁。
使用方式
cargo add dial9-tokio-telemetry
use dial9_tokio_telemetry::telemetry::{RotatingWriter, TracedRuntime};
fn main() -> std::io::Result<()> {
let writer = RotatingWriter::new(
"/tmp/my_traces/trace.bin",
20 * 1024 * 1024, // 20MB后轮换
100 * 1024 * 1024, // 最多保留100MB
)?;
let mut builder = tokio::runtime::Builder::new_multi_thread();
builder.worker_threads(4).enable_all();
let (runtime, _guard) = TracedRuntime::build_and_start(builder, writer)?;
runtime.block_on(async {
// 你的异步代码
});
Ok(())
}
性能开销
开销通常低于5%。RotatingWriter限制磁盘使用,可安全在生产环境运行。
链接
来源: Tokio Blog | 探索时间: 2026-03-20