常见坑
每一页对着一条报错或一个现象:先用最小的程序复现(编译错误引用 rustc 1.99.0 的原文),再到源码里找它从哪一行来,最后给出修法。机制在前面各页讲过的,这里只链过去。
- no field
mean_poll_durationon typeRuntimeMetrics:E0609。不稳定字段在不带--cfg tokio_unstable时不存在,docs.rs 上却看得到;编译器还会建议一个意思完全不同的字段。RUSTFLAGS环境变量哪怕是空串,也会让.cargo/config.toml里的 cfg 失效。 - the method
collectexists for structInstrumented<..., &TaskMonitorCore>, but its trait bounds were not satisfied:E0599。static里的TaskMonitorCore包出来的流不是Stream;换成LazyLock<TaskMonitor>。 - cannot move out of a mutable reference:
E0507。TaskMonitor::builder()的设置方法收&mut self,build收self,一行链下来编译不过;TaskMonitorCore的 builder 却可以。 - 数字看起来不对:
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>。
💬 关联讨论
发起讨论加载中...