【Real World Case】12.2.0.1版本OracleClient bug导致线程阻塞

最近有生产环境突发系统整体卡死的问题,问题出现后只能通过重启iis解决,检查问题时段应用和数据库服务器系统资源占用正常、数据库会话正常未出现阻塞及明显等待。抓取w3wp.exe进程dump,发现存在大量线程阻塞,阻塞源线程非产品引入、被锁的对象位于ODP层面。

根据Debugdiag分析,有132个线程被阻塞,阻塞源为140号线程。

 

 检查#140线程,堆栈信息如下:

OS Thread Id: 0x3c8c (140)
        Child SP               IP Call Site
000000deeaefdea0 00007ffa6bb867c4 [InlinedCallFrame: 000000deeaefdea0] Oracle.DataAccess.Client.OpsCon.Dispose(IntPtr ByRef, IntPtr ByRef, Oracle.DataAccess.Client.OpoConValCtx* ByRef, Oracle.DataAccess.Client.OpoConRefCtx)
000000deeaefdea0 00007ffa07b21a3c [InlinedCallFrame: 000000deeaefdea0] Oracle.DataAccess.Client.OpsCon.Dispose(IntPtr ByRef, IntPtr ByRef, Oracle.DataAccess.Client.OpoConValCtx* ByRef, Oracle.DataAccess.Client.OpoConRefCtx)
000000deeaefde70 00007ffa07b21a3c DomainBoundILStubClass.IL_STUB_PInvoke(IntPtr ByRef, IntPtr ByRef, Oracle.DataAccess.Client.OpoConValCtx* ByRef, Oracle.DataAccess.Client.OpoConRefCtx)
000000deeaefdf80 00007ffa0747dc41 Oracle.DataAccess.Client.ConnectionPool.RegulateNumOfCons(System.Object)
000000deeaefe0c0 00007ffa0747d5e3 Oracle.DataAccess.Client.ConnectionPool.RegulateNumOfCons(System.Object)
000000deeaefe200 00007ffa0747cd9b Oracle.DataAccess.Client.CPCtx.RegulateNumOfConsThreadFunc(System.Object)
000000deeaefe270 00007ffa51735ab3 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
000000deeaefe340 00007ffa51735944 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
000000deeaefe370 00007ffa5176b0ba System.Threading.TimerQueueTimer.CallCallback()
000000deeaefe3d0 00007ffa5176aeb7 System.Threading.TimerQueueTimer.Fire()
000000deeaefe440 00007ffa51725b05 System.Threading.TimerQueue.FireNextTimers()
000000deeaefe8b8 00007ffa5c2768d3 [DebuggerU2MCatchHandlerFrame: 000000deeaefe8b8] 
000000deeaefea48 00007ffa5c2768d3 [ContextTransitionFrame: 000000deeaefea48] 
000000deeaefec78 00007ffa5c2768d3 [DebuggerU2MCatchHandlerFrame: 000000deeaefec78] 

 

根据阻塞源线程,搜索发现Stack Overflow有个类似的case,解决方案为:disable DCD by removing SQLNET.EXPIRE_TIME in SQLNET.ORA on the server, or upgrade to a post 12.2 database version that have no more DCD packets but uses the TCP stack instead.按照方案升级将OracleClient升级为19c后问题解决。

 

posted on 2022-01-06 09:35  王.小辉  阅读(98)  评论(0编辑  收藏  举报

导航