[20250203]21c library cache mutex的深入探究5(补充).txt

[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



posted @   lfree  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2024-02-19 [20240219]建立完善sql_idx.sh脚本.txt
2019-02-19 [20190219]那个更快(11g).txt
点击右上角即可分享
微信分享提示