[20210903]探究mutex的值.txt
--//前一段时间做library_cache转储时,在bucket后面跟着Mutex,类似信息如下。
Bucket: #=102650 Mutex=0x80528f40(0, 19, 0, 6)
--//注:11g 下每个library cache bucket占用16字节,后面跟着mutex,mutex结构占用24字节,这样整个占用40字节。可以参考我前面
--//的测试 [20210524]分析library cache转储 3.txt
--//我可以通过oradebug poke相应地址,然后dump确定mutex地址后面括号的值来自那里。
--//在测试前先贴一个以前的oradebug peek的内容:
SYS@book> oradebug peek 0x80528f40 40
[080528F40, 080528F68) = 00000001 00000000 0000092B 00042180 000190FA 00000006 80528F58 00000000 80528F58 00000000
--//我当时推断0000092B=>表示get, 00042180=>表示sleep,000190FA=102650=>表示bucket值,最后00000006 不知道.
--//前面括号里面的内容猜测应该对应00000001,0000092B,00042180,00000006,也就是0~3,8~11,12~15,20~23字节.
--//我记忆里0-3=>表示mutex阻塞的sid,4~7=>表示并发访问的数量。
--//通过例子验证看看.
1.环境:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SCOTT@book> select * from dept where deptno=20;
DEPTNO DNAME LOC
---------- -------------- -------------
20 RESEARCH DALLAS
--//执行5次以上。
SCOTT@book> @ hash
HASH_VALUE SQL_ID CHILD_NUMBER HASH_HEX
---------- ------------- ------------ ---------
95129850 80baj2c2ur47u 0 5ab90fa
--//95129850%131072 = 102650
SYS@book> @ tix
New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_27978_0001.trc
SYS@book> oradebug setmypid
Statement processed.
SYS@book> oradebug dump library_cache 10;
Statement processed.
2.测试:
--//首先我不知道为什么最后1个值总是6,可以简单通过如下命令验证。
$ awk '/^Bucket:/{print $6}' book_ora_27978_0001.trc | uniq -c
4322 6)
--//以前的测试我就知道这样的情况,为什么是6我不是很清楚,表示什么更加不清楚。
$ awk '/^Bucket:/{print $3}' book_ora_27978_0001.trc | cut -d"(" -f2|uniq -c
4322 0,
--//第1个总是0.我估计表示阻塞会话的sid.
--//检索转储文件.查询字串Bucket: #=102650,发现如下:
Bucket: #=102650 Mutex=0x80528f40(0, 5, 0, 6)
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 00000005 00000000 000190FA 00000000
--//执行如下:
oradebug poke 0x0000000080528f40 4 0x00000000
oradebug poke 0x0000000080528f44 4 0x00000000
oradebug poke 0x0000000080528f48 4 0x00000030
oradebug poke 0x0000000080528f4c 4 0x00000004
oradebug poke 0x0000000080528f50 4 0x000190FA
oradebug poke 0x0000000080528f54 4 0x00000007
--//注:我反复测试多次,前面两个poke如果不是0,dump library_cache时挂起!!
SYS@book> @ spid
SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
44 33 27977 DEDICATED 27978 27 11 alter system kill session '44,33' immediate;
--//打开新会话执行如下:
SYS@book> @ wait
P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATUS STATE WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS CLIENT_INFO
---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------- -------- ------------------- --------------- --------------- -------------------- --------------------
0000000000019000 0000000200000001 000000000000001F 102400 8589934593 31 44 33 83 library cache: mutex X INACTIVE WAITING 2633137 3 Concurrency
--//8589934593 = /2^16 %2^16 (Type | Mode) = 131072,1 = 0x200000001(与我poke的值一样)
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 00000030 00000004 00019000 00000007
#############################################
--//小插曲,前面有一次计算地址错误,修改oradebug poke 0x0000000080528f4d 4 0x00000004,导致修改错误.
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 00000030 00000400 000190FA 00000007
~~~~~~~~
--//注意看下划!!!!
#############################################
SYS@book> oradebug poke 0x0000000080528f4c 4 0x00000004
BEFORE: [080528F4C, 080528F50) = 00000004
AFTER: [080528F4C, 080528F50) = 00000004
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 00000030 00000004 000190FA 00000007
SYS@book> @ tix
New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_27978_0003.trc
SYS@book> oradebug dump library_cache 10;
Statement processed.
--//检索转储文件.查询字串Bucket: #=102650,发现如下:
Bucket: #=102650 Mutex=0x80528f40(0, 50, 4, 6)
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 00000036 00000004 000190FA 00000000
--// 0x36 = 54
3.继续重来:
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 0000003B 00004890 000190FA 00000000
oradebug poke 0x0000000080528f44 4 0x00000002
oradebug poke 0x0000000080528f48 4 0x00000055
oradebug poke 0x0000000080528f4c 4 0x00200004
oradebug poke 0x0000000080528f50 4 0x000190FA
oradebug poke 0x0000000080528f54 4 0x00000077
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000002 00000055 00200004 000190FA 00000077
SYS@book> @ tix
New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_28288_0001.trc
SYS@book> oradebug dump library_cache 8;
--//挂起.
--//打开新session.
SYS@book> @ wait
P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATUS STATE WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS CLIENT_INFO
---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------- -------- ------------------- --------------- --------------- -------------------- --------------------
00000000000190FA 0000000200000000 000000000000001F 102650 8589934592 31 44 35 78 library cache: mutex X INACTIVE WAITING 20259070 20 Concurrency
SYS@book> select * from v$mutex_sleep_history where mutex_identifier=102650
2 @ prxx
==============================
MUTEX_IDENTIFIER : 102650
SLEEP_TIMESTAMP : 2021-09-07 10:10:24.439911
MUTEX_TYPE : Library Cache
GETS : 85 --//85 = 0x55
SLEEPS : 1589412 --//1589412 = 0x1840a4
REQUESTING_SESSION : 44
BLOCKING_SESSION : 2
LOCATION : kgldmc1 31 --//我总感觉这个location不熟悉缩略写,很难猜测问题在那里.
MUTEX_VALUE : 0000000200000000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
P1 : 0
P1RAW : 00
P2 : 0
P3 : 0
P4 : 0
P5 :
--//在打开新会话,执行如下:
SYS@book> oradebug setmypid
Statement processed.
SYS@book> oradebug poke 0x0000000080528f44 4 0x00000000
BEFORE: [080528F44, 080528F48) = 00000002
AFTER: [080528F44, 080528F48) = 00000000
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 00000056 0020225A 000190FA 00000000
--//检索转储文件.查询字串Bucket: #=102650,发现如下:
Bucket: #=102650 Mutex=0x80528f40(0, 86, 2105946, 6)
--//86 = 0x56
--//2105946 = 0x20225a
--//可以基本确定8~11,12~15 对应gets,sleep3.似乎转储后最后4位会变成0.我估计后面6应该就是对应20~23字节.
--//基本可以确定mutex括号里面的内容猜测应该对应第一位不知道,8~11,12~15,20~23字节.
SCOTT@book> select * from v$mutex_sleep_history where mutex_identifier=102650
2 @ prxx
==============================
MUTEX_IDENTIFIER : 102650
SLEEP_TIMESTAMP : 2021-09-07 09:47:26.770924
MUTEX_TYPE : Library Cache
GETS : 57
SLEEPS : 1580510
REQUESTING_SESSION : 44
BLOCKING_SESSION : 2
LOCATION : kgldmc1 31
MUTEX_VALUE : 0000000200000000
P1 : 0
P1RAW : 00
P2 : 0
P3 : 0
P4 : 0
P5 :
PL/SQL procedure successfully completed.
4.继续:
SYS@book> oradebug setmypid
Statement processed.
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000000 00000000 00000059 00202A39 000190FA 00000000
SYS@book> oradebug poke 0x0000000080528f40 4 0x0000001
BEFORE: [080528F40, 080528F44) = 00000000
AFTER: [080528F40, 080528F44) = 00000001
SYS@book> oradebug peek 0x80528f40 24
[080528F40, 080528F58) = 00000001 00000000 00000059 00202A39 000190FA 00000000
--//59 = 89
--//00202A39 = 2107961
--//打开新session:
SCOTT@book> @ spid
SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
295 11 28515 DEDICATED 28516 21 6 alter system kill session '295,11' immediate;
SCOTT@book> select * from dept where deptno=20;
--//挂起.
SYS@book> select * from v$mutex_sleep_history where mutex_identifier=102650
2 @ prxx
MUTEX_IDENTIFIER : 102650
SLEEP_TIMESTAMP : 2021-09-07 10:33:43.614413
MUTEX_TYPE : Library Cache
GETS : 89
SLEEPS : 2077854
REQUESTING_SESSION : 295
BLOCKING_SESSION : 0
LOCATION : kglhdgn1 62
MUTEX_VALUE : 0000000000000001
P1 : 0
P1RAW : 00
P2 : 0
P3 : 0
P4 : 0
P5 :
PL/SQL procedure successfully completed.
SYS@book> @ wait
P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATUS STATE WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS CLIENT_INFO
---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------- -------- ------------------- --------------- --------------- -------------------- --------------------
00000000000190FA 0000000000000001 000000000000003E 102650 1 62 295 11 63427 library cache: mutex X ACTIVE WAITING 666 0 Concurrency
--//放弃,探究有点乱.
5.总结:
--//前面两个poke如果不是0,dump library_cache时总是挂起!!
--//基本确定8~11,12~15 对应gets,sleep3,也就是例如:Bucket: #=102650 Mutex=0x80528f40(0, 19, 0, 6),第2,3数字表示gets,sleeps数量.