【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后问题解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2021-01-06 【Real World Case】记一次显示GC导致的“服务器太忙”报错
2021-01-06 整体性/并发场景性能问题排查思路
2021-01-06 Windows日志获取方法
2021-01-06 Process Monitor日志获取方法