[20250203]21c library cache mutex的深入探究5(补充).txt --//前面的学习已经了解21c library cache mutex chunk分布的特点,再次总结如下: --//1个chunk 有256个mutex地址,占用12304,每个前面有16字节开头,许多chunk在内存分布上紧挨的。共计512个chunk。 --//在1个chunk内muetx每个偏移48字节. --//我的测试被分成3个大片:注:我在另外一台生产系统看到分成2个大片。 --//通过fchaz脚本查询对应的KSMCHPAR,没有信息输出。 --//问题来了,如果第一次执行一条sql语句,知道bucket桶号,oracle如何定位到相应mutex地址。 --//在11g下开始学习以为整个在一个chunk里面,这样知道基地址加上偏移量就可以知道buckect桶号就可以定位mutex地址。 --//实际上的情况在21c分布在存在于512个chunk中,前面的测试许多chunk在内存分布上紧挨的,分成3个大片。显然不能通过上面简单 --//计算定位mutex地址。 --//在11g下通过查询x$ksmmem,获得相应值,而21c下遇到问题,展开下面的分析。 --//21c无法通过x$ksmmem查询,尝试采用dumpsga命令看看。 1.环境: SCOTT@book01p> @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> 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 --//0x6cfa1400-0x10 = 0x6cfa13f0 2.尝试dumpsga看看。 $ export DUMPSGA_DIR=/home/oracle/study/202501 $ dumpsga $ cd $DUMPSGA_DIR $ cd Feb__3_15\:04\:00_2025/ $ ll total 788520 -rw-rw----. 1 oracle oinstall 10485760 2025-02-03 15:04:09 60000000 -rw-rw----. 1 oracle oinstall 788529152 2025-02-03 15:04:00 60c00000 -rw-rw----. 1 oracle oinstall 8388608 2025-02-03 15:04:08 8fc00000 -rw-rw----. 1 oracle oinstall 36864 2025-02-03 15:04:09 90400000 -rw-rw----. 1 oracle oinstall 1752 2025-02-03 15:04:09 diagmdata $ pmap -x $(pgrep pmon) | egrep -i "sysv|^Address" Address Kbytes RSS Dirty Mode Mapping 0000000060000000 10240 0 0 rw-s- SYSV00000000 (deleted) 0000000060c00000 770048 0 0 rw-s- SYSV00000000 (deleted) 000000008fc00000 8192 0 0 rw-s- SYSV00000000 (deleted) --//Bucket: #=0 Mutex=0x6cfa1400(1125281431552, 9, 0, 6),可以看出相关信息在60c00000文件。 --//0x6cfa1400-0x10 = 0x6cfa13f0,注意intel系列CPU 字节顺序问题,查询应该是f013fa6c。 $ xxd -c32 -g4 60c00000| grep f013fa6c c3a03e0: f013fa6c 00000000 0044fa6c 00000000 1074fa6c 00000000 20a4fa6c 00000000 ...l.....D.l.....t.l.... ..l.... ~~~~~~~~ c3a13e0: 11300000 008fb300 d0f8ad17 00000000 f013fa6c 00000000 f013fa6c 00000000 .0.................l.......l.... ~~~~~~~~ ~~~~~~~~ --//xxd使用注意支持 options infile outfile 格式,第2个参数变为outfile文件,小心覆盖的情况。 --//说明在c3a03e0位置。 --//0x60c00000+0xc3a03e0 = 0x6cfa03e0. --//补充:实际上使用od更加简单,不需要考虑字节顺序问题。 $ od -t x8 60c00000 -A x -w64 60c00000 | grep 6cfa13f0 c3a03c0 00b38f0000001021 0000000017adf8d0 000000006cfa03e0 0002000000001888 000000006cfa13f0 000000006cfa4400 000000006cfa7410 000000006cfaa420 ~~~~~~~~~~~~~~~~ c3a13c0 000000006c5d28d0 000000006c5d58e0 000000006c5d88f0 000000006c5db900 00b38f0000003011 0000000017adf8d0 000000006cfa13f0 000000006cfa13f0 --//0xc3a03c0+0x20 = 0xc3a03e0. SYS@book> @ fchaz 0x6cfa03e0 LOC KSMCHPTR KSMCHIDX KSMCHDUR KSMCHCOM KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR KSMCHPTR_BEGIN KSMCHPTR_END+1 --- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- ----------------- SGA 000000006CFA03C0 1 1 KGLSG 4128 perm 0 000000006CC04000 000000006CFA03C0 000000006CFA13E0 SYS@book> @ fchaz 0x6cfa1400 LOC KSMCHPTR KSMCHIDX KSMCHDUR KSMCHCOM KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR KSMCHPTR_BEGIN KSMCHPTR_END+1 --- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- ----------------- SGA 000000006CFA13E0 1 1 KGLSG 12304 perm 0 000000006CC04000 000000006CFA13E0 000000006CFA43F0 --//正好两个chunk紧挨着,验证前面的判断。 $ od -t x8 -j 0xc3a03e0 -N 4096 -A x -w8 60c00000 | head c3a03e0 000000006cfa13f0 c3a03e8 000000006cfa4400 c3a03f0 000000006cfa7410 c3a03f8 000000006cfaa420 c3a0400 000000006cfad430 c3a0408 000000006cfb0440 c3a0410 000000006cfb3450 c3a0418 000000006cfb6460 c3a0420 000000006cfb9470 c3a0428 000000006cfbc480 $ od -t x8 -j 0xc3a03e0 -N 4096 -A x -w8 60c00000 | tail -4 c3a13c8 000000006c5d58e0 c3a13d0 000000006c5d88f0 c3a13d8 000000006c5db900 c3a13e0 -//od 参数说明-t x8 8位一组,-j 0xc3a03e0表示开始位置,-N 4096取长度,-A x表示文件偏移的16进制显示,-w8显示宽度。 $ od -t x8 -j 0xc3a03e0 -N 4096 -A x -w8 60c00000 | awk 'NR==1{a=$2} NR>1{ print $2,a,strtonum("0x"$2)-strtonum("0x"a);a=$2}' | head 000000006cfa4400 000000006cfa13f0 12304 000000006cfa7410 000000006cfa4400 12304 000000006cfaa420 000000006cfa7410 12304 000000006cfad430 000000006cfaa420 12304 000000006cfb0440 000000006cfad430 12304 000000006cfb3450 000000006cfb0440 12304 000000006cfb6460 000000006cfb3450 12304 000000006cfb9470 000000006cfb6460 12304 000000006cfbc480 000000006cfb9470 12304 000000006cfbf490 000000006cfbc480 12304 $ od -t x8 -j 0xc3a03e0 -N 4096 -A x -w8 60c00000 | awk 'NR==1{a=$2} NR>1{ print $2,a,strtonum("0x"$2)-strtonum("0x"a);a=$2}' | cut -d" " -f3 | uniq -c 30 12304 1 -8353184 338 12304 1 -8156448 141 12304 1 -1818081536 --//与前面opeek脚本取出一致,最后一行因为前面的结尾输出c3a13e0导致的。-000000006c5db900 = -1818081536 3.作为学习尝试使用gdb验证看看: SYS@book> @spid ============================== SID : 21 SERIAL# : 29087 PROCESS : 4584 SERVER : DEDICATED SPID : 4585 PID : 64 P_SERIAL# : 4 KILL_COMMAND : alter system kill session '21,29087' immediate; PL/SQL procedure successfully completed. $ gdb -q -p 4585 <<< "set pagi off ^J x /512gx 0x6cfa03e0"| sed -n "/0x6cfa03e0:/,/^0x6cfa13d0:/p"| sed "s/^(gdb) (gdb) //"| head 0x6cfa03e0: 0x000000006cfa13f0 0x000000006cfa4400 0x6cfa03f0: 0x000000006cfa7410 0x000000006cfaa420 0x6cfa0400: 0x000000006cfad430 0x000000006cfb0440 0x6cfa0410: 0x000000006cfb3450 0x000000006cfb6460 0x6cfa0420: 0x000000006cfb9470 0x000000006cfbc480 0x6cfa0430: 0x000000006cfbf490 0x000000006cfc24a0 0x6cfa0440: 0x000000006cfc54b0 0x000000006cfc84c0 0x6cfa0450: 0x000000006cfcb4d0 0x000000006cfce4e0 0x6cfa0460: 0x000000006cfd14f0 0x000000006cfd4500 0x6cfa0470: 0x000000006cfd7510 0x000000006cfda520 --//^J 按ctrl+v ctrl+j输入。 $ gdb -q -p 4585 <<< "set pagi off ^J x /512gx 0x6cfa03e0"| sed -n "/0x6cfa03e0:/,/^0x6cfa13d0:/p"| sed "s/^(gdb) (gdb) //" > d3.txt $ wc d3.txt 256 768 12800 d3.txt $ awk '{print $2"\n"$3}' d3.txt | awk 'NR==1{a=$1} NR>1{ print $1,a,strtonum($1)-strtonum(a);a=$1}'| head -4 0x000000006cfa4400 0x000000006cfa13f0 12304 0x000000006cfa7410 0x000000006cfa4400 12304 0x000000006cfaa420 0x000000006cfa7410 12304 0x000000006cfad430 0x000000006cfaa420 12304 $ awk '{print $2"\n"$3}' d3.txt | awk 'NR==1{a=$1} NR>1{ print $1,a,strtonum($1)-strtonum(a);a=$1}'| awk '{print $3}'| uniq -c 30 12304 1 -8353184 338 12304 1 -8156448 141 12304 --//验证正确。 SYS@book> select count(*),KSMCHPAR from x$ksmsp where KSMCHCOM='KGLSG' and KSMCHSIZ=12304 group by KSMCHPAR; COUNT(*) KSMCHPAR ---------- ---------------- 31 000000006CC04000 339 000000006C804000 142 000000006C434000
[20250203]21c library cache mutex的深入探究5(补充).txt
来源:这里教程网
时间:2026-03-03 21:33:26
作者:
编辑推荐:
- [20250203]21c library cache mutex的深入探究5(补充).txt03-03
- [20250203]21c library cache mutex的深入探究6(gets的变化).txt03-03
- 当哪吒邂逅铂乐・极满家,开启家居新境界03-03
- [20250204]21c library cache mutex的深入探究7(_mutex_wait_scheme=2).txt03-03
- [20250204]21c library cache mutex的深入探究8(_mutex_wait_time>1)03-03
- [20250205]21c library cache mutex的深入探究9(_mutex_wait_scheme=0).txt03-03
- [20250205]21c library cache mutex的深入探究10(_mutex_wait_scheme=1).txt03-03
- [20250206]21c library cache mutex的小结.txt03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 当哪吒邂逅铂乐・极满家,开启家居新境界
当哪吒邂逅铂乐・极满家,开启家居新境界
26-03-03 - 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
