[20190505]關於latch 一些統計信息.txt

来源:https://www.cnblogs.com/lfree/archive/2019/05/05/10812021.html
-Advertisement-
Play Games

[20190505]關於latch 一些統計信息.txt--//我在兩篇文章,提到一些latch的統計信息.鏈接如下:http://blog.itpub.net/267265/viewspace-2642329/ =>[20190423]簡單測試latch nowilling等待模式.txthttp ...


[20190505]關於latch 一些統計信息.txt

--//我在兩篇文章,提到一些latch的統計信息.鏈接如下:
http://blog.itpub.net/267265/viewspace-2642329/ =>[20190423]簡單測試latch nowilling等待模式.txt
http://blog.itpub.net/267265/viewspace-2641549/ =>[20190416]查看shared latch gets的變化.txt

--//我提到過以前我對這些統計是非常混亂的,到底什麼情況是immediate_gets,什麼情況下SPIN_GETS,sleep會增加.
--//我還是通過測試說明,一個測試勝過一大堆文字說明...

1.環境:
SCOTT@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

>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        151          0          0              0                0             0                   0          0          0

--//我在鏈接http://blog.itpub.net/267265/viewspace-2642329/提到nowilling等待模式的情況,IMMEDIATE_GETS和IMMEDIATE_GETS的變化.不再論述.
--//如下測試僅僅關註SPIN_GETS,MISSES,SLEEPS的變化.

2.測試:
$ cat aa.sql
select sysdate,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 name='test excl. parent l0';
host sleep 1
--//註意是test excl. parent l0 後面的不是10是l0.一直以為是10。看來要一副好眼力.

$ cat y1.sh
#! /bin/bash
zdate=$(date '+%Y%m%d%H%M%S')
echo $zdate
source peek.sh 'test excl. parent l0' 20 | timestamp.pl > /tmp/peekx_${zdate}.txt &
seq 20 | xargs -I{} echo -e 'sqlplus -s -l / as sysdba <<< @latch_free\nsleep 1'  | bash > /tmp/latch_free_${zdate}.txt &
sqlplus -s -l / as sysdba <<EOF > /tmp/latch_sum_${zdate}.txt &
$(seq 20 | xargs -I {} echo @aa)
EOF

# 參數如下: @ exclusive_latch.txt latch_name willing why where sleep_num
sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 1 2 6" > /dev/null &
sleep 2
sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 3 4 6" > /dev/null &
sleep 10.2
sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 5 6 6" > /dev/null &
wait

$ cat exclusive_latch.txt
/* 參數如下: @ exclusive_latch.txt latch_name willing why where sleep_num */
--//connect / as sysdba
col laddr new_value laddr
SELECT addr laddr FROM v$latch_parent WHERE NAME='&&1';
oradebug setmypid
oradebug call kslgetl 0x&laddr &&2 &&3 &&4
host sleep &&5
oradebug call kslfre 0x&laddr
--//exit

3.執行:
SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                 LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- -------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-04-30 12:13:39 00000000600098D8 test excl. parent l0      0          4         17         12         12              0                0             0                   0          0   95671068

 $ . y1.sh
20190430121417
[4]-  Done                    sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 1 2 6" > /dev/null
[5]+  Done                    sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 3 4 6" > /dev/null
[1]   Done                    source peek.sh 'test excl. parent l0' 20 | timestamp.pl > /tmp/peekx_${zdate}.txt
[4]+  Done                    sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 5 6 6" > /dev/null
[2]-  Done                    seq 20 | xargs -I{} echo -e 'sqlplus -s -l / as sysdba <<< @latch_free\nsleep 1' | bash > /tmp/latch_free_${zdate}.txt
[3]+  Done                    sqlplus -s -l / as sysdba  > /tmp/latch_sum_${zdate}.txt <<EOF
$(seq 20 | xargs -I {} echo @aa)
EOF

$ grep "00000000600098D8" /tmp/latch_sum_20190430121417.txt
--//行頭是我添加上的。
SYSDATE             ADDR             NAME                 LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- -------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-04-30 12:14:18 00000000600098D8 test excl. parent l0      0          4         18         12         12              0                0             0                   0          0   95671068
2019-04-30 12:14:19 00000000600098D8 test excl. parent l0      0          4         18         12         12              0                0             0                   0          0   95671068
2019-04-30 12:14:20 00000000600098D8 test excl. parent l0      0          4         18         12         12              0                0             0                   0          0   95671068
2019-04-30 12:14:21 00000000600098D8 test excl. parent l0      0          4         18         12         12              0                0             0                   0          0   95671068
2019-04-30 12:14:22 00000000600098D8 test excl. parent l0      0          4         18         12         12              0                0             0                   0          0   95671068
2019-04-30 12:14:23 00000000600098D8 test excl. parent l0      0          4         18         12         12              0                0             0                   0          0   95671068
--//過了6秒。gets數量增加1。MISSES,SLEEPS數量不變。
2019-04-30 12:14:24 00000000600098D8 test excl. parent l0      0          4         19         13         13              0                0             0                   0          0   99676819
--//7秒後,第2個session請求獲得latch(實際上等了4秒),統計更新gets增加1(也就是在獲得latch時統計信息才更新).因為這次沒有馬上獲取成功。
--//MISSES,SLEEPS數量增加1。
2019-04-30 12:14:25 00000000600098D8 test excl. parent l0      0          4         19         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:26 00000000600098D8 test excl. parent l0      0          4         19         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:27 00000000600098D8 test excl. parent l0      0          4         19         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:28 00000000600098D8 test excl. parent l0      0          4         19         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:29 00000000600098D8 test excl. parent l0      0          4         19         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:30 00000000600098D8 test excl. parent l0      0          4         19         13         13              0                0             0                   0          0   99676819
--//第3個session 沒有阻塞,僅僅gets增加1。
2019-04-30 12:14:31 00000000600098D8 test excl. parent l0      0          4         20         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:32 00000000600098D8 test excl. parent l0      0          4         20         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:33 00000000600098D8 test excl. parent l0      0          4         20         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:34 00000000600098D8 test excl. parent l0      0          4         20         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:35 00000000600098D8 test excl. parent l0      0          4         20         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:36 00000000600098D8 test excl. parent l0      0          4         20         13         13              0                0             0                   0          0   99676819
2019-04-30 12:14:37 00000000600098D8 test excl. parent l0      0          4         20         13         13              0                0             0                   0          0   99676819

SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                  LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- --------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-04-30 12:16:02 00000000600098D8 test excl. parent l0       0          4         20         13         13              0                0             0                   0          0   99676819

--//最終gets增加3次,MISSES增加1次,SLEEPS增加1次.你可能發現一個現象spin_gets並沒有變化。
--//我前面測試已經說明,latch spin方式發生了變化,僅僅spin 10*_spin_count(對於exclusive latch),_spin_count(對於shared latch).
--//然後在申請不成功的情況下系統調用semop休眠,等待喚醒。這樣方式消耗CPU資源很少。

--//那麼什麼情況下spin_gets下會增加呢?是在spin過程中獲得latch嗎?如何測試呢?

3.測試spin_gets變化的情況:
--//我以前測試_mutex_spin_count參數時255,65535時,2個semtimedop間隔大約0.001秒。
--//0.0120157-0.0110002 = .0010155

$ cat y2.sh
#! /bin/bash
zdate=$(date '+%Y%m%d%H%M%S')
echo $zdate
source peek.sh 'test excl. parent l0' 6 | timestamp.pl > /tmp/peekx_${zdate}.txt &
seq 20 | xargs -I{} echo -e 'sqlplus -s -l / as sysdba <<< @latch_free\nsleep 1'  | bash > /tmp/latch_free_${zdate}.txt &
sqlplus -s -l / as sysdba <<EOF > /tmp/latch_sum_${zdate}.txt &
$(seq 20 | xargs -I {} echo @aa)
EOF

# 參數如下: @ exclusive_latch.txt latch_name willing why where sleep_num
sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 1 2 2" > /dev/null &
sleep $1
sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 3 4 2" > /dev/null &
wait

--//$1=1.999,不行!!腳本控制太困難使用手工測試看看.

4.手工測試更容易一下。
--//session 1:
SYS@book> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
       295          3 43362                    DEDICATED 19499       21          2 alter system kill session '295,3' immediate;

SYS@book> @ exclusive_latch.txt 'test excl. parent l0' 1 1 2 100000
LADDR
----------------
00000000600098D8

Statement processed.
Function returned 1


--//session 2:
SYS@book> @ spid

       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
        58         21 20098                    DEDICATED 20099       28          6 alter system kill session '58,21' immediate;

--//記下spid=20099
SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-05-05 09:37:53 00000000600098D8 test excl. parent l0                              0          4          9          3          3              0                0             0                   0          0      46203


--//window 3:
$ gdb -p 20099
(gdb) break kslges
Breakpoint 1 at 0x93f9b74

--//參考:http://blog.itpub.net/267265/viewspace-2641872/ =>[20190418]exclusive latch spin count.txt
(gdb) bt 6
#0  0x00000037990d6407 in semop () from /lib64/libc.so.6
#1  0x0000000009809c0f in sskgpwwait ()
#2  0x00000000098089ce in skgpwwait ()
#3  0x00000000093f9fe1 in kslges ()
#4  0x00000000093f997a in kslgetl ()
#5  0x0000000007d7402e in skdxcall ()
(More stack frames follow...)
--//如果停在kslges這裡,進入spin階段。
(gdb) disassemble kslges
--//反彙編看看.
...
0x00000000093f9ddc <kslges+620>:        xor    %esi,%esi
0x00000000093f9dde <kslges+622>:        mov    %esi,-0xd8(%rbp)
0x00000000093f9de4 <kslges+628>:        mov    %sil,-0xa6(%rbp)
0x00000000093f9deb <kslges+635>:        mov    0x0(%r13),%rdi
0x00000000093f9def <kslges+639>:        test   %rdi,%rdi
0x00000000093f9df2 <kslges+642>:        je     0x93fa6c0 <kslges+2896>
0x00000000093f9df8 <kslges+648>:        add    $0xffffffffffffffff,%ecx
0x00000000093f9dfb <kslges+651>:        add    $0xffffffffffffffff,%eax
0x00000000093f9dfe <kslges+654>:        jne    0x93f9ddc <kslges+620>
...
--//再次說明我不懂彙編,不過可以猜測:
--//%r13對應地址600098D8的內容賦值給%rdi,實際賦值等於session 1的pid(session 1持有該latch)。
--//也就是oradebug peek 0x600098D8 4 看到的內容。
--//如果不等(說明該latch已經釋放),執行0x00000000093f9df2 <kslges+642>: je 0x93fa6c0 <kslges+2896>,
--//跳轉0x93fa6c0地址執行,跳出spin的迴圈體。
--//繼續:
--//session 2:
SYS@book> @ exclusive_latch.txt 'test excl. parent l0' 1 3 4 2
--//掛起!!

--//window 3:
(gdb) c
Continuing.
Breakpoint 1, 0x00000000093f9b74 in kslges ()

(gdb) ni 1000
0x00000000093f9dfb in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dc0   19904
rcx            0x4dbe   19902
rip            0x93f9dfb        0x93f9dfb <kslges+651>
r13            0x600098d8       1610651864
rdi            0x15     21
--//rdi記錄的持有latch的pid號.看session 1的@spid輸出.

--//session 3:
SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-05-05 09:41:23 00000000600098D8 test excl. parent l0                              0          4          9          3          3              0                0             0                   0          0      46203

--//session 1:
--//按ctrl+c中斷sleep執行,釋放latch.
SYS@book> @ exclusive_latch.txt 'test excl. parent l0' 1 1 2 100000
LADDR
----------------
00000000600098D8

Statement processed.
Function returned 1

Function returned 0

SYS@book> oradebug peek 0x00000000600098D8 8
[0600098D8, 0600098E0) = 00000000 00000000
--//已經為00000000 00000000

--//window 3:
--//單步執行的情況:
(gdb) ni
0x00000000093f9dfe in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93f9dfe        0x93f9dfe <kslges+654>
r13            0x600098d8       1610651864
rdi            0x15     21
(gdb) ni
0x00000000093f9ddc in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93f9ddc        0x93f9ddc <kslges+620>
r13            0x600098d8       1610651864
rdi            0x15     21
(gdb) ni
0x00000000093f9dde in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93f9dde        0x93f9dde <kslges+622>
r13            0x600098d8       1610651864
rdi            0x15     21
(gdb) ni
0x00000000093f9de4 in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93f9de4        0x93f9de4 <kslges+628>
r13            0x600098d8       1610651864
rdi            0x15     21
(gdb) ni
0x00000000093f9deb in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93f9deb        0x93f9deb <kslges+635>
r13            0x600098d8       1610651864
rdi            0x15     21
(gdb) ni
0x00000000093f9def in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93f9def        0x93f9def <kslges+639>
r13            0x600098d8       1610651864
rdi            0x0      0
--//rdi現在是0了.

(gdb) ni
0x00000000093f9df2 in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93f9df2        0x93f9df2 <kslges+642>
r13            0x600098d8       1610651864
rdi            0x0      0
(gdb) ni
0x00000000093fa6c0 in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93fa6c0        0x93fa6c0 <kslges+2896>
r13            0x600098d8       1610651864
rdi            0x0      0
(gdb) ni
0x00000000093fa6c2 in kslges ()
(gdb) info register rax rcx rip r13 rdi
rax            0x4dbf   19903
rcx            0x4dbe   19902
rip            0x93fa6c2        0x93fa6c2 <kslges+2898>
r13            0x600098d8       1610651864
rdi            0x0      0
--//現在已經調出迴圈體.

--//session 3:
SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-05-05 09:52:20 00000000600098D8 test excl. parent l0                              0          4          9          3          3              0                0             0                   0          0      46203

--//window 3:
--//不再單步跟蹤了.
(gdb) c
Continuing.

--//session 3:
SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-05-05 09:53:29 00000000600098D8 test excl. parent l0                              0          4         10          4          3              0                0             0                   0          1      46203

--//註意看現在spin_gets增加了1,在獲取latch後,統計信息增加.MISSES增加1,sleeps不變,SPIN_GETS從0->1.
--//另外註意一個細節wait_time時間不變.也就是spin階段獲取latch,等待的時間不計入該視圖,僅僅在sleep階段wait_time才會增加.

--//重覆執行前面的y1.sh測試腳本對比就可以發現這個變化:
SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-05-05 09:58:38 00000000600098D8 test excl. parent l0                              0          4         10          4          3              0                0             0                   0          1      46203

 $ . y1.sh
20190505095849
[4]-  Done                    sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 1 2 6" > /dev/null
[5]+  Done                    sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 3 4 6" > /dev/null
[1]   Done                    source peek.sh 'test excl. parent l0' 20 | timestamp.pl > /tmp/peekx_${zdate}.txt
[4]+  Done                    sqlplus / as sysdba <<< "@ exclusive_latch.txt 'test excl. parent l0' 1 5 6 6" > /dev/null
[2]-  Done                    seq 20 | xargs -I{} echo -e 'sqlplus -s -l / as sysdba <<< @latch_free\nsleep 1' | bash > /tmp/latch_free_${zdate}.txt
[3]+  Done                    sqlplus -s -l / as sysdba  > /tmp/latch_sum_${zdate}.txt <<EOF
$(seq 20 | xargs -I {} echo @aa)
EOF

SYS@book> select sysdate,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 name='test excl. parent l0';
SYSDATE             ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-05-05 09:59:20 00000000600098D8 test excl. parent l0                              0          4         13          5          4              0                0             0                   0          1    4050042

--//gets增加3次,misses增加1次.sleeps增加1,spin_gets不變.wait_time,4050042-46203 = 4003839 ,這個單位是微秒.基本吻合.

5.總結:
--//可以通過測試瞭解latch統計信息的一些細節.
1.獲取latch後gets增加.統計信息也在這個時刻更新.
2.正常情況下MISSES=SLEEPS+SPIN_GETS.
3.我在一臺生產系統發現misses,sleeps+spin_gets 差別很小,當然如果運行好幾年還是有一定差別的(一些中斷異常退出會導致這樣的差別)

SYS@xxx> select STARTUP_TIME from v$instance ;
STARTUP_TIME
-------------------
2016-08-28 19:15:56

--//已經運行好幾年的一個中型資料庫的情況.

SELECT SYSDATE
      ,addr
      ,name
      ,level#
      ,latch#
      ,gets
      ,misses
      ,sleeps
      ,immediate_gets
      ,immediate_misses
      ,waiters_woken
      ,waits_holding_latch
      ,spin_gets
      ,wait_time
      ,misses-sleeps-spin_gets
       FROM v$latch_children
 WHERE name LIKE 'cache buffers chains';
..

select count(*) from (
SELECT SYSDATE
      ,addr
      ,name
      ,level#
      ,latch#
      ,gets
      ,misses
      ,sleeps
      ,immediate_gets
      ,immediate_misses
      ,waiters_woken
      ,waits_holding_latch
      ,spin_gets
      ,wait_time
      ,misses-sleeps-spin_gets
       FROM v$latch_children
 WHERE name LIKE 'cache buffers chains'
 and  misses-sleeps-spin_gets<>0);

  COUNT(*)
----------
        39

select count(*) from (
SELECT SYSDATE
      ,addr
      ,name
      ,level#
      ,latch#
      ,gets
      ,misses
      ,sleeps
      ,immediate_gets
      ,immediate_misses
      ,waiters_woken
      ,waits_holding_latch
      ,spin_gets
      ,wait_time
      ,misses-sleeps-spin_gets
       FROM v$latch_children
 WHERE name LIKE 'cache buffers chains'
 and  misses-sleeps-spin_gets=0);

  COUNT(*)
----------
      8153

--//39 + 8153 = 8192.另外我發現cbc latch 的統計中immediate_gets有數值,說明一些情況可以以nowilling模式獲取該拴鎖.一些細節還給探究看看.

6.補充測試:
--//測試process allocation latch的情況,我前面說了這個latch很特殊,預設屬於不同類
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

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 sysdate,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 name='process allocation';
SYSDATE             ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
------------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
2019-05-05 11:05:55 0000000060009F88 process allocation                                7&

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 數據定義語句 - 模式 · 創建: CREATE SCHEMA · 刪除: DROP SCHEMA - 表 · 創建: CREATE TABLE · 刪除: DROP TABLE · 修改: ALTER TABLE - 視圖 · 創建: CREATE VIEW · 刪除: DROP VIEW  ...
  • 存儲過程名稱為A,假設A返回一個ID EXEC @id = A 1031,1 在觸發器中像上面那樣調用,調試時發現@FolderHierarchyid的值為0 後面參考網上的方法,建了一個表,表結構和存儲過程的返回結果集結構一樣 declare @idtable table(ID int); ins ...
  • 遇到一個錯誤如下 System.Data.SqlClient.SqlException HResult=0x80131904 Message=伺服器主體 "用戶名" 無法在當前安全上下文下訪問資料庫 "資料庫名"。 Source=.Net SqlClient Data Provider StackT ...
  • 1.線性回歸模型線性回歸是統計學中最常用的演算法,當你想表示兩個變數間的數學關係時,就可以用線性回歸。當你使用它時,你首先假設輸出變數(相應變數、因變數、標簽)和預測變數(自變數、解釋變數、特征)之間存在的線性關係。(自變數是指:研究者主動操縱,而引起因變數發生變化的因素或條件,因此自變數被看作是因變 ...
  • 1.關係型資料庫的特點 基於關係代數理論: 缺點:表結構不直觀,實現複雜,速度慢 優點:健壯性高、社區龐大,在一些情況下人們發現健壯性,並不是要求那麼高,因而產生了十分流行的非關係型資料庫,如Redis,Memcached等。 2.資料庫表關係 下麵以Product表和Category進行舉例,Ca ...
  • 腳本如下: EXEC sp_addlinkedserver @server='XXX', --鏈接伺服器別名 @srvproduct='', @provider='SQLOLEDB', @datasrc='.' --要訪問的的資料庫所在的伺服器的ip GO EXEC sp_addlinkedsrvl ...
  • A/B測試本質上是一種線上實驗。本篇把業務中常見的概念與A/B測試專業術語進行對應,並額外介紹其他實用且重要的概念。 ...
  • Coprocessor簡介 (1)實現目的 (2)靈感來源 靈感來源於Bigtable的協處理器,包含如下特性: (3)提供介面 (4)應用範圍 Endpoint服務端實現 在傳統關係型資料庫裡面,可以隨時的對某列進行求和sum,但是目前HBase目前所提供的介面,直接求和是比較困難的,所以先編寫好 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...