Rust Tokio - 监控停滞的任务

Rust Tokio - monitoring stalled tasks

我是 运行 一个生锈的 Tokio 应用程序。在上一个版本中我有一个错误,一些请求导致我的代码进入无限循环。

发生的事情是,当进入无限循环的任务卡住时,所有其他任务继续正常工作并处理请求,直到停滞任务的数量高到足以导致我的程序无响应。

我的问题是我们的监控系统花了很多时间来确定出现问题。例如:回答 kubernetes 健康检查的任务运行良好,我无法确定我的系统中有停滞的任务。

所以我的问题是在这种情况下我是否有办法识别和提醒?

例如:如果我能找到定义任务超时的方法,并且如果在 X seconds/millis 之后它不是 return 到调度程序 - 这个任务将标记为停滞,那会很好我的解决方案。

在这里使用 tracing 可能是一个选项:在 issue 2655 every tokio task should have a span. Alongside tracing-futures this means you should get a tracing event every time a task is entered or suspended (see this example 之后),通过添加相关数据(例如任务 ID / 请求 ID / ...),您应该能够提供这个信息到分析工具才能知道:

  • 任务被阻止(被恢复然后再也没有挂起)
  • 如果您添加自己的跨度,则“用户区”跨度从未退出/关闭,这可能意味着它卡在了非阻塞循环中(这也是一个问题,尽管问题不大)

我认为这就是它的范围:正如 issue 2510 所指出的,tokio 尚未使用它生成的跟踪信息,因此不提供“内置”内省功能。