技术开发 频道

使用system state dump分析mutex等待

  其实这里已经指出“inst: 1, sid: 1487, ser: 5556”,表示阻塞的会话是sid,serial#为1487,5556。那么如果这里没有这个信息,那么我们从哪里去寻找blocker?注意前面一段信息:idn=de12d336(对cursor来说其实是sql的hash value的低4字节), value=5cf00000000, where|sleeps=572cf03e3,这里idn表示mutex的identifier,即mutex的标识,value的高8字节(64位系统是高8字节,而32位系统是高4位字节)是SID,0×5cf即10进制的1487。

  而在稍后面部分,可以看到:

KGX Atomic Operation Log 0x455507d20  
       Mutex 0x3ff3c3d28(
1487, 0) idn de12d336 oper GET_SHRD  
       Cursor Pin uid
1471 efd 0 whr 5 slp 13085  
       opr
=2 pso=0x454d03f00 flg=0  
       pcs
=0x3ff3c3ca8 nxt=0x41720aca0 flg=35 cld=0 hd=0x455d0dda8 par=0x3ff3c4650  
       ct
=0 hsh=0 unp=(nil) unn=0 hvl=ff3c4448 nhv=1 ses=0x45181f760  
       hep
=0x3ff3c3d28 flg=80 ld=1 ob=0x3ff3c3868 ptr=0x412040780 fex=0x41203faf0  

  这里有Mutex请求的更详细的信息,Mutex 0×3ff3c3d28(1487, 0) idn de12d336 oper GET_SHRD表明这个请求是以SHARE方式请求,但是Mutex被1487这个会话持有。idn与前面idn相匹配。Cursor Pin uid 1471 efd 0 whr 5 slp 13085 这里表明Mutex的类型是Cursor Pin,正是前面提到的Mutex的一种。uid 1471表明是当前请求的SID为1471。

  ‘cursor: pin S wait on X’等待类似于以往的library cache pin等待,表示需要将cursor pin在内存中。这个等待出现,表明有会话正在修改这个cursor,比如正在执行解析,生成执行计划等。

  接下来我们看SID=1487的会话正在等待什么,或者说是在执行什么操作,查找’(session) sid: 1487′:


    (session) sid:
1487 ser: 5556 trans: (nil), creator: 0x450d514f0  
              flags: (0x45) USR
/- flags_idl: (0x1) BSY/-/-/-/-/-  
              flags2: (0x40008)
-/-  
              DID: , short
-term DID:    
              txn branch: (nil)  
              
oct: 3, prv: 0, sql: 0x455d15680, psql: 0x45bd0c8c8, user: 92/XXXXX  
    ksuxds
FALSE at location: 0  
    service name: SYS$USERS  
    client details:  
      O
/S info: user: idol, term: unknown, ospid: 1234  
      machine:       program: JDBC Thin Client  
      application name: JDBC Thin Client, hash value
=2546894660  
    Current Wait Stack:  
    
0: waiting for 'cursor: mutex X'  
        idn=5336, value=1, where|sleeps=3385a5f33  
        wait_id
=500096450 seq_num=64401 snap_id=1  
        wait times: snap
=0.000000 sec, exc=0.000000 sec, total=0.000000 sec  
        wait times: max
=0.000000 sec  
        wait counts: calls
=0 os=0  
        in_wait
=0 iflags=0x15e0  

  可以看到,这个会话正在等待’cursor: mutex X’。不幸的是,这一次没有直接表明holder是谁了。idn=5336, value=1, where|sleeps=3385a5f33,这里value=1,很简单,但是表明的意义却不简单,这表明什么?低8字节为1,表明这个Mutex是被共享持有,而高8字节为0,这是共享持有的Mutex的正常状况,Mutex可能被多个会话共享持有,因此只有引用计数,而不会有持有的SID。这里1就是引用计数,表示被1个会话持有。只有在会话获取Mutex的过程中,才会暂时性的将Mutex的SID设为正在获取的SID,而一旦完成获取,就将Mutex中的SID即value的高8字节部分清0。

0
相关文章