记一次 .NET 某工厂无人车调度系统 线程爆高分析
💡
原文中文,约6700字,阅读约需16分钟。
📝
内容提要
本文讲述了线程数爆高问题,使用windbg工具查看线程堆栈,发现大量线程卡在RoutingService.Push方法上。问题出在SemaphoreSlim的WaitAsync方法没有放在try中,引发线程积压。建议去掉SemaphoreSlim,直接使用Interlocked.Increment(ref serial)。
🎯
关键要点
- 朋友程序中的线程数爆高,使用dump分析问题。
- 通过!t命令查看线程数量,发现有4683个线程。
- 大量线程卡在RoutingService.Push方法上,导致线程积压。
- Push方法中使用SemaphoreSlim的WaitAsync方法,未放在try中,导致死锁。
- 建议去掉SemaphoreSlim,直接使用Interlocked.Increment(ref serial)。
- GetSerial方法的异步调用未能完成,导致线程阻塞。
- SemaphoreSlim的m_currentCount为0,表明信号量被消费完。
- 代码逻辑中WaitAsync和Release未成对,导致资源未释放。
- 线程池中存在大量任务积压,实际工作请求数量为0,但仍有12w的积压。
- 总结:代码应简洁,避免复杂的同步机制以减少bug。
➡️