记一次 .NET某工控任务调度系统 卡死分析 - 一线码农

💡 原文中文,约6200字,阅读约需15分钟。
📝

内容提要

朋友在训练营中遇到定时任务延迟问题,分析后发现是M71EnterPortService服务在CheckProcess方法中卡住,最终确认是查询时序数据库TDengine导致的延迟,建议重点关注相关方法。

🎯

关键要点

  • 朋友在训练营中遇到定时任务延迟问题,问题由 M71EnterPortService 服务引起。
  • 初步分析发现任务可能在 CheckProcess 方法中卡住。
  • 通过观察线程栈,确认任务没有执行,推测可能是任务意外退出。
  • 深入分析 M71EnterPortService 类的调度方法,发现其为纯异步写法。
  • 使用 !dumpasync 命令观察状态机,确认卡在 CheckProcess 中。
  • 进一步分析状态机内部字段,推测卡在 SavePlcPara 方法中。
  • 最终确认延迟是由于查询时序数据库 TDengine 导致的。
  • 建议重点关注 TDengine.Driver.Impl.NativeMethods.NativeMethods.QueryWithReqid 方法。

延伸问答

M71EnterPortService服务的延迟问题是如何被发现的?

通过与学员沟通和截图确认,发现M71EnterPortService服务出现延迟,初步分析可能任务卡死在CheckProcess方法中。

CheckProcess方法卡住的原因是什么?

最终确认延迟是由于查询时序数据库TDengine导致的,任务在SavePlcPara方法中卡住。

如何确认任务没有执行?

通过观察线程栈,发现没有M71EnterPortService关键词,说明任务根本没有执行。

TDengine是什么?

TDengine是一款开源、高性能、云原生的时序数据库,专为物联网、车联网等场景优化设计。

在分析过程中使用了哪些调试命令?

使用了!dumpasync命令观察状态机,以及~*e !clrstack命令查看线程栈。

建议重点关注哪个方法以解决问题?

建议重点观察TDengine.Driver.Impl.NativeMethods.NativeMethods.QueryWithReqid方法。

➡️

继续阅读