Rust in Everything
基于 tokio-metrics 0.5.2

运行时指标

这一部分讲运行时主线。和任务指标相反,这里没有算法:RuntimeMonitor 不在运行时里装任何东西,数字全是 tokio 在调度器里攒的,本库只是定期去读、做差、求和。所以这一部分的重点是每个数字到底是什么:它由 tokio 的哪一行代码累加,什么时候才被写出来,名字和含义对不对得上。

  1. 稳定与不稳定两层字段:define_runtime_metrics! 给 31 个字段逐个加 cfg(tokio_unstable),不开就不存在(实测 10 个和 41 个);每个字段对应 tokio 调度器的哪段代码;只开 cfg 时 tokio 每次 poll 多做什么;一个实验把各组计数各触发一遍。
  2. Worker 差分与 poll 时间直方图:intervals() 在调用时定下基准,metric! 宏做差;busy_ratio 的范围是 0 到 worker 数;tokio 只在 park 和维护时提交计数,一次长 poll 让 2 个 worker 的 busy_ratio 到了 4.9;mean_poll_duration 是 EWMA,current_thread 上恒为 0;直方图要在 Builder 上打开。
flowchart TB
  tk["tokio:每个 worker 的 MetricsBatch"] -->|"park、维护时 submit"| at["WorkerMetrics 原子变量"]
  rm["RuntimeMonitor:Handle::metrics()"] --> iv["intervals():记下每个 worker 的基准"]
  iv --> nx["next():读累计值、做差、求和取极值"]
  at --> nx
  nx --> st["10 个稳定字段"]
  nx --> un["31 个 tokio_unstable 字段"]

被量的那些机制,worker 主循环、本地队列、注入队列、窃取、协作预算、阻塞池,都在 tokio 卷讲过,这里的表格逐个链过去。

💬 关联讨论

发起讨论
加载中...