• [20190419]shared latch spin count 2.txt


    [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

  • 相关阅读:
    AX ERROR: Could not find my mock parent, most likely I am stale 不及格的程序员
    利用Segue在视图控制器间传值的问题 不及格的程序员
    Creating a Singleton Instance 不及格的程序员
    iPad 通知 UIKeyboardWillShowNotification 不会在keyBoard处在Undock状态下接到通知 不及格的程序员
    Why RootViewController's view is rotated Automatically by System when the app first loaded? 不及格的程序员
    如何弹出UIDatePicker最好 不及格的程序员
    jQuery开始做恶了 不及格的程序员
    what is the SEL,id and IMP,Class ,Method? 不及格的程序员
    Objectivec 字符串比较的陷井 不及格的程序员
    Unable to create any keyboard shortcuts after the iOS 6.1.3 update on iPad. 不及格的程序员
  • 原文地址:https://www.cnblogs.com/lfree/p/10735083.html
Copyright © 2020-2023  润新知