Tokio Console 0.1 发布

2021 年 12 月 17 日

今天,Tokio 团队宣布 Tokio Console 的首次发布 (Github),使 Rust 开发者能够更深入地了解其应用程序的运行时行为。

就这样,我们可以一窥幕后。—niedzejkob

Tokio Console 是一个用于异步 Rust 程序的诊断和调试工具。它为您提供程序任务和资源的实时、易于导航的视图,总结它们的当前状态和历史行为。

到目前为止,理解异步运行时的状态需要开发者解释事件日志。诸如 tracing 之类的框架提供了用于检测程序和查询结果输出的工具,但知道要使用哪些查询以及如何解释输出并非易事。例如,如果您不熟悉 Tokio 的源代码,您不一定知道要查找哪些 tracing 事件,也不知道这些事件的含义。

tokio-console 通过提供以异步开发者已经熟悉的方式描述异步运行时的表示来解决这个问题:异步运行时轮询的任务集,以及每个任务在服务请求时获取或释放的资源。您无需编写任何新的检测逻辑:只需一行代码即可启用 Tokio Console,之后,您可以使用提供的终端工具来观察异步运行时。

tokio-console 将异常行为置于首位。您可以按诸如总繁忙时间或轮询次数之类的指标对任务进行排序。控制台通过突出显示大的差异来提供帮助,例如从毫秒到秒的转变。

tasks list screenshot

除了显示数据外,控制台还实现了一个“警告”系统。您可以将其视为类似于异步代码的 clippy。通过监视应用程序中任务的运行时操作,控制台可以检测到 *可能* 表明错误或性能问题的行为模式,并突出显示它们以供用户分析。这使我们能够检测诸如 长时间运行而没有让步的任务、唤醒自身次数多于被其他任务唤醒的任务等等。所有这些行为都无法在编译时检测到——clippy 或 rustc 无法为它们添加 lint——但通过观察运行时行为,我们可以非常容易地检测到它们。

warnings screenshot

添加 console-subscriber crate 暴露了 Tokio 运行时中已内置的检测,因此您无需编写任何新的检测逻辑。(当然,如果需要,您可以定制控制台输出——例如,通过显式命名您的任务。)初始化后,您可以使用 tokio-console 终端应用程序直接查看哪些任务正在运行以及异步运行时如何调度它们。

我们可以使用这些数据来查看关于每个单独任务的极其丰富的数据,例如 poll 持续时间的直方图

task details

Tokio Console 不仅仅列出任务。它还将检测资源,例如异步 互斥锁信号量。Tokio Console 的资源详细信息视图显示哪些任务已进入临界区,以及哪些任务正在等待获取访问权限。

resource details

Datadog 的开发人员,正在开发 Vector,已经成功地使用预发布版本的 Tokio Console 来帮助调试问题。Toby Lawrence

在调试一个与任务未按预期进度进行相关的特别神秘的问题时,tokio-console 能够立即发现缺少唤醒是原因,从而提供了最终导致发现 Tokio 中意外调度行为的见解。

开始使用

要开始使用控制台,请运行 cargo install tokio-console,然后按照说明将 添加 console-subscriber 到您的异步应用程序

#[tokio::main]
async fn main() {
   console_subscriber::init();
   /* ... */
}

一旦您的应用程序运行,您可以通过在终端中运行 tokio-console 连接到它。

% tokio-console

有关如何使用控制台终端应用程序的详细信息,请参阅 tokio-console 文档

由于这是早期版本,Tokio 运行时的检测尚未稳定。您可以通过使用不稳定的环境变量编译 Tokio 来启用它:RUSTFLAGS="--cfg tokio_unstable" cargo build。有关更多详细信息,请参阅 subscriber 文档

路线图

Tokio Console 的这个版本仅仅是一个开始。虽然我们认为它已经非常有助于调试异步 Rust 应用程序,但我们还有更多的计划(例如 #96#130#155#161)。首先,我们将在 Tokio 和其他生态系统库中添加更多检测。这将帮助您更深入地了解您的应用程序。我们还希望改进警告系统:添加更多警告,并添加可搜索的在线文档,描述各种警告以及如何解决它们 (#181#148)。此外,我们还可以利用控制台现在收集的数据做更多事情:我们很乐意添加新的可视化,例如任务及其父级的树状图 (#155) 或程序执行的时间线 (#129)。

然而,要做到这一切,我们需要您开始使用 Tokio Console 并提供反馈。特别是,我们希望收集尽可能多的关于人们使用控制台调试的问题的信息,以及我们可以提供的帮助工具。我们也希望您参与帮助我们构建 Rust 运行时诊断的未来,所以请务必在 Discord 上的 #console 频道打个招呼,并随时参与 issues 并向我们发送 pull request!

感谢

  • Sean McArthur
  • Zahari Dichev
  • @gnieto
  • Felix S Klock II
  • Gus Wynn
  • Oğuz Bilgener
  • @memoryruins
  • Luna Razzaghipour
  • @daladim
  • @hatoo
  • Adam Gleave
  • Jacob Rothstein
  • David Barsky
  • @Milo123459
  • Wu Aoxiang
  • Yusuf Bera Ertan
  • @battlmonstr
  • Artem Vorotnikov

此外,特别感谢 Matthias Prechtl (@matprec),他的 2019 年 Google Summer of Code 项目 实现了初始控制台原型,为当前的 Tokio Console 发布铺平了道路!

tokio-console 构建于 TracingTonic 库奠定的基础上。

我们感谢每一位为该项目做出贡献的人,以及所有在您的应用程序中尝试它并为我们提供宝贵反馈的早期用户!

如果您想帮助我们使 tokio-console 变得更好,请查看我们的 github 仓库,或者在 Tokio 的 Discord 上的 #console 频道与我们交谈!

— Eliza Weisman (@hawkw)