ITPub博客

首页 > 数据库 > Oracle > [20190419]shared latch spin count 2.txt

[20190419]shared latch spin count 2.txt

原创 Oracle 作者:lfree 时间:2019-04-19 11:54:46 0 删除 编辑

[20190419]shared latch spin count 2.txt


--//上午测试shared latch XX模式的情况,链接:http://blog.itpub.net/267265/viewspace-2641902/

--//继续测试其它情况.

--//链接:http://andreynikolaev.wordpress.com/2011/01/14/spin-tales-part-2-shared-latches-in-oracle-9-2-11g/


                S mode get  X mode get

Held in S mode  Compatible  2*_spin_count

Held in X mode           0  2*_spin_count

Blocking mode            0  2*_spin_count



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


SYS@book> @ hide spin_count

NAME              DESCRIPTION                        DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE

----------------- ---------------------------------- ------------- ------------- ------------

_mutex_spin_count Mutex spin count                   TRUE          255           255

_spin_count       Amount to spin waiting for a latch TRUE          2000          2000


$ cat shared_latch.txt

/* 参数如下: @ latch.txt latch_name willing why where mode sleep_num */

--//connect / as sysdba

col laddr new_value laddr

col vmode  new_value vmode

select decode(lower('&&5'),'s',8,'x',16,'8',8,'16',16) vmode from dual ;

SELECT addr laddr FROM v$latch_parent WHERE NAME='&&1';

oradebug setmypid

oradebug call kslgetsl_w 0x&laddr &&2 &&3 &&4  &vmode

host sleep &&6

oradebug call kslfre 0x&laddr

--//exit

--//注:我前几天的测试脚本有connect / as sysdba,exit这两行,我为了调式方便,先注解这2行,避免反复退出进入会话.


2.测试1:

--//选择一个shared latch测试,我选择"test shared non-parent l0" latch测试:

SYS@book> select * from shared_latches where name='test shared non-parent l0';

VERSION    LATCH# NAME                      S

---------- ------ ------------------------- -

11.2.0.4.0      6 test shared non-parent l0 Y


2.测试一些细节不再列出,参考链接:http://blog.itpub.net/267265/viewspace-2641902/

--//测试XS模式的情况:

--//session 1:

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 1 2 x 100000


--//session 2:

SYS@book> @ spid

       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50

---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------

         1         11 31454                    DEDICATED 31455       24          5 alter system kill session '1,11' immediate;

--//记下spid=31455.

SYS@book> @shared_latch.txt "test shared non-parent l0" 1 3 4 s 1

--//注意session 申请S mode.

--//window 3:执行:


$ rlwrap gdb -p 31455 -x spin_s.gdb

Breakpoint 1 at 0x93f97a8

Breakpoint 2 at 0x93f9b74

Breakpoint 3 at 0x9808932

Breakpoint 4 at 0x9809840

Breakpoint 5 at 0x37990d6400

Breakpoint 6 at 0x93f9ddc

Breakpoint 7 at 0x93faa36

Breakpoint 8 at 0xa865ca

Breakpoint 9 at 0xa874fa

Breakpoint 10 at 0xa875be

(gdb) c

Continuing.

...

kslgetl 6010d860, 1, 2126093176, 3991

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:96, mode:16

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:95, mode:8

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:96, mode:16

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:95, mode:8

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:96, mode:16

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:95, mode:8

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:96, mode:16

ksl_get_shared_latch laddr:60009a18, willing:1, where:3, why:4, mode:8

kslgess 60009a18, 8, 0, 3

kslskgs 60009a18, 0, 1129096976, 1129097520

kslskgs 60009a18, 0, 1129096976, 1129097520

---Type <return> to continue, or q <return> to quit---

skgpwwait 1129096760, 202182304, -2044672536, 0

sskgpwwait 1129096760, 202182304, -2044672536, 0

semop 315588608, 1129096560, 1, -1

--//按ctrl+c出现如下:

kslskgs 60009a18, 0, 1129096976, 1129097520


--//可以看出X模式的情况,申请S mode,第2进程直接调用semop.根本不做spin操作.


3.测试2:

--//测试SX模式的情况:

--//session 1:

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 1 2 s 100000

--//session 持有S mode.

 

--//session 2:

SYS@book> @shared_latch.txt "test shared non-parent l0" 1 3 4 x 1

--//注意session 申请x mode.

--//window 3:执行:

$ rlwrap gdb -p 31455 -x spin_s.gdb

..

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:95, mode:8

ksl_get_shared_latch laddr:85f7f4c8, willing:1, where:-2043602896, why:96, mode:16

ksl_get_shared_latch laddr:60009a18, willing:1, where:3, why:4, mode:16

kslgess 60009a18, 16, 0, 3

kslskgs 60009a18, 0, 1129096976, 1129097520

 spin count loop: 2000 a875be

 spin count loop: 1999 a875be

 spin count loop: 1998 a875be

 spin count loop: 1997 a875be

 ...

 spin count loop: 3 a875be

 spin count loop: 2 a875be

 spin count loop: 1 a875be

kslskgs 60009a18, 0, 1129096976, 1129097520

 spin count loop: 1 a875be

skgpwwait 1129096760, 202182304, -2044672536, 0

sskgpwwait 1129096760, 202182304, -2044672536, 0

semop 315588608, 1129096560, 1, -1

--//按ctrl+c后.

kslskgs 60009a18, 0, 1129096976, 1129097520

 spin count loop: 2000 a875be

 

--//可以S模式的情况,申请X mode,第2进程spin_count=2000.


4.测试3:

--//Blocking mode,首先我对这个模式的理解不是非常清晰.

--//我的理解

A.当前X mode持有,不管S,X模式申请都会阻塞,再有进程申请的情况.

B.当前S mode持有,X模式申请,后续再有进程申请的情况.

--//也就是这个情况至少3个会话,我分别测试看看

--//session 1:

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 1 2 s 100000


--//session 2:

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 3 4 x 1


--//session 3:

--//spid=31572

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 5 6 s 1


--//gdb监测session 3进程:

$ rlwrap gdb -p 31572 -x spin_s.gdb

...

ksl_get_shared_latch laddr:85f7fa68, willing:1, where:-2042914736, why:95, mode:8

ksl_get_shared_latch laddr:85f7fa68, willing:1, where:-2042914736, why:96, mode:16

ksl_get_shared_latch laddr:60009a18, willing:1, where:5, why:6, mode:8

kslgess 60009a18, 8, 0, 5

kslskgs 60009a18, 0, -1923148048, -1923147504

kslskgs 60009a18, 0, -1923148048, -1923147504

skgpwwait -1923148264, 202182304, -2044655416, 0

sskgpwwait -1923148264, 202182304, -2044655416, 0

semop 315588608, -1923148464, 1, -1

kslskgs 60009a18, 0, -1923148048, -1923147504

--//申请S mode,没有spin.


--//session 1:

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 1 2 s 100000


--//session 2:

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 3 4 x 1


--//session 3:

--//spid=31572

SYS@book> @ shared_latch.txt "test shared non-parent l0" 1 5 6 x 1


--//gdb监测session 3进程:

$ rlwrap gdb -p 31572 -x spin_s.gdb

...

ksl_get_shared_latch laddr:85f7fa68, willing:1, where:-2042914736, why:96, mode:16

ksl_get_shared_latch laddr:60009a18, willing:1, where:5, why:6, mode:16

kslgess 60009a18, 16, 0, 5

kslskgs 60009a18, 0, -1923148048, -1923147504

 spin count loop: 2000 a875be

 spin count loop: 1999 a875be

 spin count loop: 1998 a875be

 spin count loop: 1997 a875be

 ...

 spin count loop: 1 a875be

kslskgs 60009a18, 0, -1923148048, -1923147504

 spin count loop: 1 a875be

skgpwwait -1923148264, 202182304, -2044655416, 0

sskgpwwait -1923148264, 202182304, -2044655416, 0

semop 315588608, -1923148464, 1, -1

kslskgs 60009a18, 0, -1923148048, -1923147504

 spin count loop: 2000 a875be

--//申请X mode,spin_count=2000.


--//XSS的情况:

ksl_get_shared_latch laddr:85f7fa68, willing:1, where:-2042914736, why:96, mode:16

ksl_get_shared_latch laddr:60009a18, willing:1, where:5, why:6, mode:8

kslgess 60009a18, 8, 0, 5

kslskgs 60009a18, 0, -1923148048, -1923147504

kslskgs 60009a18, 0, -1923148048, -1923147504

skgpwwait -1923148264, 202182304, -2044655416, 0

sskgpwwait -1923148264, 202182304, -2044655416, 0

semop 315588608, -1923148464, 1, -1

kslskgs 60009a18, 0, -1923148048, -1923147504


--//XSX的情况:

ksl_get_shared_latch laddr:85f7fa68, willing:1, where:-2042914736, why:96, mode:16

ksl_get_shared_latch laddr:60009a18, willing:1, where:5, why:6, mode:16

kslgess 60009a18, 16, 0, 5

kslskgs 60009a18, 0, -1923148048, -1923147504

 spin count loop: 2000 a875be

 spin count loop: 1999 a875be

 spin count loop: 1998 a875be

 spin count loop: 1997 a875be

 spin count loop: 1996 a875be

 spin count loop: 1995 a875be

...

sskgpwwait -1923148264, 202182304, -2044655416, 0

semop 315588608, -1923148464, 1, -1

kslskgs 60009a18, 0, -1923148048, -1923147504

 spin count loop: 2000 a875be

--//总之:阻塞申请X mode,spin_count=2000.S mode 直接调用semop休眠.


5.总结

--//画一个表格:

                S mode get  X mode get

Held in S mode  Compatible  _spin_count

Held in X mode           0  _spin_count

Blocking mode            0  _spin_count


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2641911/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2421
  • 访问量
    6191228