[20190417]隱含參數_SPIN_COUNT.txt--//在探究latch spin計數之前,先簡單探究_SPIN_COUNT.實際上oracle現在版本latch spin的數量不再是2000,而是記錄在--//x$ksllclass裡面.通過例子說明:1.環境:SYS@book> @ v ...
[20190417]隱含參數_SPIN_COUNT.txt
--//在探究latch spin計數之前,先簡單探究_SPIN_COUNT.實際上oracle現在版本latch spin的數量不再是2000,而是記錄在
--//x$ksllclass裡面.通過例子說明:
1.環境:
SYS@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
SYS@book> select * from x$ksllclass ;
ADDR INDX INST_ID SPIN YIELD WAITTIME SLEEP0 SLEEP1 SLEEP2 SLEEP3 SLEEP4 SLEEP5 SLEEP6 SLEEP7
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00000000861986C0 0 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861986EC 1 1 20000 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198718 2 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
0000000086198744 3 1 20000 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198770 4 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
000000008619879C 5 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987C8 6 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987F4 7 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
8 rows selected.
SYS@book> select CLASS_KSLLT,count(*) from x$kslltr group by CLASS_KSLLT;
CLASS_KSLLT COUNT(*)
----------- ----------
2 1
0 581
SYS@book> select CLASS_KSLLT,decode(CLASS_KSLLT,2,KSLLTNAM) name,count(*) from x$kslltr group by CLASS_KSLLT,decode(CLASS_KSLLT,2,KSLLTNAM);
CLASS_KSLLT NAME COUNT(*)
----------- ------------------ --------
0 581
2 process allocation 1
--//還可以看出僅僅1個latch屬於2類(latch name='process allocation').其它都是0類.實際上即使是0類,後面的SLEEP0-7不再使用.
--//可以發現預設全部SPIN=20000.
2.測試1:
SYS@book> alter system set "_spin_count"=200 scope=memory;
System altered.
--//實際上動態修改無效.重新登錄會話:
SYS@book> select * from x$ksllclass ;
ADDR INDX INST_ID SPIN YIELD WAITTIME SLEEP0 SLEEP1 SLEEP2 SLEEP3 SLEEP4 SLEEP5 SLEEP6 SLEEP7
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00000000861986C0 0 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861986EC 1 1 20000 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198718 2 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
0000000086198744 3 1 20000 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198770 4 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
000000008619879C 5 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987C8 6 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987F4 7 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
8 rows selected.
--//SPIN數量不變.實際上動態修改,對應exclusive latch無效.僅僅對shared latch有效,導致實際spin 數量等於_spin_count*2.(我當前沒有測試)
--//參考鏈接:http://andreynikolaev.wordpress.com/2011/01/14/spin-tales-part-2-shared-latches-in-oracle-9-2-11g/
3.測試2:
SYS@book> alter system set "_spin_count"=200 scope=spfile ;
System altered.
--//重啟資料庫觀察:
SYS@book> select * from x$ksllclass ;
ADDR INDX INST_ID SPIN YIELD WAITTIME SLEEP0 SLEEP1 SLEEP2 SLEEP3 SLEEP4 SLEEP5 SLEEP6 SLEEP7
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00000000861986C0 0 1 200 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861986EC 1 1 200 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198718 2 1 200 0 1 8000 8000 8000 8000 8000 8000 8000 8000
0000000086198744 3 1 200 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198770 4 1 200 0 1 8000 8000 8000 8000 8000 8000 8000 8000
000000008619879C 5 1 200 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987C8 6 1 200 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987F4 7 1 200 0 1 8000 8000 8000 8000 8000 8000 8000 8000
8 rows selected.
--//這樣更改才生效.
SYS@book> alter system reset "_spin_count";
System altered.
--//實際上可以但是設置_latch_class_N參數.
SYS@book> alter system set "_latch_class_0"=1000 scope=spfile;
System altered.
--//重啟資料庫觀察:
SYS@book> select * from x$ksllclass ;
ADDR INDX INST_ID SPIN YIELD WAITTIME SLEEP0 SLEEP1 SLEEP2 SLEEP3 SLEEP4 SLEEP5 SLEEP6 SLEEP7
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00000000861986C0 0 1 1000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861986EC 1 1 20000 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198718 2 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
0000000086198744 3 1 20000 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198770 4 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
000000008619879C 5 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987C8 6 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987F4 7 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
8 rows selected.
--//你甚至指定特定的latch採用特定的類.還可以修改後面的YIELD,WAITTIME,SLEEP0-SELLP7值.例子:
*._latch_classes='8:3'
*._latch_class_3='100 0 1 10000 20000 30000 40000 50000 60000 70000 80000'
SYS@book> select * from v$latchname where name='process allocation';
LATCH# NAME HASH
---------- ---------------------------------------- ----------
8 process allocation 2600548697
--//_latch_classes 裡面8 值LATCH#,後面3值類.可以指定多個,例子:
--//alter system set "_latch_classes"='46:3 103:3' scope=spfile;
--//還原:
SYS@book> alter system reset "_latch_class_0";
System altered.
4.加強記憶我找一個latch測試看看:
--//上午測試是process allocation,現在測試看看類0的修改是否有效.
select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_parent where lower(name) like '%'||lower('test excl. parent l0')||'%'
ADDR NAME LEVEL# LATCH# GETS MISSES SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH SPIN_GETS WAIT_TIME
---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
00000000600098D8 test excl. parent l0 0 4 7 0 0 0 0 0 0 0 0
--//LATCH#=4.
SYS@book> create pfile='/tmp/@.ora' from spfile ;
File created.
--//修改/tmp/book.ora 加入:
*._latch_classes='4:3'
*._latch_class_3='100 0 1 10000 20000 30000 40000 50000 60000 70000 50000'
SYS@book> startup pfile=/tmp/@.ora
ORACLE instance started.
Total System Global Area 643084288 bytes
Fixed Size 2255872 bytes
Variable Size 205521920 bytes
Database Buffers 427819008 bytes
Redo Buffers 7487488 bytes
Database mounted.
Database opened.
SYS@book> select * from x$ksllclass ;
ADDR INDX INST_ID SPIN YIELD WAITTIME SLEEP0 SLEEP1 SLEEP2 SLEEP3 SLEEP4 SLEEP5 SLEEP6 SLEEP7
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00000000861986C0 0 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861986EC 1 1 20000 0 1 1000 1000 1000 1000 1000 1000 1000 1000
0000000086198718 2 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
0000000086198744 3 1 100 0 1 10000 20000 30000 40000 50000 60000 70000 50000
0000000086198770 4 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
000000008619879C 5 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987C8 6 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
00000000861987F4 7 1 20000 0 1 8000 8000 8000 8000 8000 8000 8000 8000
8 rows selected.
SYS@book> select CLASS_KSLLT,decode(CLASS_KSLLT,2,KSLLTNAM,3,KSLLTNAM) name,count(*) from x$kslltr group by CLASS_KSLLT,decode(CLASS_KSLLT,2,KSLLTNAM,3,KSLLTNAM);
CLASS_KSLLT NAME COUNT(*)
----------- ---------------------------------------- ----------
0 580
3 test excl. parent l0 1
2 process allocation 1
--//latch_name='test excl. parent l0',CLASS_KSLLT=3.
$ cat p4.sh
#! /bin/bash
vdate=$(date '+%H%M%S')
echo $vdate
source peek.sh "$1" 20 | timestamp.pl >| /tmp/peekx_${vdate}.txt &
sqlplus -s -l / as sysdba <<EOF >| /tmp/latch_free_${vdate}.txt &
$(seq 20 | xargs -I {} echo -e '@latch_free \n host sleep 1')
EOF
sleep 1
# 參數如下: @ exclusive_latch.txt latch_name willing why where sleep_num
sqlplus /nolog @ exclusive_latch.txt "$1" 1 4 5 10 > /dev/null &
sleep 2
sqlplus /nolog @ exclusive_latch.txt "$1" 1 6 7 10 > /dev/null &
p=$!
strace -ftrT -p $p -o /tmp/pp_${vdate}.txt > /dev/null &
wait
$ . p4.sh 'test excl. parent l0'
172843
Process 29626 attached - interrupt to quit
Process 29628 attached
Process 29645 attached
Process 29626 suspended
[1] Done source peek.sh "$1" 20 | timestamp.pl >|/tmp/peekx_${vdate}.txt
[3] Done sqlplus /nolog @ exclusive_latch.txt "$1" 1 4 5 10 > /dev/null
[2] Done sqlplus -s -l / as sysdba >|/tmp/latch_free_${vdate}.txt <<EOF
$(seq 20 | xargs -I {} echo -e '@latch_free \n host sleep 1')
EOF
Process 29626 resumed
Process 29645 detached
Process 29626 detached
[4]- Done sqlplus /nolog @ exclusive_latch.txt "$1" 1 6 7 10 > /dev/null
Process 29628 detached
[5]+ Done strace -ftrT -p $p -o /tmp/pp_${vdate}.txt > /dev/null
--// /tmp/pp_172843.txt
29628 0.000081 write(10, "\n", 1) = 1 <0.000026>
29628 0.000149 select(0, [], [], [], {0, 10000}) = 0 (Timeout) <0.010082>
29628 0.010161 select(0, [], [], [], {0, 20000}) = 0 (Timeout) <0.020110>
29628 0.020195 select(0, [], [], [], {0, 30000}) = 0 (Timeout) <0.030115>
29628 0.030207 select(0, [], [], [], {0, 40000}) = 0 (Timeout) <0.040118>
29628 0.040216 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050120>
29628 0.050209 select(0, [], [], [], {0, 60000}) = 0 (Timeout) <0.060129>
29628 0.060218 select(0, [], [], [], {0, 70000}) = 0 (Timeout) <0.070140>
29628 0.070230 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050124>
29628 0.050213 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050118>
29628 0.050207 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050124>
29628 0.050216 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050134>
29628 0.050224 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050117>
29628 0.050207 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050120>
29628 0.050209 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050117>
29628 0.050206 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050120>
29628 0.050211 select(0, [], [], [], {0, 50000}) = 0 (Timeout) <0.050125>
--//可以發現一樣有效.
$ awk '/select/ {print $NF}' /tmp/pp_172843.txt | tr -d '<>' | xargs | sed 's/ /+/g' | bc -l
7.899805
--//接近8秒.spin占用時間不多.