[20241115]大量软解析相关等待事件分析(21c).txt

[20241115]大量软解析相关等待事件分析(21c).txt

--//测试看看应用程序大量软解析导致的相关等待事件,主要原因上午测试library cache bucket的muext值的前4个字节,在软解析时会
--//出现挂起的情况,其他地方也应该出现类似情况,测试看看主要出现在那里等待事件。

1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.建立测试环境:
drop table t purge ;
create table t as select rownum id ,'test' pad from dual connect by level<=2e5;
create unique index pk_t on t(id);
exec dbms_stats.gather_table_stats(user, 't', method_opt=>'for all columns size 1');

$ cat m4.txt
alter session set session_cached_cursors=0;
DECLARE
   v_pad   VARCHAR2 (200);
   l_count PLS_INTEGER;
BEGIN
    FOR i IN 1..&&1
    LOOP
       EXECUTE IMMEDIATE 'select count(*) from t where id = :j ' INTO l_count USING i;
    END LOOP;
END;
/
--//设置session_cached_cursors=0;,这样每次执行都是软解析。

3.测试:
$ zzdate;seq 20 | xargs -P 20 -IQ sqlplus -s -l scott/book@book01p @m4.txt 5e5 > /dev/null;zzdate
trunc(sysdate)+15/24+19/1440+19/86400
trunc(sysdate)+15/24+21/1440+03/86400
--//等待测试完成。需要2*60+3-19 = 104秒。

SYS@book> @ ashtop event,p1raw,p1,p3raw 1=1 trunc(sysdate)+15/24+19/1440+19/86400 trunc(sysdate)+15/24+21/1440+03/86400
    Total                                                                                                                                        Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                         P1RAW                     P1 P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ----------------------------- ----------------- ---------- ----------------- ------------------- ------------------- ---------- -------- -----------
      765     7.4   37% |                                                 1607470161                   2024-11-15 15:19:20 2024-11-15 15:21:02        282      102         377
      527     5.1   26% | library cache: mutex X        000000005FD00C51  1607470161 5FD00C5100000055  2024-11-15 15:19:21 2024-11-15 15:21:02          1      100         100
      246     2.4   12% | library cache: mutex X        000000005FD00C51  1607470161 5FD00C510000006A  2024-11-15 15:19:20 2024-11-15 15:21:02         20       92          20
      134     1.3    7% | library cache: mutex X        000000005FD00C51  1607470161 5FD00C5100000039  2024-11-15 15:19:21 2024-11-15 15:21:02          1       80          80
      104     1.0    5% |                                                       3153                   2024-11-15 15:19:20 2024-11-15 15:21:02         46       44          76
       99     1.0    5% | library cache: bucket mutex X 0000000000000C51        3153 000000000000003E  2024-11-15 15:19:23 2024-11-15 15:20:58         20       39          20
       54      .5    3% | cursor: pin S                 000000005FD00C51  1607470161 0000000500000000  2024-11-15 15:19:23 2024-11-15 15:21:01          1       22          22
       30      .3    1% | cursor: pin S                 000000005FD00C51  1607470161 0000000900000000  2024-11-15 15:19:23 2024-11-15 15:20:57          1       14          14
       24      .2    1% |                                                          0                   2024-11-15 15:19:34 2024-11-15 15:20:59         14       14          22
       19      .2    1% | cursor: mutex S               000000005FD00C51  1607470161 0000000100000000  2024-11-15 15:19:24 2024-11-15 15:19:55          1        3           3
       18      .2    1% | cursor: mutex S               0000000000000000           0 0000000200000000  2024-11-15 15:19:26 2024-11-15 15:21:00          1        8           8
       11      .1    1% |                                                         12                   2024-11-15 15:19:20 2024-11-15 15:19:59          7       11          11
        3      .0    0% |                                                          1                   2024-11-15 15:20:15 2024-11-15 15:20:18          1        3           3
        3      .0    0% |                                                 1413697536                   2024-11-15 15:19:20 2024-11-15 15:19:20          3        1           3
        2      .0    0% | db file sequential read       0000000000000001           1 0000000000000001  2024-11-15 15:20:13 2024-11-15 15:20:17          1        2           2
        2      .0    0% |                                                     131072                   2024-11-15 15:19:19 2024-11-15 15:19:19          1        1           1
        1      .0    0% |                                                          3                   2024-11-15 15:20:12 2024-11-15 15:20:12          1        1           1
        1      .0    0% |                                                         20                   2024-11-15 15:19:44 2024-11-15 15:19:44          1        1           1
        1      .0    0% |                                                        100                   2024-11-15 15:20:29 2024-11-15 15:20:29          1        1           1
        1      .0    0% |                                                     262144                   2024-11-15 15:20:14 2024-11-15 15:20:14          1        1           1
20 rows selected.
--//在这样的情况下library cache:mutex X,library cache: bucket mutex X成为主要等待事件,cursor: pin S,cursor: mutex S成为次要等待事件。
--//11g下没有library cache: bucket mutex X等待事件,归类在library cache: mutex X,另外注意21c下P3RAW值前面8位对应hash_value.
--//而11g下前面8位位00000000.
--//另外补充说明软软解析看到主要是cursor: pin S。

4.分析library cache: bucket mutex X等待事件:
--//1607470161%2^17 = 3153等于KGL_BUCKET,P3=0x3e=62.
SYS@book> @ ashtop event,p1,p2raw,p3raw "event='library cache: bucket mutex X'" trunc(sysdate)+15/24+19/1440+19/86400 trunc(sysdate)+15/24+21/1440+03/86400
    Total                                                                                                                                   Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                            P1 P2RAW             P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ----------------------------- ----- ----------------- ----------------- ------------------- ------------------- ---------- -------- -----------
       18      .2   18% | library cache: bucket mutex X  3153 0000019B00000000  000000000000003E  2024-11-15 15:19:53 2024-11-15 15:20:51         15        6          15
       14      .1   14% | library cache: bucket mutex X  3153 0000019500000000  000000000000003E  2024-11-15 15:19:27 2024-11-15 15:19:32         13        2          13
       11      .1   11% | library cache: bucket mutex X  3153 0000001A00000000  000000000000003E  2024-11-15 15:19:28 2024-11-15 15:20:46         10        6          10
        9      .1    9% | library cache: bucket mutex X  3153 0000010E00000000  000000000000003E  2024-11-15 15:19:24 2024-11-15 15:20:24          8        2           8
        7      .1    7% | library cache: bucket mutex X  3153 0000009A00000000  000000000000003E  2024-11-15 15:19:27 2024-11-15 15:20:18          7        2           7
        6      .1    6% | library cache: bucket mutex X  3153 0000001C00000000  000000000000003E  2024-11-15 15:20:12 2024-11-15 15:20:15          5        2           5
        5      .0    5% | library cache: bucket mutex X  3153 0000019000000000  000000000000003E  2024-11-15 15:19:27 2024-11-15 15:20:58          5        3           5
        3      .0    3% | library cache: bucket mutex X  3153 0000000000000000  000000000000003E  2024-11-15 15:19:51 2024-11-15 15:20:40          3        3           3
        3      .0    3% | library cache: bucket mutex X  3153 0000001200000000  000000000000003E  2024-11-15 15:19:38 2024-11-15 15:20:00          2        2           2
        3      .0    3% | library cache: bucket mutex X  3153 000000A200000000  000000000000003E  2024-11-15 15:20:02 2024-11-15 15:20:52          3        3           3
        3      .0    3% | library cache: bucket mutex X  3153 0000011500000000  000000000000003E  2024-11-15 15:20:20 2024-11-15 15:20:40          2        3           2
        3      .0    3% | library cache: bucket mutex X  3153 0000018D00000000  000000000000003E  2024-11-15 15:19:28 2024-11-15 15:19:45          3        2           3
        2      .0    2% | library cache: bucket mutex X  3153 0000001500000000  000000000000003E  2024-11-15 15:19:41 2024-11-15 15:20:23          2        2           2
        2      .0    2% | library cache: bucket mutex X  3153 0000002300000000  000000000000003E  2024-11-15 15:19:23 2024-11-15 15:20:19          2        2           2
        2      .0    2% | library cache: bucket mutex X  3153 0000009700000000  000000000000003E  2024-11-15 15:19:24 2024-11-15 15:19:53          2        2           2
        2      .0    2% | library cache: bucket mutex X  3153 0000009900000000  000000000000003E  2024-11-15 15:19:34 2024-11-15 15:19:43          2        2           2
        2      .0    2% | library cache: bucket mutex X  3153 0000009B00000000  000000000000003E  2024-11-15 15:20:10 2024-11-15 15:20:42          2        2           2
        2      .0    2% | library cache: bucket mutex X  3153 0000019A00000000  000000000000003E  2024-11-15 15:20:03 2024-11-15 15:20:42          2        2           2
        1      .0    1% | library cache: bucket mutex X  3153 0000001B00000000  000000000000003E  2024-11-15 15:19:38 2024-11-15 15:19:38          1        1           1
        1      .0    1% | library cache: bucket mutex X  3153 0000011200000000  000000000000003E  2024-11-15 15:19:38 2024-11-15 15:19:38          1        1           1
20 rows selected.
--//P2raw对应阻塞的sid。
--//P1=3153对应buckect number。 1607470161%2^17 = 3153

SYS@book> @ mutexprofz idn,hash,val,loc,maddr "ts>=trunc(sysdate)+15/24+19/1440+19/86400 and ts<=trunc(sysdate)+15/24+21/1440+03/86400 and idn=3153"
-- MutexProf by Tanel Poder (http://www.tanelpoder.com)
-- Showing profile of top 20 sleeps...
-- column info : id idn hash hash_value=>hash_value ts=>sleep_timestamp
--               req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr
SUM_SLEEPS      GETS_DIFF MUTEX_TYPE             IDN       HASH VAL              GET_LOCATION                      mutex_addr           OBJECT_NAME
---------- -------------- --------------- ---------- ---------- ---------------- --------------------------------- -------------------- -----------------
         7         186297 Library Cache         3153            0000009700000000 kglhdgn1  62                      0000000073BFB440     (name not found)
         4                Library Cache         3153            0000001500000000 kglhdgn1  62                      0000000073BFB440     (name not found)
         2                Library Cache         3153            000000A200000000 kglhdgn1  62                      0000000073BFB440     (name not found)
         2                Library Cache         3153            0000001B00000000 kglhdgn1  62                      0000000073BFB440     (name not found)
         2          86887 Library Cache         3153            0000009900000000 kglhdgn1  62                      0000000073BFB440     (name not found)
         1                Library Cache         3153            0000019A00000000 kglhdgn1  62                      0000000073BFB440     (name not found)
         1                Library Cache         3153            00               kglhdgn1  62                      0000000073BFB440     (name not found)
         1                Library Cache         3153            0000001A00000000 kglhdgn1  62                      0000000073BFB440     (name not found)
8 rows selected.
--//理论P2RAW=0000019B00000000应该很多,实际上很少,因为查询x$mutex_sleep_history记录不再sleeps累积,而是记录流水账。
--//mutex_addr=0000000073BFB440,就是library cache bucket地址。

--//0x0000000073BFB440-0x10 = 0x73bfb430
SYS@book> @ opeek 73BFB430 48 0
[073BFB430, 073BFB460) = 684A3740 00000000 684A3740 00000000 00000000 00000000 009896A9 000036F1 00000C51 00000000 61858120 00000000
--//0x00000C51 = 3153, hash桶号。

SYS@book> @ sharepool/shp4  '' 1607470161
HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address   0000000065CDA030 00000000684A3740 select count(*) from t where id = :j              0          0          0 00000000619B3AF0 00000000684A2F68       8128      16176       3318     27622      27622 1607470161 3qa9k69gx032j          0
parent handle address  00000000684A3740 00000000684A3740 select count(*) from t where id = :j              0          0          0 0000000061ABB960 00                     4064          0          0      4064       4064 1607470161 3qa9k69gx032j      65535
--//前面两个8字节就是该sql语句的父游标句柄地址。

5.分析library cache: mutex X等待事件:
SYS@book> @ ashtop event,p1,p2raw,p3raw "event='library cache: mutex X'" trunc(sysdate)+15/24+19/1440+19/86400 trunc(sysdate)+15/24+21/1440+03/86400
    Total                                                                                                                                 Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                          P1 P2RAW             P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ---------------------- ---------- ----------------- ----------------- ------------------- ------------------- ---------- -------- -----------
       54      .5    6% | library cache: mutex X 1607470161 0000000000000000  5FD00C5100000055  2024-11-15 15:19:22 2024-11-15 15:21:01          1       46          46
       40      .4    4% | library cache: mutex X 1607470161 0000010F00000000  5FD00C5100000055  2024-11-15 15:19:21 2024-11-15 15:20:56          1       14          14
       36      .3    4% | library cache: mutex X 1607470161 0000001A00000000  5FD00C5100000055  2024-11-15 15:19:23 2024-11-15 15:20:54          1       16          16
       34      .3    4% | library cache: mutex X 1607470161 0000000000000000  5FD00C5100000039  2024-11-15 15:19:24 2024-11-15 15:20:55          1       28          28
       30      .3    3% | library cache: mutex X 1607470161 0000002300000000  5FD00C5100000055  2024-11-15 15:19:28 2024-11-15 15:21:02          1       14          14
       30      .3    3% | library cache: mutex X 1607470161 0000011200000000  5FD00C5100000055  2024-11-15 15:19:25 2024-11-15 15:20:55          1       16          16
       29      .3    3% | library cache: mutex X 1607470161 0000018D00000000  5FD00C5100000055  2024-11-15 15:19:22 2024-11-15 15:20:54          1       17          17
       26      .3    3% | library cache: mutex X 1607470161 0000001B00000000  5FD00C5100000055  2024-11-15 15:19:35 2024-11-15 15:20:28          1        7           7
       25      .2    3% | library cache: mutex X 1607470161 0000011500000000  5FD00C5100000055  2024-11-15 15:19:49 2024-11-15 15:20:40          1        8           8
       25      .2    3% | library cache: mutex X 1607470161 0000019000000000  5FD00C5100000055  2024-11-15 15:19:22 2024-11-15 15:20:59          1       16          16
       24      .2    3% | library cache: mutex X 1607470161 0000001500000000  5FD00C5100000055  2024-11-15 15:19:31 2024-11-15 15:20:56          1       13          13
       24      .2    3% | library cache: mutex X 1607470161 0000019A00000000  5FD00C5100000055  2024-11-15 15:19:44 2024-11-15 15:21:02          1       10          10
       23      .2    3% | library cache: mutex X 1607470161 0000000000000000  5FD00C510000006A  2024-11-15 15:19:20 2024-11-15 15:20:55         15       21          15
       23      .2    3% | library cache: mutex X 1607470161 0000001200000000  5FD00C5100000055  2024-11-15 15:19:22 2024-11-15 15:20:58          1       11          11
       22      .2    2% | library cache: mutex X 1607470161 0000009A00000000  5FD00C5100000055  2024-11-15 15:19:29 2024-11-15 15:21:01          1       13          13
       22      .2    2% | library cache: mutex X 1607470161 000000A200000000  5FD00C5100000055  2024-11-15 15:19:23 2024-11-15 15:20:56          1       14          14
       20      .2    2% | library cache: mutex X 1607470161 0000002300000000  5FD00C510000006A  2024-11-15 15:19:23 2024-11-15 15:21:00         11       10          11
       20      .2    2% | library cache: mutex X 1607470161 0000009B00000000  5FD00C5100000055  2024-11-15 15:19:30 2024-11-15 15:20:59          1       11          11
       20      .2    2% | library cache: mutex X 1607470161 0000019500000000  5FD00C5100000055  2024-11-15 15:19:40 2024-11-15 15:20:54          1       14          14
       17      .2    2% | library cache: mutex X 1607470161 0000009700000000  5FD00C5100000055  2024-11-15 15:19:26 2024-11-15 15:20:55          1       11          11
       17      .2    2% | library cache: mutex X 1607470161 0000009900000000  5FD00C5100000055  2024-11-15 15:19:25 2024-11-15 15:21:01          1       14          14
       16      .2    2% | library cache: mutex X 1607470161 0000001C00000000  5FD00C5100000055  2024-11-15 15:19:27 2024-11-15 15:21:01          1       11          11
       16      .2    2% | library cache: mutex X 1607470161 0000018D00000000  5FD00C510000006A  2024-11-15 15:19:29 2024-11-15 15:21:00         10       10          10
       15      .1    2% | library cache: mutex X 1607470161 0000001A00000000  5FD00C510000006A  2024-11-15 15:19:26 2024-11-15 15:20:48         11       10          11
       15      .1    2% | library cache: mutex X 1607470161 0000009A00000000  5FD00C510000006A  2024-11-15 15:19:33 2024-11-15 15:20:51          9       12           9
       14      .1    2% | library cache: mutex X 1607470161 0000010E00000000  5FD00C5100000055  2024-11-15 15:19:24 2024-11-15 15:20:51          1       11          11
       14      .1    2% | library cache: mutex X 1607470161 0000010F00000000  5FD00C510000006A  2024-11-15 15:19:21 2024-11-15 15:20:56         10        7          10
       13      .1    1% | library cache: mutex X 1607470161 0000001500000000  5FD00C510000006A  2024-11-15 15:19:25 2024-11-15 15:20:44          8       11           8
       13      .1    1% | library cache: mutex X 1607470161 0000001B00000000  5FD00C510000006A  2024-11-15 15:19:35 2024-11-15 15:20:56          8        9           8
       13      .1    1% | library cache: mutex X 1607470161 0000009B00000000  5FD00C510000006A  2024-11-15 15:19:25 2024-11-15 15:20:59         10       13          10
30 rows selected.
--//P3raw基本都是5FD00C51000000XX,前面8位0x5FD00C51 = 1607470161,正好等于sql语句的hash_value.
--//后面8位对应mutexprofz GET_LOCATION后面的数字。

SYS@book> @ ashtop event,p1,p3raw "event='library cache: mutex X'" trunc(sysdate)+15/24+19/1440+19/86400 trunc(sysdate)+15/24+21/1440+03/86400
    Total                                                                                                               Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                          P1 P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ---------------------- ---------- ----------------- ------------------- ------------------- ---------- -------- -----------
      527     5.1   58% | library cache: mutex X 1607470161 5FD00C5100000055  2024-11-15 15:19:21 2024-11-15 15:21:02          1      100         100
      246     2.4   27% | library cache: mutex X 1607470161 5FD00C510000006A  2024-11-15 15:19:20 2024-11-15 15:21:02         20       92          20
      134     1.3   15% | library cache: mutex X 1607470161 5FD00C5100000039  2024-11-15 15:19:21 2024-11-15 15:21:02          1       80          80

YS@book> @ ashtop to_number(substr(p3raw,9),'xxxxxxxx') "event='library cache: mutex X'" trunc(sysdate)+15/24+19/1440+19/86400 trunc(sysdate)+15/24+21/1440+03/86400
    Total                                                                                                 Distinct Distinct    Distinct
  Seconds     AAS %This   TO_NUMBER(SUBSTR(P3RAW,9),'XXXXXXXX') FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------- ------------------- ------------------- ---------- -------- -----------
      527     5.1   58% |                                    85 2024-11-15 15:19:21 2024-11-15 15:21:02          1      100         100
      246     2.4   27% |                                   106 2024-11-15 15:19:20 2024-11-15 15:21:02         20       92          20
      134     1.3   15% |                                    57 2024-11-15 15:19:21 2024-11-15 15:21:02          1       80          80
--//出现的数字是85,106,57.
      
SYS@book> @ mutexprofz idn,hash,loc,maddr "ts>=trunc(sysdate)+15/24+19/1440+19/86400 and ts<=trunc(sysdate)+15/24+21/1440+03/86400 and idn=1607470161"
-- MutexProf by Tanel Poder (http://www.tanelpoder.com)
-- Showing profile of top 20 sleeps...
-- column info : id idn hash hash_value=>hash_value ts=>sleep_timestamp
--               req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr
SUM_SLEEPS      GETS_DIFF MUTEX_TYPE             IDN       HASH GET_LOCATION                      mutex_addr           OBJECT_NAME
---------- -------------- --------------- ---------- ---------- --------------------------------- -------------------- ------------------------------------
        19         919120 Library Cache   1607470161 1607470161 kgllkdl1  85                      00000000684A3898     select count(*) from t where id = :j
        17         806316 hash table      1607470161 1607470161 kkshGetNextChild [KKSHBKLOC1]     00000000684A2CD0     select count(*) from t where id = :j
         8         359935 Cursor Pin      1607470161 1607470161 kkslce [KKSCHLPIN2]               00000000684A2EC0     select count(*) from t where id = :j
         7         493831 Cursor Pin      1607470161 1607470161 kksLockDelete [KKSCHLPIN6]        00000000684A2EC0     select count(*) from t where id = :j
         6         398527 Library Cache   1607470161 1607470161 kglhdgn2 106                      00000000684A3898     select count(*) from t where id = :j
         1                Library Cache   1607470161 1607470161 kgllkc1   57                      00000000684A3898     select count(*) from t where id = :j
6 rows selected.

SYS@book> @ mutexprofz idn,hash,loc,maddr "ts>=trunc(sysdate)+15/24+19/1440+19/86400 and ts<=trunc(sysdate)+15/24+21/1440+03/86400 "
-- MutexProf by Tanel Poder (http://www.tanelpoder.com)
-- Showing profile of top 20 sleeps...
-- column info : id idn hash hash_value=>hash_value ts=>sleep_timestamp
--               req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr
SUM_SLEEPS      GETS_DIFF MUTEX_TYPE             IDN       HASH GET_LOCATION                      mutex_addr           OBJECT_NAME
---------- -------------- --------------- ---------- ---------- --------------------------------- -------------------- ------------------------------------
        20         233346 Library Cache         3153            kglhdgn1  62                      0000000073BFB440     (name not found)
        19         919120 Library Cache   1607470161 1607470161 kgllkdl1  85                      00000000684A3898     select count(*) from t where id = :j
        17         806316 hash table      1607470161 1607470161 kkshGetNextChild [KKSHBKLOC1]     00000000684A2CD0     select count(*) from t where id = :j
        15         677965 hash table               0            kkscsSearchChildList [KKSHBKLOC2] 00000000684A2DD0     (name not found)
--//补充发现遗漏行,idn=0.
         8         359935 Cursor Pin      1607470161 1607470161 kkslce [KKSCHLPIN2]               00000000684A2EC0     select count(*) from t where id = :j
         6         493831 Cursor Pin      1607470161 1607470161 kksLockDelete [KKSCHLPIN6]        00000000684A2EC0     select count(*) from t where id = :j
         6         398527 Library Cache   1607470161 1607470161 kglhdgn2 106                      00000000684A3898     select count(*) from t where id = :j
         1                Library Cache   1607470161 1607470161 kgllkc1   57                      00000000684A3898     select count(*) from t where id = :j
8 rows selected.

--//提醒注意21c下查询x$mutex_sleep_history记录不再sleeps累积,而是记录流水账,后面的sleeps覆盖前面的值,所以看到sleeps很
--//小。
--//这里出现的数字定位我一直不理解为什么,不知道是否理解前面执行的函数,后面的数字对应程序行号。

SYS@book> @ mutexprofz maddr,p1raw "ts>=trunc(sysdate)+15/24+19/1440+19/86400 and ts<=trunc(sysdate)+15/24+21/1440+03/86400 and idn=1607470161"
-- MutexProf by Tanel Poder (http://www.tanelpoder.com)
-- Showing profile of top 20 sleeps...
-- column info : id idn hash hash_value=>hash_value ts=>sleep_timestamp
--               req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr
SUM_SLEEPS      GETS_DIFF MUTEX_TYPE      mutex_addr           P1RAW            OBJECT_NAME
---------- -------------- --------------- -------------------- ---------------- -------------------------------------
        20         919120 Library Cache   00000000684A3898     0000000065CDA030 select count(*) from t where id = :j
        17         806316 hash table      00000000684A2CD0     00               select count(*) from t where id = :j
        14         493831 Cursor Pin      00000000684A2EC0     00               select count(*) from t where id = :j
         6         398527 Library Cache   00000000684A3898     00000000684A3740 select count(*) from t where id = :j
--//要想知道mutex_addr只能查询x$mutex_sleep_history。
--//理论没有P1RAW字段,应该出现3行,实际出现4行,主要原因是tpt的脚本其他字段作为group by。
--//P1RAW=0000000065CDA030,00000000684A3740分别对应sql语句的子父游标句柄。

6.看看这些mutex_addr在哪里。
SYS@book> @ fchaz 00000000684A3898
GET_LOCATION                      KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHPTR_BEGIN   KSMCHPTR_END+1
--------------------------------- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- -----------------
SGA                               00000000684A3710          1          1 KGLHD                   816 recr             80 00               00000000684A3710 00000000684A3A40

SYS@book> @ fchaz 00000000684A2CD0
GET_LOCATION                      KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHPTR_BEGIN   KSMCHPTR_END+1
--------------------------------- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- -----------------
SGA                               00000000684A2710          1          1 KGLH0^5fd00c51         4096 recr           4095 0000000061ABB960 00000000684A2710 00000000684A3710

SYS@book> @ fchaz 00000000684A2EC0
GET_LOCATION                      KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHPTR_BEGIN   KSMCHPTR_END+1
--------------------------------- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- -----------------
SGA                               00000000684A2710          1          1 KGLH0^5fd00c51         4096 recr           4095 0000000061ABB960 00000000684A2710 00000000684A3710

SYS@book> @ sharepool/shp4  '' 1607470161
HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address   0000000065CDA030 00000000684A3740 select count(*) from t where id = :j              0          0          0 00000000619B3AF0 00000000684A2F68       8128      16176       3318     27622      27622 1607470161 3qa9k69gx032j          0
parent handle address  00000000684A3740 00000000684A3740 select count(*) from t where id = :j              0          0          0 0000000061ABB960 00                     4064          0          0      4064       4064 1607470161 3qa9k69gx032j      65535
--//从KSMCHPAR=0000000061ABB960可以发现。00000000684A2CD0,00000000684A2EC0对应的就是父游标的堆0地址。
--//前者00000000684A2CD0,对应hash table探查,loc=kkshGetNextChild [KKSHBKLOC1]。
--//后者00000000684A2EC0,对应Cursor Pin,loc=kkslce [KKSCHLPIN2],kksLockDelete [KKSCHLPIN6] ,如果大量执行软软解析这就
--//是主要等待事件,视乎比软软解析多了1个loc定位。

SYS@book> @ opeek 00000000684A2CD0 24 0
[0684A2CD0, 0684A2CE8) = 00000000 00000000 01312D05 00000700 5FD00C51 00000000

SYS@book> @ opeek 00000000684A2EC0 24 0
[0684A2EC0, 0684A2ED8) = 00000000 00000000 01312FEC 00000FCC 5FD00C51 00000000
--//0x5FD00C51 = 1607470161

--//00000000684A3898位于父游标,KSMCHPTR_BEGIN=00000000684A3710,与父游标句柄KGLHDPAR=00000000684A3740,正好相差0x30(48字节)。
--//也就是大量软解析的主要等待事件。
--//对应Library Cache,loc=kgllkdl1  85,kglhdgn2 106,kgllkc1   57.
SYS@book> @ opeek 00000000684A3898 24 0
[0684A3898, 0684A38B0) = 00000000 00000000 02625FF9 00014AC7 5FD00C51 00000000

--//    15         677965 hash table               0            kkscsSearchChildList [KKSHBKLOC2] 00000000684A2DD0     (name not found)
SYS@book> @ fchaz 00000000684A2DD0
GET_LOCATION                      KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHPTR_BEGIN   KSMCHPTR_END+1
--------------------------------- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- -----------------
SGA                               00000000684A2710          1          1 KGLH0^5fd00c51         4096 recr           4095 0000000061ABB960 00000000684A2710 00000000684A3710
--//在父游标的堆0地址。

SYS@book> @opeek 00000000684A2DD0 24 0
[0684A2DD0, 0684A2DE8) = 00000000 00000000 01312D0C 00000844 00000000 00000000
                                                             ~~~~~~~~
--//下划线位置一般记录hash_value,这里记录是0.

7.简单总结:
--//应用程序大量软解析导致的相关等待事件,主要集中在library cache:mutex X,library cache: bucket mutex X成为主要等待事件,
--//cursor: pin S,cursor: mutex S成为次要等待事件。

--//主要原因发现管理数据库就存在这类现象,许多代码视乎就是死循环,不断的连接退出,而执行代码就是1次,这样大量的sql语句都
--//是软解析。开发应该改成连接1次,小量休眠,在继续执行,另外写一个程序判断这个连接是否存在,不存在启动新连接。

--//library cache: mutex X,P3raw前8位记录sql语句 的hash_value。

--//后记:
SYS@book> @ ashtop event,p1raw,p3raw "event='cursor: pin S'" trunc(sysdate)+15/24+19/1440+19/86400 trunc(sysdate)+15/24+21/1440+03/86400
    Total                                                                                                                                          Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      P1RAW             P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ----------------- ----------------- ------------------- ------------------- ---------- -------- -----------
       54      .5   64% | cursor: pin S                              000000005FD00C51  0000000500000000  2024-11-15 15:19:23 2024-11-15 15:21:01          1       22          22
       30      .3   36% | cursor: pin S                              000000005FD00C51  0000000900000000  2024-11-15 15:19:23 2024-11-15 15:20:57          1       14          14

SYS@book> @ ashtop event,p1raw,p3raw "event='cursor: mutex S'" trunc(sysdate)+15/24+19/1440+19/86400 trunc(sysdate)+15/24+21/1440+03/86400
    Total                                                                                                                                          Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      P1RAW             P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ----------------- ----------------- ------------------- ------------------- ---------- -------- -----------
       19      .2   51% | cursor: mutex S                            000000005FD00C51  0000000100000000  2024-11-15 15:19:24 2024-11-15 15:19:55          1        3           3
       18      .2   49% | cursor: mutex S                            0000000000000000  0000000200000000  2024-11-15 15:19:26 2024-11-15 15:21:00          1        8           8
--//这里P3raw 与mutexprofz的输出记录不同,不是对应数字。

8.附上mutexprofz.sql代码:
--//在tpt的mutexprof.sql基础上做的小量修改,
$ cat mutexprofz.sql
--------------------------------------------------------------------------------
--
-- File name:   mutexprof.sql ( Mutex sleep Profiler )
--
-- Purpose:     Display KGX mutex sleep history from v$mutex_sleep_history
--              along library cache object names protected by these mutexes.
--              Only top 20 rows are shown by default
--
-- Author:      Tanel Poder
-- Copyright:   (c) http://www.tanelpoder.com
--
-- Usage:       @mutexprof <grouping columns> <filter condition>
--
--              The main grouping (and filtering) columns are:
--
--                  id  - mutex ID (which is the object hash value for library
--                                  cache object mutexes)
--                  ts  - timestamp of mutex sleep beginning
--                  loc - code location where the waiter slept for the mutex
--                  val - mutex value (shows whether mutex was held in exclusive or
--                                     shared mode)
--                  req - requesting session SID
--                  blk - blocking session SID
--
--              The filter condition allows filtering mutex sleep rows based on certain
--              criteria, such:
--
--                  1=1      - show all mutex sleeps (which are still in memory)
--                  blk=123  - show only these mutex sleeps where blocking sid was 123
--                  hash=2741853041 - show only these sleeps where mutex ID (KGL object hash value)
--                                    was 2741853041
--
--
--                  Its also possible to have multiple "AND" filter conditions, as long as you keep
--                  them in double quotes so that sqlplus would recognize them as one parameter
--
--                  For example: "name like '%DUAL%' and blk in (115,98)"
--
-- Examples:
--
--              @mutexprof loc 1=1
--              @mutexprof id,loc,req,blk "lower(name) like 'select%from dual%'"
--              @mutexprof loc,val blk=98
--              @mutexprof id,loc,req,blk "blk in (select sid from v$session where username = 'SYS')"
--
-- Other:       When the relevant object is aged out you will see (name not found)
--              as object_name.
--
--              On 10.2.0.1 the V$mutex_sleep_history does not have mutex_identifier
--              column externalized. In this case use X$mutex_sleep_history instead
--
--------------------------------------------------------------------------------

col msh_obj_name   head OBJECT_NAME for  a80 word_wrap
col msh_mutex_type head MUTEX_TYPE for a15 truncate
col loc   head GET_LOCATION for a33 truncate

col mutexprof_gets   head GETS_DIFF for 9999999999999
col mutexprof_sleeps head SLEEPS for 999999

col mutexprof_p2 head P2 for a16 wrap
col mutexprof_p3 head P3 for a16 wrap
col mutexprof_p4 head P4 for a16 wrap
col mutexprof_p5 head P5 for a20 wrap

col maddr head mutex_addr for a20 wrap

def MSH_NUMROWS=20

prompt
prompt -- MutexProf by Tanel Poder (http://www.tanelpoder.com)
prompt -- Showing profile of top &MSH_NUMROWS sleeps...
prompt -- column info : id idn hash hash_value=>hash_value ts=>sleep_timestamp
prompt --               req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr

select * from (
    select /*+ ORDERED USE_NL(o) */
      -- TODO the sleep/get counting needs fixing!
      --MAX(sleeps)               sleeps
      sum(sleeps)               sum_sleeps
      --count(*)                sleeps
      --, decode(max(sleeps)-min(sleeps),0,to_number(null),max(sleeps)-min(sleeps)) mutexprof_sleeps -- may not be very accurate but give an idea
      , decode(max(gets)-min(gets),0,to_number(null),max(gets)-min(gets)) mutexprof_gets -- may not be very accurate but give an idea
      --  avg(sleeps)         sleeps
      --, avg(gets)           gets
      , mutex_type          msh_mutex_type
      , &1
      , replace(nvl(decode(kglnaown, null, kglnaobj, kglnaown||'.'||kglnaobj), '(name not found)'),chr(13),'')   msh_obj_name
      --, nvl(decode(kglnaown, null, kglnaobj, kglnaown||'.'||kglnaobj), '(name not found)')   msh_obj_name
      --, p1raw
      --, CASE WHEN p2 < 536870912 THEN TO_CHAR(p2) ELSE TRIM(TO_CHAR(p2, 'XXXXXXXXXXXXXXXX')) END mutexprof_p2
      --, CASE WHEN p3 < 536870912 THEN TO_CHAR(p3) ELSE TRIM(TO_CHAR(p3, 'XXXXXXXXXXXXXXXX')) END mutexprof_p3
      --, CASE WHEN p4 < 536870912 THEN TO_CHAR(p4) ELSE TRIM(TO_CHAR(p4, 'XXXXXXXXXXXXXXXX')) END mutexprof_p4
      --, p5 mutexprof_p5
    from
        (select
            mutex_identifier   id
          , mutex_identifier   idn
          , sleep_timestamp    ts
          , mutex_type
          , gets
          , sleeps
          , requesting_session req
          , blocking_session   blk
          , location           loc
          , mutex_value        val
          , mutex_addr         maddr
          , p1
          , p1raw
          , p2
          , p3
          , p4
          , p5
         from x$mutex_sleep_history) m
      , (select kglnahsh, kglnahsh hash_value, kglnahsh hash,
                kglhdpar, kglhdadr, kglnaown, kglnaobj,
                decode(kglnaown, null, kglnaobj, kglnaown||'.'||kglnaobj) object_name,
                decode(kglnaown, null, kglnaobj, kglnaown||'.'||kglnaobj) name
         from x$kglob) o
    where
        m.id = o.kglnahsh (+)
    and (o.kglhdadr = o.kglhdpar or (o.kglhdpar is null)) -- only parent KGL objects if still in cache
    and &2
    group by
        mutex_type
      , &1
      , kglnaown
      , kglnaobj
      , p1raw
      , CASE WHEN p2 < 536870912 THEN TO_CHAR(p2) ELSE TRIM(TO_CHAR(p2, 'XXXXXXXXXXXXXXXX')) END
      , CASE WHEN p3 < 536870912 THEN TO_CHAR(p3) ELSE TRIM(TO_CHAR(p3, 'XXXXXXXXXXXXXXXX')) END
      , CASE WHEN p4 < 536870912 THEN TO_CHAR(p4) ELSE TRIM(TO_CHAR(p4, 'XXXXXXXXXXXXXXXX')) END
      --, p5
    order by
        1 desc
       -- sleeps desc
)
where rownum <= &MSH_NUMROWS
/

posted @ 2024-11-18 21:43  lfree  阅读(1)  评论(0编辑  收藏  举报