← 返回索引

dial9: Tokio 飞行记录器

Rust 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