当前位置: 首页 > 知识库问答 >
问题:

Rust Tokio-监视停顿的任务

锺离德庸
2023-03-14

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

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

我的问题是我们的监控系统花了很多时间来识别出哪里出了问题。例如:回答kubernetes健康检查的任务运行良好,但我无法识别系统中的任务是否已停滞。

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

例如:如果我能找到定义任务超时的方法,并且如果它在X秒/毫秒后没有返回到调度器--该任务将标记为stalled,这对我来说将是一个很好的解决方案。

共有1个答案

岳曦
2023-03-14

使用跟踪可能是这里的一个选项:遵循问题2655,每个tokio任务都应该有一个span。除了跟踪-未来,这意味着您应该在每次输入或挂起任务时获得跟踪事件(请参见此示例),通过添加相关数据(例如,task id/request id/...),您应该能够将这些信息提供给分析工具,以便了解:

  • 任务被阻止(已恢复,然后再也没有挂起)
  • 如果添加自己的跨,则“userland”跨从未退出/关闭,这可能意味着它被困在非阻塞循环中(这也是一个问题,尽管不那么严重)

我想这就是它的范围:正如问题2510所指出的,tokio还没有使用它生成的跟踪信息,因此没有提供“内置”的内省设施。

 类似资料:
  • 即便用追踪式收集辅助引用计数,在很多时候停顿时间依然不可接受,原因有几点: 虽然引用计数可以保证不产生循环的对象能实时回收,但存在很多这类对象是挂在循环引用数据结构上的,比如两个对象互相引用,而他们各自又挂了很多int和string数据,即是一个例子。由于这些对象的回收也是在停顿期,实时性不是那么好 循环引用本身并不罕见,双链表、树等数据结构都存在这种情况,实际工作中很多复杂的业务也存在这种情况,

  • 我有一个pySpark工作(spark 2.4.1),它在10%的情况下似乎工作正常,其他时候似乎永远停留在一个任务上,我不能真正理解发生了什么。以下是我在pyspark代码中所做的: 我似乎永远停留在对“Topandas”调用的评价中。当我检查executors选项卡时,只有一个executors可以运行,调用堆栈如下: null 编辑:我也有2个执行器失败,错误如下: java.io.ioEx

  • 这与之前未解决的一个帖子有关:这里C3P0似乎在Heroku上初始化连接池后立即进入死锁。这个问题不会发生在我的本地邮件上。 [DEBUG]“com.mchange.v2.resourcepool.basicresourcepool”2015-07-05 07:12:59,132:成功终止获取系列。递减的pending_acquires 1,Attests_Retailing:30 [DEBUG]

  • 我们在Spring web应用程序中使用预定任务来发送提醒、每日摘要等: 每个调度任务调用一个给定的服务方法(上面伪代码中的fooService.bar())。我想监控每次处决持续多长时间。随着负载、数据或复杂性的增加,其中一些方法可能需要更长的时间。我可以给每个服务方法添加日志记录语句(现在大约有10个,但将来可能会更多),或者使用方面给每个方法添加一些秒表行为。但是,对于spring中的所有预

  • 问题内容: 我发现了一个用于2009年的Eclipse 的旧插件来监视Hudson服务器,但是它有两个主要缺点: 不支持多个Hudson / Jenkins服务器 单击视图中的作业会导致显示404异常的窗口 有谁知道针对Jenkins的更新(维护)的Eclipse插件? 问题答案: Hudson有一个Mylyn连接器,它也适用于Jenkins(更新站点为http://download.eclips

  • 问题内容: 我有一个Java应用程序,它通过hibernate使用MySQL数据库。数据库实际上是用作持久层:在程序的初始加载时读取数据库,然后将记录保存在内存中。 但是,我们增加了额外的复杂性,其中另一个进程也可能会更改数据库,并且更改可以反映在Java应用程序上将非常好。但是,我并不特别喜欢每隔几秒钟就查询数据库的拉动机制,尤其是很少更新数据库。 有没有一种方法可以使回调监听数据库的变化?触发