My Life My Dream!

守信 求实 好学 力行
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

此前遇到一个项目反馈系统宕机问题,摘要描述如下:

  1. 系统不定期出现卡死现象,在多个模块不同功能上都出现过,未发现与特定功能相关的明显规律;
  2. 当系统出现卡死现象时,新的用户无法登陆系统;
  3. 跟踪应用服务器,未发现资源不足的情况(CPU、内存使用正常)
  4. 数据库服务器资源占用也正常(CPU不高,也未发现死锁、SQL阻塞等情况)

在问题再次发生时,使用ProcDump联系抓取多个dump文件:procdump -ma -s 20 -n 3 w3wp.exe

使用windbg命令(!tp)查看线程池发现,100多个线程都处于Running状态。

进一步使用命令(~* e!clrstack)查看所有线程的堆栈信息时,发现大量的线程在等待获取数据库连接。

至此可以推断,程序中可能存在连接泄露的代码。

 

查看数据库连接字符串没有配置连接池大小,缺省使用100个连接。

当然,使用应用服务器上的windows性能监视器,增加NumberOfPooledConnections,可以看到问题发生时前连接数陡增的情况,也可以验证此问题。

 

windbg主要操作如下:

image

image

image

image

image

image

image

image

 

Windows性能计数器的示例, NumberOfPooledConnections

image