[20250210]21c library cache mutex的深入探究12(补充).txt --//探究library cache mutex阻塞导致的相关等待事件,分析_mutex_wait_scheme=2的情况下修改mutext值的0-3字节。 --//关于mutex的结构,我的测试的结果如下: --// 0- 7 字节是muext的值。 --// 8-11 字节是mutex gets的数量。 --//12-15 字节是mutex sleep的数量。 --//16-19 字节是Bucket桶号。 --//20-23 字节是转储看到的6. --//我前面的测试仅仅修改mutex值的sid部分(4-7字节),也就是mutex结构里面0-7字节的4-7部分,没有尝试0-3字节的信息,该信息记 --//录的是持有该mutex的数量,尝试修改这部分信息看看会出现怎么情况。 --//前次测试忘记关闭resmgr cpu quantum,补充完善关闭resmgr cpu quantum下做的测试。 1.环境: SYS@book> @ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. SYS@book> @ hidez ^_mutex NUM N_HEX NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD ---- ----- ------------------ ----------------- ------------- ------------- ------------ ----- --------- 3553 DE1 _mutex_wait_time Mutex wait time TRUE 1 1 FALSE IMMEDIATE 3554 DE2 _mutex_spin_count Mutex spin count TRUE 255 255 FALSE IMMEDIATE 3555 DE3 _mutex_wait_scheme Mutex wait scheme TRUE 2 2 FALSE IMMEDIATE --//缺省_mutex_wait_time=1,时间单位与_mutex_wait_scheme相关,_mutex_wait_scheme=2时时间单位是厘秒,而 --//_mutex_wait_scheme=0,1时,单位时毫秒。 --//_mutex_wait_scheme =2时,_mutex_wait_time>1时sleeps的时间会出现指数回退. --//缺省_mutex_wait_scheme =2. --//网上找了一段资料: * _mutex_spin_count (Integer) - This sets the number of times to spin before yielding/waiting. * _mutex_wait_scheme (Integer) - In 11.2 this controls which wait scheme to use. It can be set to one of the three wait schemes described above thus: _mutex_wait_scheme = 0 – Always YIELD _mutex_wait_scheme = 1 & _mutex_wait_time = t – Always SLEEP for t milli-seconds _mutex_wait_scheme = 2 & _mutex_wait_time = t – EXP BACKOFF with maximum sleep (default) 2.测试前准备: SYS@book> oradebug setmypid Statement processed. SYS@book> oradebug dump library_cache 4 Statement processed. $ grep "^Bucket:" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_10770.trc | head -4 Bucket: #=0 Mutex=0x6cfa1400(1125281431552, 9, 0, 6) Bucket: #=5 Mutex=0x6cfa14f0(1125281431552, 4, 0, 6) Bucket: #=17 Mutex=0x6cfa1730(1125281431552, 8, 0, 6) Bucket: #=39 Mutex=0x6cfa1b50(1125281431552, 4, 0, 6) --//以上是前面测试的结果,直接找Bucket: #=0 Mutex=0x6cfa1400的语句测试。 --//该sql语句select /*+ 9 */ count(*) from dept where deptno = 93834;的bucket=0. --//Bucket: #=0 Mutex=0x6cfa1400 --//0x6cfa1400-0x10 = 0x6cfa13f0 3.测试: --//节省篇幅,操作细节不再贴出,直接给出测试结果。 (gdb) x /8wx 0x6cfa1400 0x6cfa1400: 0x00000000 0x00000000 0x00000007 0x00000000 0x6cfa1410: 0x00000000 0x00000000 0x63e8bc78 0x00000000 (gdb) set *(int *)0x6cfa1400=0x6 (gdb) x /8wx 0x6cfa1400 0x6cfa1400: 0x00000006 0x00000000 0x00000007 0x00000000 0x6cfa1410: 0x00000000 0x00000000 0x63e8bc78 0x00000000 --//select /*+ 9 */ count(*) from dept where deptno = 93834; 等3X秒,执行如下。 (gdb) set *(int *)0x6cfa1400=0x0 (gdb) x /8wx 0x6cfa1400 0x6cfa1400: 0x00000000 0x00000000 0x00000008 0x0000ef38 0x6cfa1410: 0x00000000 0x00000000 0x63e8bc78 0x00000000 --//gets次数0x7->0x8 ,sleeps次数0x0->0x0000ef38 = 61240. SYS@book> @ ashtop event,p1,p1raw,p2raw,p3raw 1=1 trunc(sysdate)+09/24+03/1440+47/86400 trunc(sysdate)+09/24+04/1440+36/86400 Total Distinct Distinct Distinct Seconds AAS %This EVENT P1 P1RAW P2RAW P3RAW FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------------------------------------ ---------- ----------------- ----------------- ----------------- ------------------- ------------------- ---------- -------- ----------- 37 .8 67% | library cache: bucket mutex X 0 0000000000000000 0000000000000006 000000000000003E 2025-02-10 09:03:48 2025-02-10 09:04:35 1 37 37 11 .2 20% | 0 2025-02-10 09:04:00 2025-02-10 09:04:33 1 11 11 6 .1 11% | 100 2025-02-10 09:03:48 2025-02-10 09:04:21 1 6 6 1 .0 2% | 3 2025-02-10 09:04:17 2025-02-10 09:04:17 1 1 1 $ egrep "getrusage" 0210mutexa.txt 09:03:48.172624 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 303099}, ru_stime={0, 38442}, ...}) = 0 <0.000019> 09:03:49.380082 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 456255}, ru_stime={0, 99773}, ...}) = 0 <0.000010> 09:03:51.381719 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 735628}, ru_stime={0, 236915}, ...}) = 0 <0.000011> 09:03:53.382038 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={1, 10436}, ru_stime={0, 307752}, ...}) = 0 <0.000007> 09:03:55.383268 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={1, 288414}, ru_stime={0, 387664}, ...}) = 0 <0.000013> 09:03:57.384009 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={1, 479131}, ru_stime={0, 445793}, ...}) = 0 <0.000007> 09:03:59.384298 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={1, 753466}, ru_stime={0, 569824}, ...}) = 0 <0.000006> 09:04:01.385257 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={2, 77129}, ru_stime={0, 671155}, ...}) = 0 <0.000012> 09:04:03.389199 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={2, 350130}, ru_stime={0, 771763}, ...}) = 0 <0.000006> 09:04:05.389855 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={2, 622499}, ru_stime={0, 846137}, ...}) = 0 <0.000006> 09:04:07.391404 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={2, 866029}, ru_stime={0, 948938}, ...}) = 0 <0.000008> 09:04:09.393450 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={3, 151839}, ru_stime={1, 40751}, ...}) = 0 <0.000006> 09:04:11.395003 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={3, 462951}, ru_stime={1, 146327}, ...}) = 0 <0.000007> 09:04:13.398522 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={3, 719526}, ru_stime={1, 245038}, ...}) = 0 <0.000026> 09:04:15.399019 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={4, 36260}, ru_stime={1, 338502}, ...}) = 0 <0.000007> 09:04:17.400348 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={4, 374888}, ru_stime={1, 409892}, ...}) = 0 <0.000033> 09:04:19.422586 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={4, 597359}, ru_stime={1, 507211}, ...}) = 0 <0.000054> 09:04:21.436519 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={4, 797668}, ru_stime={1, 570634}, ...}) = 0 <0.000015> 09:04:23.437964 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={4, 981486}, ru_stime={1, 629400}, ...}) = 0 <0.000017> 09:04:25.440397 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={5, 186811}, ru_stime={1, 684002}, ...}) = 0 <0.000007> 09:04:27.440161 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={5, 401148}, ru_stime={1, 743441}, ...}) = 0 <0.000018> 09:04:29.442450 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={5, 656631}, ru_stime={1, 856503}, ...}) = 0 <0.000040> 09:04:31.442938 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={5, 873049}, ru_stime={1, 914698}, ...}) = 0 <0.000016> 09:04:33.444659 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={6, 133743}, ru_stime={2, 19798}, ...}) = 0 <0.000007> 09:04:35.445343 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={6, 422594}, ru_stime={2, 140179}, ...}) = 0 <0.000013> 09:04:35.821465 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={6, 476067}, ru_stime={2, 169657}, ...}) = 0 <0.000006> 09:04:35.822626 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={6, 476342}, ru_stime={2, 169749}, ...}) = 0 <0.000008> --//调用getrusage是2秒间隔。 $ awk '{print $2}' 0210mutexa.txt |egrep "semtimedop|getrusage|sched_yield|select" | uniq -c | head -20 1 getrusage(0x1 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() 1 select(0, 99 sched_yield() --//如果单独抽取sched_yield,select函数,99次sched_yield(),1次select(0。可以发现就是_mutex_wait_scheme=0模式。 $ awk '{print $2}' 0210mutexa.txt |egrep "semtimedop|getrusage|sched_yield|select" | uniq -c | grep sched_yield| uniq -c| head -20 182 99 sched_yield() 1 43 sched_yield() 1 56 sched_yield() 334 99 sched_yield() 1 60 sched_yield() 1 39 sched_yield() 293 99 sched_yield() 1 45 sched_yield() 1 54 sched_yield() 321 99 sched_yield() 1 76 sched_yield() 1 23 sched_yield() 542 99 sched_yield() 1 33 sched_yield() 1 66 sched_yield() 395 99 sched_yield() 1 89 sched_yield() 1 10 sched_yield() 623 99 sched_yield() 1 40 sched_yield() --//遇到getrusage分开,sched_yield相加次数还是99次,如此反复循环。 $ egrep "select" 0210mutexa.txt | head -6 09:03:48.178734 select(0, [], [], [], {0, 1000}) = 0 (Timeout) <0.001815> 09:03:48.186904 select(0, [], [], [], {0, 1000}) = 0 (Timeout) <0.001444> 09:03:48.194249 select(0, [], [], [], {0, 1000}) = 0 (Timeout) <0.006749> 09:03:48.207123 select(0, [], [], [], {0, 1000}) = 0 (Timeout) <0.001742> 09:03:48.214762 select(0, [], [], [], {0, 1000}) = 0 (Timeout) <0.016548> 09:03:48.237299 select(0, [], [], [], {0, 1000}) = 0 (Timeout) <0.023285> --//休眠的时间单位微秒(1/10^6秒),1000微秒= 1000/10^6 = .001秒。select休眠的时间很短1毫秒。 SYS@book> @ mutexprofz idn,hash,loc,maddr "ts>=trunc(sysdate)+09/24+03/1440+47/86400 and ts<=trunc(sysdate)+09/24+04/1440+36/86400" -- MutexProf by Tanel Poder (http://www.tanelpoder.com) -- Showing profile of top 20 sleeps... -- column info : id idn hash hash_value=>hash_value ts=>sleep_timestamp -- req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr SUM_SLEEPS GETS_DIFF MUTEX_TYPE IDN HASH GET_LOCATION mutex_addr OBJECT_NAME ---------- -------------- --------------- ---------- ---------- --------------------------------- -------------------- ---------------- 61240 Library Cache 0 kglhdgn1 62 000000006CFA1400 (name not found) --//可以发现与前面的查询一致。 (gdb) x /8wx 0x6cfa1400 0x6cfa1400: 0x00000000 0x00000000 0x00000008 0x0000ef38 0x6cfa1410: 0x00000000 0x00000000 0x63e8bc78 0x00000000 --//gets次数0x7->0x8 ,sleeps次数0x0->0x0000ef38 = 61240. $ awk '{print $2}' 0210mutexa.txt |egrep "semtimedop|getrusage|sched_yield|select" | sort | uniq -c 27 getrusage(0x1 709434 sched_yield() 7166 select(0, --//实际记录的sleeps 次数 709434+7166 = 716600,远远大于61240,实际上单次sleeps最大的sleeps的保存是0xffff, --//716600 = 0xaef38, 16进制后4位是0xef38 = 61240,与opeek,mutexprofz的输出一致。 4.小结: --//可以发现采用sleep模式并非一成不变,oracle根据mutex的位置采用不同的模式,当前是_mutex_wait_scheme=2, --//在这里采用sched_yield 99+select模式,相当于_mutex_wait_scheme=0,估计持有数量的释放更快。
[20250210]21c library cache mutex的深入探究12(补充).txt
来源:这里教程网
时间:2026-03-03 21:33:10
作者:
编辑推荐:
- [20250210]21c library cache mutex的深入探究12(补充).txt03-03
- hyper xp,hyper xp的实操攻略,hyper-v批量管理工具的使用指南03-03
- hyper 共享,hyper 共享的实操流程,hyper-v批量管理工具的使用指南03-03
- hyper v win10,hyper v win10的实操流程,hyper-v批量管理工具的使用指南03-03
- 数据库无法登录了怎么办,怎么收集数据库当前信息03-03
- hyper v vmware,hyper v vmware的实操流程,hyper-v批量管理工具的使用指南03-03
- 如何将一个普通的非分区表进行分区5 ALTER TABLE方式03-03
- 极满家陪你闹元宵,长沙家具焕新家,开启团圆幸福年!03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- hyper xp,hyper xp的实操攻略,hyper-v批量管理工具的使用指南
- hyper 共享,hyper 共享的实操流程,hyper-v批量管理工具的使用指南
- hyper v win10,hyper v win10的实操流程,hyper-v批量管理工具的使用指南
- hyper v vmware,hyper v vmware的实操流程,hyper-v批量管理工具的使用指南
- 数据库io负载瓶颈问题
数据库io负载瓶颈问题
26-03-03 - log file sync导致的Oracle重大生产性能故障
log file sync导致的Oracle重大生产性能故障
26-03-03 - 蛇年第一个Oracle 600错误!15年老司机也没见过
蛇年第一个Oracle 600错误!15年老司机也没见过
26-03-03 - oracle多次密码错误登录,用户锁住或失效
oracle多次密码错误登录,用户锁住或失效
26-03-03 - 第28期 Oracle LOB数据实际存储在哪里
第28期 Oracle LOB数据实际存储在哪里
26-03-03 - 关闭hyper-v,关闭hyper-v的实操步骤,hyper-v批量管理工具的使用指南
