记一次 .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层面导致,需要证据支持。
➡️