[20220406]使用那個shared pool latch的疑問1.txt
[20220406]使用那個shared pool latch的疑問1.txt
--//放假看了以前寫的blog,做一些必要的補充以及說明.
--//前面我的測試已經驗證一條sql語句會使用 其sql語句的 hash_value % bucket_size % _kghdsidx_count +1 的 shared pool
--//latch.
--//參考連結 => [20210708]使用那個shared pool latch.txt
--// _kghdsidx_count 引數定義了shared pool latch的數量,同時也定義共享池分成多個子池.
--//連結裡面也測試了使用那個shared pool latch,也意味者其使用的chunk也基本上相應子池中分配.
--//參考連結 => [20210803]使用那個shared pool latch(補充).txt,但是確實也遇到了不從相應子池中分配的情況.
--//另外在連結 [20220303]oracle如何定位使用library cache mutex 3.txt ,我提到存在一個表或者陣列儲存了
--//library cache mutex的地址表.
--//假設知道基地址A後,如果知道bucket值.使用bucket/256 取整就可以定位 該陣列的地址 等於 A + trunc(bucket/256)*8 地址
--//指向的內容B, 再透過bucket%256 * 40 + B , 就知道定位該bucket的library cache mutex的地址。
--//我在當時測試_kghdsidx_count=3的情況,該地址表的記錄資訊在幾個chunk上跳來跳去,文字很難表達.
--//本文仔細探究sql語句以及一些chunk使用那個shared pool latch,其使用的chunk的分配細節,許多是我的猜測.
1.環境:
SYS@127.0.0.1:9014/ywdb> @ 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
SYS@127.0.0.1:9014/ywdb> @ hide _kgl_bucket_count
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
----------------- ------------------------------------------------------------------ ------------- ------------- ------------ ----- ---------
_kgl_bucket_count Library cache hash table bucket count (2^_kgl_bucket_count * 256) TRUE 9 9 FALSE FALSE
--// 2^9*2^8 = 131072
SYS@127.0.0.1:9014/ywdb> @ hide idx_count
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
--------------- ------------------ ------------- ------------- ------------ ----- ---------
_kghdsidx_count max kghdsidx count TRUE 7 7 FALSE FALSE
--//生產系統共享記憶體很大並且CPU_count=32.
SYS@127.0.0.1:9014/ywdb> @ tix
New tracefile_identifier = /u01/app/oracle/diag/rdbms/ywdb/ywdb1/trace/ywdb1_ora_3733_0001.trc
SYS@127.0.0.1:9014/ywdb> oradebug setmypid
Statement processed.
SYS@127.0.0.1:9014/ywdb> oradebug dump heapdump 2;
Statement processed.
--//生產系統,轉儲有點慢...
--//建立表xx1,儲存x$kglob資訊.
create table xx1 tablespace users as
select KGLHDPAR,KGLHDADR,KGLOBHD0,KGLOBHD1,KGLOBHD2,KGLOBHD3,KGLOBHD4,KGLOBHD5,KGLOBHD6,kglnahsh,substr(kglnaobj,1,40) c40 from x$kglob;
create index i_xx1_KGLHDADR on xx1(KGLHDADR) tablespace users;
create index i_xx1_KGLHDPAR on xx1(KGLHDPAR) tablespace users;
create table xx2 tablespace users as select * from x$ksmsp;
--//生成表xx1,xx2的主要目的是避免後面的查詢分析時很慢,另外直接查詢x$kglob不現實,可能一些物件已經刷出共享池.
--//儲存在一張表相當於建立x$kglob的快照.
--//SQLA 表示child cursor heap6
--//KGLH0 表示parent/child cursor heap0
--//KGLHD 表示parent/child cursor handle
--//KGLDA 表示parent/child cursor heap 描述符
--//KGLH0,SQLA的後面都存在^hash_value(16進位制).不知道為什麼KGLHD,KGLDA沒有對應標識.
# egrep "HEAP DUMP|KGLH0\^|SQLA\^|KGLHD|KGLDA" /u01/app/oracle/diag/rdbms/ywdb/ywdb1/trace/ywdb1_ora_3733_0001.trc >| aa.txt
2.分析:
--//分析KGLHD,建立d1.sh指令碼取出包含KGLHD的chunk的開始地址.
$ cat d1.sh
#! /bin/bash
echo "sga heap($1,0) --- sga heap($2,0)"
sed -n "/sga heap($1/,/sga heap($2/p" aa.txt | awk '/KGLHD/{print $2}' | sort | uniq
--//對於11g,sql語句的這些chunk的開始地址+48(0x30) 就是對應控制程式碼的地址,也就是對應XKGLOB.KGLHDADR欄位資訊.改寫指令碼如下:
$ cat d1.sh
#! /bin/bash
# echo "sga heap($1,0) --- sga heap($2,0)"
sed -n "/sga heap($1/,/sga heap($2/p" aa.txt | awk '/KGLHD/{print $2}' | sort | uniq | tr 'a-z' 'A-Z' | \
xargs -IQ echo Q + 30 | sed '1iobase=16;ibase=16' | bc -q
--//透過它查詢X$kglob 就可以獲得hash值,然後做運算看看情況.
$ cat qq1.txt
Select mod(mod(kglnahsh, 131072),7)+1 N10
from xx1 where
-- KGLHDPAR = hextoraw(lpad(upper('&1'), 16, '0'))
--or
KGLHDADR = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD0 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD1 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD2 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD3 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD4 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD5 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD6 = hextoraw(lpad(upper('&1'), 16, '0'))
/
$ ./d1.sh 1 2 | xargs -IQ echo @ qq1.txt Q > qq2.txt
--//編輯qq2.txt加入
set head off feedback off term off
spool qq3.txt
@ qq1.txt ....
...
spool off
set head on feedback on term on
$ sort qq3.txt | uniq -c
6
27805 1
501 2
467 3
519 4
502 5
469 6
518 7
--//可以發現大部分計算結果mod(mod(kglnahsh, 131072),7)+1 =1.不過依然存在少量的chunk分配在sga heap($1,0) --- sga heap($2,0)範圍。
--//但是mod(mod(kglnahsh, 131072),7)+1 <> 1 的情況。
--//其它也出現類似的情況。
--//修改qq1.txt指令碼如下,執行:
$ cat qq1.txt
column N10 format 9999
Select mod(mod(kglnahsh, 131072),7)+1 N10
,xx1.*
from xx1 where
-- KGLHDPAR = hextoraw(lpad(upper('&1'), 16, '0'))
--or
KGLHDADR = hextoraw(lpad(upper('&1'), 16, '0'))
and mod(mod(kglnahsh, 131072),7)+1 =2
--or KGLOBHD0 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD1 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD2 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD3 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD4 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD5 = hextoraw(lpad(upper('&1'), 16, '0'))
--or KGLOBHD6 = hextoraw(lpad(upper('&1'), 16, '0'))
/
--//再次執行qq2.txt 指令碼:
$ head -2 qq3.txt ;tail -2 qq3.txt
N10 KGLHDPAR KGLHDADR KGLOBHD0 KGLOBHD1 KGLOBHD2 KGLOBHD3 KGLOBHD4 KGLOBHD5 KGLOBHD6 KGLNAHSH C40
--- ---------------- ---------------- ---------------- -------- -------- -------- -------- -------- -------- ---------- --------------------------------
2 00000005A0441EF0 00000005A0441EF0 00000005A279D548 00 00 00 00 00 00 931942480 4515c2b969e6ffd4fe80d95c235d8877
2 00000005A06FF080 00000005A06FF080 00000005F79BF608 00 00 00 00 00 00 3751868314 d30d8b02f3c324b3f584889088200a2c
2 0000000617F09CD0 0000000617F09CD0 00000005BCF801B0 00 00 00 00 00 00 1611424971 9e5040d05f9ac41f20626ba2760602c3
2 0000000617F9CF28 0000000617F9CF28 00000005BF57C140 00 00 00 00 00 00 2156270772 e32ec116e8098cee5af3814212629a
--//注:行頭我自己加上的,便於檢視.
--//取C40也就是等於substr(kglnaobj,1,40),取最後8位.
--//235d8877 = 593332343 593332343%131072%7+1 = 1
--//88200a2c = 2283801132 2283801132%131072%7+1 = 1
--//0x760602c3%131072%7+1 = 1
--//0x4212629a%131072%7+1 = 1
--//不過你可以發現如果使用kglnaobj的後8位按照類似的方式計算正好都是1,可以寫指令碼驗證看看。
$ cat qq1.txt
column N10 format 9999
-- Select mod(mod(kglnahsh, 131072),7)+1 N10
-- ,xx1.*
-- from xx1 where
-- -- KGLHDPAR = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or
-- KGLHDADR = hextoraw(lpad(upper('&1'), 16, '0'))
-- and mod(mod(kglnahsh, 131072),7)+1 =2
-- --or KGLOBHD0 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD1 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD2 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD3 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD4 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD5 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD6 = hextoraw(lpad(upper('&1'), 16, '0'))
-- /
select mod(mod(TO_NUMBER(substr(c40,-8),'xxxxxxxxxxxxxxx'),131072),7)+1 N10 from xx1
where
KGLHDADR = hextoraw(lpad(upper('&1'), 16, '0'))
and mod(mod(kglnahsh, 131072),7)+1 <> 1
/
--//再次執行qq2.txt。
$ uniq -c qq3.txt
2976 1
--//全部符合需求.。
--//我看了這些型別都是KGLHDNSD='SQL AREA STATS',KGLOBTYD='CURSOR STATS'的chunk,感覺這些是一些物件的統計資訊相關的chunk。
--//我給重新建立xx1表來分析這些問題。
create table xx3 tablespace users as
select KGLHDPAR,KGLHDADR,KGLOBHD0,KGLOBHD1,KGLOBHD2,KGLOBHD3,KGLOBHD4,KGLOBHD5,KGLOBHD6,kglnahsh,kglnaobj,KGLNAHSV,KGLHDNSD,KGLOBTYD from x$kglob;
create index i_xx3_KGLHDPAR on xx3(KGLHDPAR) tablespace users;
create index i_xx3_KGLHDADR on xx3(KGLHDADR) tablespace users;
$ cat qq1.txt
column N10 format 9999
-- Select mod(mod(kglnahsh, 131072),7)+1 N10
-- ,xx1.*
-- from xx1 where
-- -- KGLHDPAR = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or
-- KGLHDADR = hextoraw(lpad(upper('&1'), 16, '0'))
-- and mod(mod(kglnahsh, 131072),7)+1 =2
-- --or KGLOBHD0 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD1 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD2 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD3 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD4 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD5 = hextoraw(lpad(upper('&1'), 16, '0'))
-- --or KGLOBHD6 = hextoraw(lpad(upper('&1'), 16, '0'))
-- /
-- select mod(mod(TO_NUMBER(substr(c40,-8),'xxxxxxxxxxxxxxx'),131072),7)+1 N10 from xx1
-- where
-- KGLHDADR = hextoraw(lpad(upper('&1'), 16, '0'))
-- and mod(mod(kglnahsh, 131072),7)+1 <>1
-- /
select kglnahsh,substr(kglnaobj,40) c40 ,KGLHDNSD,KGLOBTYD from xx3
where
KGLHDADR = hextoraw(lpad(upper('&1'), 16, '0'))
and mod(mod(kglnahsh, 131072),7)+1 <>1
/
--//再次執行qq2.txt。
$ cut -c30- qq3.txt | awk '{print $0}' |uniq -c
1515 SQL AREA STATS CURSOR STATS
--//501+467+519+502+469+518 = 2976,很明顯許多物件已經不再共享池了。但是還是可以看出這些物件的KGLHDNSD='SQL AREA
--//STATS',KGLOBTYD='CURSOR STATS'。
--//我的測試有一些問題,qq1.txt直接帶引數,沒有使用繫結變數,導致許多物件已經不再共享池,明天改進重複該測試看看。
--//不過可以基本驗證我的判斷。sql語句型別的KGLHD (表示parent/child cursor handle ),根據hash_value % bucket_size % _kghdsidx_count +1
--//確定使用那個sga heap中的chunk。
--//而KGLHDNSD='SQL AREA STATS',KGLOBTYD='CURSOR STATS'相關的chunk按照kglnaobj & 0xffffffff % _kghdsidx_count +1來計算的。
--//當然這個是我亂猜的,不知道這個oracle的具體演算法。
--//寫的有點亂,自己能看懂。
--//總之,晚上回家好好整理,明天重複測試。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2887683/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20210708]使用那個shared pool latch.txt
- [20210803]使用那個shared pool latch(補充).txt
- [20220412]shared pool latch與使用sga heap的疑問2.txt
- [20220413]shared pool latch與使用sga heap的疑問3.txt
- [20210512]shared pool latch與library cache latch的簡單探究.txt
- [20190319]shared pool latch與library cache latch的簡單探究.txt
- 透過案例學調優之--和 SHARED POOL 相關的主要 Latch
- [20190401]那個更快的疑問.txt
- [20210520]11g shared pool latch與library cache mutex的簡單探究.txtMutex
- [20190423]那個更快的疑問3.txt
- [20210521]11g shared pool latch與library cache mutex的簡單探究4.txtMutex
- [20210520]11g shared pool latch與library cache mutex的簡單探究3.txtMutex
- 共享池 shared pool
- [20200213]使用DBMS_SHARED_POOL.MARKHOT的總結.txt
- Oracle Shared Pool Memory ManagementOracle
- [20190419]shared latch spin count.txt
- [20190416]檢視shared latch gets的變化.txt
- [20190419]shared latch spin count 2.txt
- [20210218]shared latch spin count 6.txt
- [20210218]shared latch spin count 5.txt
- SHARED POOL中KGH: NOACCESS佔用大量記憶體的問題分析記憶體
- [20200126]使用DBMS_SHARED_POOL.MARKHOT與sql語句.txtSQL
- [20200212]使用DBMS_SHARED_POOL.MARKHOT標識熱物件.txt物件
- 使用DBMS_SHARED_POOL包將物件固定到共享池物件
- locust 使用的疑問
- [20210208][20200426]檢視shared latch gets的變化.txt
- [20190415]關於shared latch(共享栓鎖).txt
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與sql的計算2.txtSQL
- [20200211]使用DBMS_SHARED_POOL.MARKHOT與sql_id的計算.txtSQL
- [20190102]DBMS_SHARED_POOL.MARKHOT與表.txt
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與sql語句3.txtSQL
- [20200213]使用DBMS_SHARED_POOL.MARKHOT標識熱物件2.txt物件
- [20200211]使用DBMS_SHARED_POOL.MARKHOT與sql語句2.txtSQL
- [20201117]使用DBMS_SHARED_POOL.MARKHOT與sql語句5.txtSQL
- [20201117]使用DBMS_SHARED_POOL.MARKHOT與sql語句6.txtSQL
- [20200217]使用snapper探究DBMS_SHARED_POOL.MARKHOT標識熱物件的等待事件.txtAPP物件事件
- [20190416]完善shared latch測試指令碼2.txt指令碼
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與檢視v$open_cursor.txt