记一次 .NET 某药材管理系统 卡死分析

💡 原文中文,约7100字,阅读约需17分钟。
📝

内容提要

本文介绍了一次程序卡死的故障排查过程,通过使用Windbg工具分析程序,发现是SQL查询导致的问题。通过观察所有线程栈,发现有两个线程在请求SQLSERVER,并在等待返回结果。进一步提取其中一个线程的SqlCommand对象,发现SQL语句没有加nolock导致在SQLSERVER层面一直获取不到S锁。通过观察SQL的请求时间,发现这条SQL已经等待了1分43秒,需要在SQLSERVER端查看锁相关的DMV视图,加上nolock尝试解决问题。最终朋友在SQLSERVER层面修改了max degree of parallelism来提高并发度,问题得到缓解。

🎯

关键要点

  • 朋友在查询报表时程序卡死,内存和CPU正常。
  • 使用Windbg工具分析程序,发现问题在SQL查询上。
  • 观察线程栈,发现两个线程在请求SQLSERVER并等待结果。
  • 提取SqlCommand对象,发现SQL语句未加nolock,导致无法获取S锁。
  • SQL请求时间显示该SQL已等待1分43秒。
  • 建议在SQLSERVER端查看锁相关的DMV视图,并尝试加上nolock。
  • 最终通过修改max degree of parallelism提高并发度,问题得到缓解。
  • 总结认为不稳定事故可能由SQLSERVER层面导致,需要证据支持。
➡️

继续阅读