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

继续阅读