Rust in Everything
基于 tokio-metrics 0.5.2

常见坑

每一页对着一条报错或一个现象:先用最小的程序复现(编译错误引用 rustc 1.99.0 的原文),再到源码里找它从哪一行来,最后给出修法。机制在前面各页讲过的,这里只链过去。

  1. no field mean_poll_duration on type RuntimeMetrics:E0609。不稳定字段在不带 --cfg tokio_unstable 时不存在,docs.rs 上却看得到;编译器还会建议一个意思完全不同的字段。RUSTFLAGS 环境变量哪怕是空串,也会让 .cargo/config.toml 里的 cfg 失效。
  2. the method collect exists for struct Instrumented<..., &TaskMonitorCore>, but its trait bounds were not satisfied:E0599。static 里的 TaskMonitorCore 包出来的流不是 Stream;换成 LazyLock<TaskMonitor>。
  3. cannot move out of a mutable reference:E0507。TaskMonitor::builder() 的设置方法收 &mut self,build 收 self,一行链下来编译不过;TaskMonitorCore 的 builder 却可以。
  4. 数字看起来不对:busy_ratio() 是 4.00;首次 poll 延迟多出 200ms;slow_poll_ratio 是 NaN、poll_time_histogram 是空的;两个看板的 max_idle_duration 一个有值一个是 0。一个程序把四个现象和修法都跑一遍。
flowchart TB
  compile["编译期"] --> p1["1 E0609:不稳定字段"]
  compile --> p2["2 E0599:静态 monitor 的流"]
  compile --> p3["3 E0507:builder 链式调用"]
  runtime["运行期:数字不对"] --> p4a["busy_ratio 大于 1"]
  runtime --> p4b["首次 poll 延迟偏大"]
  runtime --> p4c["NaN 与空直方图"]
  runtime --> p4d["最大空闲对不上"]
  p1 --> p4c

前三个都是类型层面的:字段用 cfg 删掉、Stream 只给默认类型实现、两套 builder 一个按引用一个按值,这三处取舍在 设计取舍 里讲过代价,这里是代价落到用户身上的样子。图里第 1 个连到「空直方图」:直方图字段同样要 tokio_unstable,打开 cfg 只是第一步,还要在 Builder 上打开。

本部分的实验都在 M2 Max 笔记本(12 核)、macOS、rustc 1.99.0、--release 下运行,依赖 tokio-metrics = "=0.5.2"、tokio = { version = "=1.54.1", features = ["full"] }、futures = "0.3"。编译器输出里依赖源码的绝对路径换成了 <registry>。

💬 关联讨论

发起讨论
加载中...