记一次 .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方法。
➡️