分析

这类问题通常可以从以下几个方面分析

  • system load
  • wait event
  • session statistics
  • process callstack

GV$ ASH 记录

确认是否有采集快照缺失

SQL> select inst_id,min(sample_time) starttime,max(sample_time)endtime,count(distinct sample_time) snaps from ash0709 group by inst_id;

   INST_ID STARTTIME                    ENDTIME                           SNAPS
---------- ---------------------------- ---------------------------- ----------
         1 09-JUL-22 05.00.00.361 AM    09-JUL-22 08.54.07.608 AM         12298
         2 09-JUL-22 05.00.00.904 AM    09-JUL-22 08.54.07.716 AM         13837
         4 09-JUL-22 05.00.00.784 AM    09-JUL-22 08.54.08.038 AM         13948
         3 09-JUL-22 05.00.00.249 AM    09-JUL-22 08.54.08.085 AM         13948


select inst_id,extract (hour from sample_time) hh,min(sample_time) starttime,max(sample_time)endtime,count(distinct sample_time) snaps 
from ash0709 
group by inst_id,extract (hour from sample_time)
order by 1,2;

   INST_ID         HH STARTTIME                    ENDTIME                           SNAPS
---------- ---------- ---------------------------- ---------------------------- ----------
         1          5 09-JUL-22 05.00.00.361 AM    09-JUL-22 05.59.59.015 AM          3485
         1          6 09-JUL-22 06.00.00.025 AM    09-JUL-22 06.59.59.212 AM          3557
         1          7 09-JUL-22 07.00.00.222 AM    09-JUL-22 07.59.57.066 AM          2601
         1          8 09-JUL-22 08.00.01.116 AM    09-JUL-22 08.54.07.608 AM          2655
         2          5 09-JUL-22 05.00.00.904 AM    09-JUL-22 05.59.59.274 AM          3551
         2          6 09-JUL-22 06.00.00.284 AM    09-JUL-22 06.59.59.251 AM          3550
         2          7 09-JUL-22 07.00.00.261 AM    09-JUL-22 07.59.59.964 AM          3551
         2          8 09-JUL-22 08.00.00.964 AM    09-JUL-22 08.54.07.716 AM          3185
         3          5 09-JUL-22 05.00.00.249 AM    09-JUL-22 05.59.59.458 AM          3575
         3          6 09-JUL-22 06.00.00.468 AM    09-JUL-22 06.59.59.461 AM          3574
         3          7 09-JUL-22 07.00.00.461 AM    09-JUL-22 07.59.59.823 AM          3574
         3          8 09-JUL-22 08.00.00.833 AM    09-JUL-22 08.54.08.085 AM          3225
         4          5 09-JUL-22 05.00.00.784 AM    09-JUL-22 05.59.59.692 AM          3575
         4          6 09-JUL-22 06.00.00.692 AM    09-JUL-22 06.59.59.039 AM          3573
         4          7 09-JUL-22 07.00.00.039 AM    09-JUL-22 07.59.59.268 AM          3574
         4          8 09-JUL-22 08.00.00.268 AM    09-JUL-22 08.54.08.038 AM          3226

-- 检查SQL运行时长
select inst_id,sql_id,min(sample_time) starttime,max(sample_time)endtime,max(sample_time)-min(sample_time) during
 from  ash0709 where SQL_PLAN_HASH_VALUE=2391750817 group by inst_id,sql_id
  3  order by 2,3;

   INST_ID SQL_ID        STARTTIME                    ENDTIME                      DURING
---------- ------------- ---------------------------- ---------------------------- ---------------------------------------------------------------------------
         1 0h31pzh4m1rxb 09-JUL-22 05.43.32.089 AM    09-JUL-22 06.15.26.468 AM    +000000000 00:31:54.379
         2 0h31pzh4m1rxb 09-JUL-22 05.44.50.881 AM    09-JUL-22 06.15.36.270 AM    +000000000 00:30:45.389
         1 3zr5yfq5039dx 09-JUL-22 05.43.27.019 AM    09-JUL-22 06.27.40.978 AM    +000000000 00:44:13.959
         3 3zr5yfq5039dx 09-JUL-22 05.44.50.880 AM    09-JUL-22 06.27.34.010 AM    +000000000 00:42:43.130
         4 3zr5yfq5039dx 09-JUL-22 05.44.51.678 AM    09-JUL-22 06.27.40.259 AM    +000000000 00:42:48.581
         1 4005sxkg5ag51 09-JUL-22 05.43.14.929 AM    09-JUL-22 06.03.02.400 AM    +000000000 00:19:47.471    
         1 48cbmz2htvjg7 09-JUL-22 05.43.27.019 AM    09-JUL-22 06.15.36.578 AM    +000000000 00:32:09.559
         2 48cbmz2htvjg7 09-JUL-22 05.44.50.881 AM    09-JUL-22 06.15.46.650 AM    +000000000 00:30:55.769
         1 4hff619j0w11m 09-JUL-22 05.43.38.129 AM    09-JUL-22 06.15.01.222 AM    +000000000 00:31:23.093
         4 4hff619j0w11m 09-JUL-22 05.44.51.678 AM    09-JUL-22 06.15.06.303 AM    +000000000 00:30:14.625
         1 888n9jcb93krn 09-JUL-22 05.43.37.129 AM    09-JUL-22 06.24.18.718 AM    +000000000 00:40:41.589
         3 888n9jcb93krn 09-JUL-22 05.44.50.880 AM    09-JUL-22 06.24.06.478 AM    +000000000 00:39:15.598
         2 888n9jcb93krn 09-JUL-22 05.44.50.881 AM    09-JUL-22 06.24.18.516 AM    +000000000 00:39:27.635
         1 8f9vpq05nzf5b 09-JUL-22 05.43.36.119 AM    09-JUL-22 06.24.05.598 AM    +000000000 00:40:29.479
         3 8f9vpq05nzf5b 09-JUL-22 05.44.50.880 AM    09-JUL-22 06.23.56.418 AM    +000000000 00:39:05.538
         2 8f9vpq05nzf5b 09-JUL-22 05.44.50.881 AM    09-JUL-22 06.24.05.366 AM    +000000000 00:39:14.485
         1 8wcnndfapzzn9 09-JUL-22 05.43.14.929 AM    09-JUL-22 07.16.47.932 AM    +000000000 01:33:33.003    
         4 8wcnndfapzzn9 09-JUL-22 05.44.51.678 AM    09-JUL-22 08.28.10.860 AM    +000000000 02:43:19.182
         3 8wcnndfapzzn9 09-JUL-22 05.44.52.890 AM    09-JUL-22 08.28.11.872 AM    +000000000 02:43:18.982
         1 bhw9ycm20dw48 09-JUL-22 05.43.38.129 AM    09-JUL-22 05.44.50.089 AM    +000000000 00:01:11.960
         3 bhw9ycm20dw48 09-JUL-22 05.44.50.880 AM    09-JUL-22 06.18.46.183 AM    +000000000 00:33:55.303
         4 bhw9ycm20dw48 09-JUL-22 05.44.51.678 AM    09-JUL-22 06.18.41.011 AM    +000000000 00:33:49.333
         1 dm6wgxdcs73w1 09-JUL-22 05.43.31.079 AM    09-JUL-22 06.13.21.972 AM    +000000000 00:29:50.893
         4 dm6wgxdcs73w1 09-JUL-22 05.44.51.678 AM    09-JUL-22 06.13.17.478 AM    +000000000 00:28:25.800

NOTE:
因为每天批处理CTAS的执行计划一样,只是分区名区别,可以看到同批次8wcnndfapzzn9 SQLID的运行时间近3小时,其它都在30分钟左右, 并且同一个sql ID是跨实例运行,说明SQL使用了parallel, 并且parallel force local应该是false。从现场得知调度都是连接实例1发起,然后有的SQL parallel slave process跨节点完成。 这种部署方式是不建议的,建议以其它业务维度分解单SQL任务在多个实例上,每个实例并行只在本节点完成,减少跨节点的调度,从上面可以看出SQL ID 4005sxkg5ag51 只在node1 完成,并且是用时最短。

分析问题SQL 8wcnndfapzzn9

-- 时间消耗的执行计划
 select  inst_id, IS_SQLID_CURRENT,SQL_PLAN_HASH_VALUE,SQL_PLAN_LINE_ID,SQL_PLAN_OPERATION,count(*) es_sec
-- ,SQL_EXEC_ID,SQL_EXEC_START,
-- QC_INSTANCE_ID,QC_SESSION_ID,SEQ# ,
-- SESSION_STATE,TIME_WAITED,BLOCKING_SESSION,
-- CURRENT_OBJ# ,CURRENT_FILE# ,CURRENT_BLOCK# ,
-- TOP_LEVEL_CALL_NAME,IN_PARSE,IN_SQL_EXECUTION,event, time_waited/1000 threshold_in_ms,
-- DELTA_READ_IO_REQUESTS,DELTA_READ_IO_BYTES,PGA_ALLOCATED,TEMP_SPACE_ALLOCATED
 from ash0709
 where sql_id='8wcnndfapzzn9'
 group by inst_id, IS_SQLID_CURRENT,SQL_PLAN_HASH_VALUE,SQL_PLAN_LINE_ID,SQL_PLAN_OPERATION
 11   order by 6 desc;

   INST_ID I SQL_PLAN_HASH_VALUE SQL_PLAN_LINE_ID SQL_PLAN_OPERATION                 ES_SEC
---------- - ------------------- ---------------- ------------------------------ ----------
         3 Y          2391750817               36 TABLE ACCESS                         8931

   INST_ID I SQL_PLAN_HASH_VALUE SQL_PLAN_LINE_ID SQL_PLAN_OPERATION                 ES_SEC
---------- - ------------------- ---------------- ------------------------------ ----------
         4 Y          2391750817               36 TABLE ACCESS                         8441
           Y          2391750817               34 PX SEND                               224
           Y          2391750817               28 HASH JOIN                             195

   INST_ID I SQL_PLAN_HASH_VALUE SQL_PLAN_LINE_ID SQL_PLAN_OPERATION                 ES_SEC
---------- - ------------------- ---------------- ------------------------------ ----------
         3 Y          2391750817               28 HASH JOIN                             173

  select  -- inst_id, IS_SQLID_CURRENT,SQL_PLAN_HASH_VALUE,SQL_PLAN_LINE_ID,SQL_PLAN_OPERATION,count(*) es_sec
 SQL_EXEC_ID,SQL_EXEC_START, count(*) es_sec
-- QC_INSTANCE_ID,QC_SESSION_ID,SEQ# ,
-- SESSION_STATE,TIME_WAITED,BLOCKING_SESSION,
-- CURRENT_OBJ# ,CURRENT_FILE# ,CURRENT_BLOCK# ,
-- TOP_LEVEL_CALL_NAME,IN_PARSE,IN_SQL_EXECUTION,event, time_waited/1000 threshold_in_ms,
-- DELTA_READ_IO_REQUESTS,DELTA_READ_IO_BYTES,PGA_ALLOCATED,TEMP_SPACE_ALLOCATED
 from ash0709
 where sql_id='8wcnndfapzzn9'
 group by SQL_EXEC_ID,SQL_EXEC_START
 11   order by 3 desc;

SQL_EXEC_ID SQL_EXEC_START          ES_SEC
----------- ------------------- ----------
   16777216 2022-07-09 05:43:17      19033
                                         3

note
最耗时的是执行计划的36# full table scan. 消耗近90%, SQL并且确认运行了一次。

SQL MONITOR

SQL Plan Monitoring Details (Plan Hash Value=2391750817)
=========================================================================================================================================================================================================================================
| Id |               Operation               |             Name             |  Rows   | Cost  |   Time    | Start  | Execs |   Rows   | Read  | Read  | Write | Write |  Mem  | Temp  | Activity |           Activity Detail            |
|    |                                       |                              | (Estim) |       | Active(s) | Active |       | (Actual) | Reqs  | Bytes | Reqs  | Bytes | (Max) | (Max) |   (%)    |             (# samples)              |
=========================================================================================================================================================================================================================================
|  0 | CREATE TABLE STATEMENT                |                              |         |       |      2138 |  +6712 |     5 |        2 |       |       |       |       |       |       |     0.01 | Cpu (1)                              |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | enq: TT - contention (1)             |
|  1 |   PX COORDINATOR                      |                              |         |       |      8849 |     +1 |     5 |        2 |       |       |       |       |       |       |     0.02 | enq: KO - fast object checkpoint (2) |
...
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | direct path read (44)                |
| 33 |               PX RECEIVE              |                              |    305M |  514K |      8231 |   +111 |     2 |     428M |       |       |       |       |       |       |     0.39 | Cpu (66)                             |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | PX Deq: reap credit (3)              |
| 34 |                PX SEND HASH           | :TQ10005                     |    305M |  514K |      8521 |   +111 |     2 |     428M |       |       |       |       |       |       |     1.46 | Cpu (254)                            |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | PX Deq: reap credit (5)              |
| 35 |                 PX PARTITION LIST ALL |                              |    305M |  514K |      8521 |   +111 |     2 |     428M |       |       |       |       |       |       |     0.31 | Cpu (55)                             |
| 36 |                  TABLE ACCESS FULL    | MID_xxxxxxxxxxx_DAY          |    305M |  514K |      8522 |   +110 | 14355 |     428M |  227K | 211GB |       |       |       |       |    89.99 | gc cr block lost (1)                 |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | gc cr grant 2-way (5)                |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | gc cr multi block request (4)        |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | gc current block 2-way (1)           |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | gc current block 3-way (1)           |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | Cpu (15228)                          |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | db file scattered read (13)          |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | db file sequential read (49)         |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | direct path read (656)               |
|    |                                       |                              |         |       |           |        |       |          |       |       |       |       |       |       |          | read by other session (6)            |
=========================================================================================================================================================================================================================================

Global Stats
====================================================================================================================================
| Elapsed |   Cpu   |    IO    | Application | Concurrency | Cluster  | PL/SQL  |  Other   | Buffer | Read | Read  | Write | Write |
| Time(s) | Time(s) | Waits(s) |  Waits(s)   |  Waits(s)   | Waits(s) | Time(s) | Waits(s) |  Gets  | Reqs | Bytes | Reqs  | Bytes |
====================================================================================================================================
|   17934 |    1367 |     1285 |        0.40 |        0.15 |       12 |    0.01 |    15269 |     7M | 263K | 224GB | 33481 |  10GB |
====================================================================================================================================

note: 从SQLmonitor中的 buffer gets笔平时并未增加,时间是消耗在other waits.

OS 负载

----system---- ----total-cpu-usage---- -dsk/total- -net/total- ------memory-usage----- ----swap--- ---load-avg---
     time     |usr sys idl wai hiq siq| read  writ| recv  send| used  buff  cach  free| used  free| 1m   5m  15m
08-07 05:59:09|  2   2  89   6   0   0|1169M 2917M|  18M   33M| 155G 1213M  267G  587G|   0    17G|21.2 21.8 21.6
08-07 05:59:10|  3   2  93   1   0   0|2908M  200M|  14M   23M| 155G 1213M  267G  587G|   0    17G|21.2 21.8 21.6
08-07 05:59:11|  3   2  94   1   0   0|1650M  136M|9809k   15M| 155G 1213M  267G  587G|   0    17G|20.9 21.7 21.6
08-07 05:59:12|  3   1  94   1   0   0|2287M  368M|  34M   59M| 155G 1213M  267G  587G|   0    17G|20.9 21.7 21.6
08-07 05:59:13|  3   2  93   2   0   0|3091M  296M|  12M   25M| 155G 1213M  267G  587G|   0    17G|20.9 21.7 21.6
08-07 05:59:14|  3   2  94   1   0   0|1632M  168M|  17M   32M| 155G 1213M  267G  587G|   0    17G|20.9 21.7 21.6
08-07 05:59:15|  3   2  94   1   0   0|2370M  363M|  20M   38M| 155G 1213M  267G  587G|   0    17G|20.6 21.6 21.6
08-07 05:59:16|  3   2  94   1   0   0|2408M  153M|  11M   20M| 155G 1213M  267G  587G|   0    17G|20.6 21.6 21.6
08-07 05:59:17|  3   2  94   1   0   0|1492M  149M|  23M   27M| 155G 1213M  267G  587G|   0    17G|20.6 21.6 21.6
08-07 05:59:18|  3   2  94   1   0   0|2755M  483M|  95M   53M| 155G 1213M  267G  587G|   0    17G|20.6 21.6 21.6
08-07 05:59:19|  3   2  94   1   0   0|2749M  339M|  23M   38M| 155G 1213M  267G  587G|   0    17G|20.6 21.6 21.6
08-07 05:59:21|  3   2  93   1   0   0|3370M  473M| 146M   64M| 155G 1213M  267G  587G|   0    17G|22.1 21.9 21.7
08-07 05:59:23|  3   2  93   1   0   0|4604M  593M| 162M   59M| 155G 1213M  267G  587G|   0    17G|22.1 21.9 21.7 missed 3 ticks
08-07 05:59:25|  3   3  93   1   0   0|3835M  525M|  92M   39M| 155G 1213M  267G  587G|   0    17G|22.1 21.9 21.7 missed 2 ticks
08-07 05:59:27|  2   2  94   1   0   0|2336M  216M|  56M   56M| 155G 1213M  267G  587G|   0    17G|22.1 21.9 21.7
08-07 05:59:29|  2   2  94   2   0   0|3497M  395M|  60M   51M| 155G 1213M  267G  587G|   0    17G|22.1 21.9 21.7 missed 3 ticks
08-07 05:59:31|  2   2  94   1   0   0|3217M  456M|  63M   60M| 155G 1213M  267G  587G|   0    17G|22.4 22.0 21.7 missed 2 ticks
08-07 05:59:33|  2   2  94   2   0   0|3823M  461M|  29M   51M| 155G 1213M  267G  587G|   0    17G|22.4 22.0 21.7 missed 2 ticks
08-07 05:59:35|  3   2  93   2   0   0|3131M  376M|  26M   40M| 155G 1213M  267G  587G|   0    17G|23.8 22.3 21.8 missed 2 ticks


----system---- ----total-cpu-usage---- -dsk/total- -net/total- ------memory-usage----- ----swap--- ---load-avg---
     time     |usr sys idl wai hiq siq| read  writ| recv  send| used  buff  cach  free| used  free| 1m   5m  15m
09-07 05:59:29|  3   1  95   1   0   0|1394M  124M| 100M  120M| 157G 1217M  267G  584G|   0    17G|19.6 19.7 17.9
09-07 05:59:30|  3   1  95   0   0   0|1378M   66M| 102M   82M| 157G 1217M  267G  584G|   0    17G|19.6 19.7 17.9
09-07 05:59:31|  3   2  95   0   0   0|1114M   69M|  97M   96M| 157G 1217M  267G  584G|   0    17G|19.6 19.7 17.9
09-07 05:59:32|  3   2  95   1   0   0|1728M  119M| 147M  172M| 157G 1217M  267G  584G|   0    17G|18.9 19.5 17.8
09-07 05:59:34|  3   2  94   1   0   0|2564M  136M| 212M  189M| 157G 1217M  267G  584G|   0    17G|18.9 19.5 17.8
09-07 05:59:36|  3   2  94   1   0   0|2560M  195M|  65M   86M| 157G 1217M  267G  584G|   0    17G|18.9 19.5 17.8 missed 2 ticks
09-07 05:59:37|  3   2  94   1   0   0|1492M   87M| 163M  140M| 157G 1217M  267G  584G|   0    17G|18.9 19.5 17.8
09-07 05:59:38|  3   2  94   1   0   0|2445M  197M| 199M  206M| 157G 1217M  267G  584G|   0    17G|18.7 19.5 17.8 missed 2 ticks
09-07 05:59:40|  3   3  94   1   0   0|3014M  215M| 191M  161M| 157G 1217M  267G  584G|   0    17G|18.7 19.5 17.8 missed 2 ticks
09-07 05:59:42|  3   2  94   1   0   0|2378M  146M|  83M   88M| 157G 1217M  267G  584G|   0    17G|18.7 19.5 17.8 missed 2 ticks
09-07 05:59:43|  3   2  94   1   0   0|1745M  117M| 247M  205M| 157G 1217M  267G  584G|   0    17G|18.4 19.4 17.8
09-07 05:59:46|  3   2  94   1   0   0|3229M  228M| 232M  218M| 157G 1217M  267G  584G|   0    17G|18.4 19.4 17.8 missed 2 ticks
09-07 05:59:48|  3   3  94   1   0   0|3091M  247M|  90M   80M| 157G 1217M  267G  584G|   0    17G|18.1 19.3 17.8 missed 3 ticks
09-07 05:59:49|  3   2  94   1   0   0|1363M   87M| 141M  125M| 157G 1217M  267G  584G|   0    17G|18.1 19.3 17.8
09-07 05:59:50|  3   2  93   1   0   0|1931M  153M| 145M  114M| 157G 1217M  267G  584G|   0    17G|18.1 19.3 17.8
09-07 05:59:52|  3   2  94   1   0   0|1647M   99M|  53M   63M| 157G 1217M  267G  584G|   0    17G|18.1 19.3 17.8
09-07 05:59:53|  4   2  93   1   0   0| 825M  107M|  72M   72M| 156G 1217M  267G  585G|   0    17G|18.1 19.3 17.8

note : 7/9问题时间和7/8正常时间负载并无太大差异。

top event

select   inst_id,
  --IS_SQLID_CURRENT,SQL_PLAN_HASH_VALUE,SQL_PLAN_LINE_ID,SQL_PLAN_OPERATION,count(*) es_sec
-- SQL_EXEC_ID,SQL_EXEC_START, count(*) es_sec
 --QC_INSTANCE_ID,QC_SESSION_ID,
 CASE WHEN h.SESSION_STATE != 'WAITING' THEN 'On CPU / runqueue'  ELSE event end as event ,  SUM(h.wait_time + h.time_waited)/1000000 "Total Wait Time", SESSION_STATE, BLOCKING_SESSION,count(*) es_sec
-- CURRENT_OBJ# ,CURRENT_FILE# ,CURRENT_BLOCK# ,SEQ# ,
-- TOP_LEVEL_CALL_NAME,IN_PARSE,IN_SQL_EXECUTION,event, time_waited/1000 threshold_in_ms,
-- DELTA_READ_IO_REQUESTS,DELTA_READ_IO_BYTES,PGA_ALLOCATED,TEMP_SPACE_ALLOCATED
 from ash0709 h
 where sql_id='8wcnndfapzzn9'
 group by inst_id,event,SESSION_STATE, BLOCKING_SESSION
 12   order by 6 desc;

   INST_ID EVENT                            Total Wait Time SESSION BLOCKING_SESSION     ES_SEC
---------- -------------------------------- --------------- ------- ---------------- ----------
         3 On CPU / runqueue                        .163804 ON CPU                         9061

   INST_ID EVENT                            Total Wait Time SESSION BLOCKING_SESSION     ES_SEC
---------- -------------------------------- --------------- ------- ---------------- ----------
         4 On CPU / runqueue                         .73538 ON CPU                         8812

   INST_ID EVENT                            Total Wait Time SESSION BLOCKING_SESSION     ES_SEC
---------- -------------------------------- --------------- ------- ---------------- ----------
         3 direct path read                       28.776845 WAITING                         458

   INST_ID EVENT                            Total Wait Time SESSION BLOCKING_SESSION     ES_SEC
---------- -------------------------------- --------------- ------- ---------------- ----------
         4 direct path read                       23.998951 WAITING                         407
           direct path read temp                    .492271 WAITING                          40

-- top call

  select inst_id, CASE WHEN h.SESSION_STATE != 'WAITING' THEN 'On CPU / runqueue'  ELSE event end as event ,  SUM(h.wait_time + h.time_waited)/1000000 "Total Wait Time",
TOP_LEVEL_CALL_NAME,IN_PARSE,IN_SQL_EXECUTION
 ,count(*) es_sec
 from ash0709 h
 where sql_id='8wcnndfapzzn9' and SQL_PLAN_LINE_ID=36
  6   group by inst_id,SESSION_STATE,event, TOP_LEVEL_CALL_NAME,IN_PARSE,IN_SQL_EXECUTION;

   INST_ID EVENT                                    Total Wait Time TOP_LEVEL_CALL_NAME                                              I I     ES_SEC
---------- ---------------------------------------- --------------- ---------------------------------------------------------------- - - ----------
         4 On CPU / runqueue                                .102406 LOGOFF                                                           N Y       8059

   INST_ID EVENT                                    Total Wait Time TOP_LEVEL_CALL_NAME                                              I I     ES_SEC
---------- ---------------------------------------- --------------- ---------------------------------------------------------------- - - ----------
         3 On CPU / runqueue                                 .06867 VERSION2                                                         N Y       8498
           direct path read                               20.722015 VERSION2                                                         N Y        361

   INST_ID EVENT                                    Total Wait Time TOP_LEVEL_CALL_NAME                                              I I     ES_SEC
---------- ---------------------------------------- --------------- ---------------------------------------------------------------- - - ----------
         4 direct path read                               21.756692 LOGOFF                                                           N Y        380

   INST_ID EVENT                                    Total Wait Time TOP_LEVEL_CALL_NAME                                              I I     ES_SEC
---------- ---------------------------------------- --------------- ---------------------------------------------------------------- - - ----------
         3 gc cr block lost                                  .77136 VERSION2                                                         N Y          1

   INST_ID EVENT                                    Total Wait Time TOP_LEVEL_CALL_NAME                                              I I     ES_SEC
---------- ---------------------------------------- --------------- ---------------------------------------------------------------- - - ----------
         4 db file sequential read                          .006389 LOGOFF                                                           N Y          1

   INST_ID EVENT                                    Total Wait Time TOP_LEVEL_CALL_NAME                                              I I     ES_SEC
---------- ---------------------------------------- --------------- ---------------------------------------------------------------- - - ----------
         3 db file sequential read                          1.40969 VERSION2                                                         N Y         37

NOTE:
大部分时间是 ON CPU. node4 是调用logoff, node3为version2, 查看历史正常时间段top level call name均是version2. 暂不确认logoff原因(猜测是parallel slave进程退出)。

到现在是逻辑读没增加,又存在2个并行slave节点进程大部时间是on cpu, 系统负载并不高,问题出在哪里?

分析OS层进程状态

SQL> r
    select inst_id, CASE WHEN h.SESSION_STATE != 'WAITING' THEN 'On CPU / runqueue'  ELSE event end as event ,  SUM(h.wait_time + h.time_waited)/1000000 "Total Wait Time",
  program,TOP_LEVEL_CALL_NAME
   ,count(*) es_sec
   from ash0709 h
   where sql_id='8wcnndfapzzn9' and SQL_PLAN_LINE_ID=36
   group by inst_id,program,event,TOP_LEVEL_CALL_NAME,SESSION_STATE
 
   INST_ID EVENT                                    Total Wait Time PROGRAM                        TOP_LEVEL_CALL_NAME                ES_SEC
---------- ---------------------------------------- --------------- ------------------------------ ------------------------------ ----------
         3 On CPU / runqueue                                 .06867 oracle@anbob3 (P027)        VERSION2                             8498
         3 gc cr block lost                                  .77136 oracle@anbob3 (P027)        VERSION2                                1
         3 gc current block 3-way                           .001514 oracle@anbob3 (P027)        VERSION2                                1
         4 gc current block 2-way                           .002936 oracle@anbob4 (P009)        LOGOFF                                  1
         3 db file sequential read                          1.40969 oracle@anbob3 (P027)        VERSION2                               37
         3 gc cr grant 2-way                                .093752 oracle@anbob3 (P027)        VERSION2                                6
         3 gc current block 2-way                           .011192 oracle@anbob3 (P027)        VERSION2                                5
         4 On CPU / runqueue                                .102406 oracle@anbob4 (P009)        LOGOFF                               8059
         4 direct path read                               21.756692 oracle@anbob4 (P009)        LOGOFF                                380
         4 db file sequential read                          .006389 oracle@anbob4 (P009)        LOGOFF                                  1
         3 direct path read                               20.722015 oracle@anbob3 (P027)        VERSION2                              361
         3 db file scattered read                           .579141 oracle@anbob3 (P027)        VERSION2                               16
         3 gc cr multi block request                        .012058 oracle@anbob3 (P027)        VERSION2                                6

13 rows selected.

NOTE:
节点4的p009进程和节点3的p027进程。

OSW ps 分析

$ egrep '^zzz|ora_p027' anbob3_ps_22.07.09.0500.dat
zzz ***Sat Jul 9 05:42:59 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169854500 poll_s S   Jun 30 06:11:01 ora_p027_anbob3
zzz ***Sat Jul 9 05:43:29 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169854972 poll_s S   Jun 30 06:11:01 ora_p027_anbob3
zzz ***Sat Jul 9 05:43:59 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169857232 read_e S   Jun 30 06:11:03 ora_p027_anbob3
zzz ***Sat Jul 9 05:44:29 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169874284 blockd D   Jun 30 06:11:04 ora_p027_anbob3
zzz ***Sat Jul 9 05:44:59 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169955448 synchr D   Jun 30 06:11:06 ora_p027_anbob3
zzz ***Sat Jul 9 05:45:29 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169956480 synchr D   Jun 30 06:11:09 ora_p027_anbob3
zzz ***Sat Jul 9 05:45:59 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169956356 read_e S   Jun 30 06:11:12 ora_p027_anbob3
zzz ***Sat Jul 9 05:46:29 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169956380 read_e S   Jun 30 06:11:15 ora_p027_anbob3
zzz ***Sat Jul 9 05:46:59 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169956384 read_e S   Jun 30 06:11:18 ora_p027_anbob3
zzz ***Sat Jul 9 05:47:29 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169956516 synchr D   Jun 30 06:11:21 ora_p027_anbob3
zzz ***Sat Jul 9 05:47:59 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169956400 poll_s S   Jun 30 06:11:24 ora_p027_anbob3
zzz ***Sat Jul 9 05:48:29 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169956404 poll_s S   Jun 30 06:11:29 ora_p027_anbob3
zzz ***Sat Jul 9 05:49:00 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169956408 poll_s S   Jun 30 06:11:35 ora_p027_anbob3
zzz ***Sat Jul 9 05:49:30 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169958472 ? R   Jun 30 06:11:44 ora_p027_anbob3
zzz ***Sat Jul 9 05:50:00 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169958476 ? R   Jun 30 06:11:54 ora_p027_anbob3
zzz ***Sat Jul 9 05:50:30 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169958496 poll_s S   Jun 30 06:12:03 ora_p027_anbob3
zzz ***Sat Jul 9 05:51:00 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169958688 synchr D   Jun 30 06:12:08 ora_p027_anbob3
zzz ***Sat Jul 9 05:51:30 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169958832 synchr D   Jun 30 06:12:09 ora_p027_anbob3
zzz ***Sat Jul 9 05:52:00 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169958968 synchr D   Jun 30 06:12:10 ora_p027_anbob3
zzz ***Sat Jul 9 05:52:30 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169958916 synchr D   Jun 30 06:12:12 ora_p027_anbob3
zzz ***Sat Jul 9 05:53:00 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169959140 synchr D   Jun 30 06:12:13 ora_p027_anbob3


$ egrep '^zzz|ora_p027' anbob3_ps_22.07.09.0600.dat                                                             
zzz ***Sat Jul 9 06:00:01 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169969468 ? R   Jun 30 06:12:28 ora_p027_anbob3
zzz ***Sat Jul 9 06:00:31 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169970548 synchr D   Jun 30 06:12:29 ora_p027_anbob3
zzz ***Sat Jul 9 06:01:01 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169971792 synchr D   Jun 30 06:12:30 ora_p027_anbob3
zzz ***Sat Jul 9 06:01:31 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169973676 synchr D   Jun 30 06:12:31 ora_p027_anbob3
zzz ***Sat Jul 9 06:02:01 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169975644 synchr D   Jun 30 06:12:32 ora_p027_anbob3
zzz ***Sat Jul 9 06:02:31 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169980104 synchr D   Jun 30 06:12:33 ora_p027_anbob3
zzz ***Sat Jul 9 06:03:01 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169981468 synchr D   Jun 30 06:12:33 ora_p027_anbob3
zzz ***Sat Jul 9 06:03:31 CST 2022
oracle    23539      1  19  2.7 16.0 263043928 169982628 blockd D   Jun 30 06:12:34 ora_p027_anbob3
zzz ***Sat Jul 9 06:04:02 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169983820 synchr D   Jun 30 06:12:35 ora_p027_anbob3
zzz ***Sat Jul 9 06:04:32 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169985096 synchr D   Jun 30 06:12:35 ora_p027_anbob3
zzz ***Sat Jul 9 06:05:02 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169987172 synchr D   Jun 30 06:12:36 ora_p027_anbob3
zzz ***Sat Jul 9 06:05:32 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169988824 synchr D   Jun 30 06:12:37 ora_p027_anbob3
zzz ***Sat Jul 9 06:06:02 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169989524 synchr D   Jun 30 06:12:38 ora_p027_anbob3
zzz ***Sat Jul 9 06:06:32 CST 2022
oracle    23539      1  19  2.7 16.0 263044052 169989864 synchr D   Jun 30 06:12:40 ora_p027_anbob3
...

	行 83871: oracle   119729      1  19  5.2 12.9 263064632 136586392 blockd D   Jul 05 04:07:02 ora_p009_anbob4
	行 89096: oracle   119729      1  19  5.2 12.9 263064632 136586456 blockd D   Jul 05 04:07:08 ora_p009_anbob4
	行 94320: oracle   119729      1  19  5.2 12.9 263064632 136586508 blockd D   Jul 05 04:07:13 ora_p009_anbob4
	行 99543: oracle   119729      1  19  5.2 12.9 263064632 136586568 blockd D   Jul 05 04:07:18 ora_p009_anbob4
	行 104762: oracle   119729      1  19  5.2 12.9 263064632 136586624 ? R   Jul 05 04:07:23 ora_p009_anbob4
	行 110001: oracle   119729      1  19  5.2 12.9 263064632 136586700 blockd D   Jul 05 04:07:30 ora_p009_anbob4
	行 115238: oracle   119729      1  19  5.2 12.9 263064640 136587044 ? R   Jul 05 04:07:36 ora_p009_anbob4
	行 120458: oracle   119729      1  19  5.2 12.9 263064640 136587220 synchr D   Jul 05 04:07:39 ora_p009_anbob4
	行 125681: oracle   119729      1  19  5.2 12.9 263064764 136587572 synchr D   Jul 05 04:07:39 ora_p009_anbob4
	行 130894: oracle   119729      1  19  5.2 12.9 263064632 136587596 blockd D   Jul 05 04:07:39 ora_p009_anbob4
	行 136106: oracle   119729      1  19  5.2 12.9 263064640 136587844 synchr D   Jul 05 04:07:40 ora_p009_anbob4
	行 141315: oracle   119729      1  19  5.2 12.9 263064764 136588132 synchr D   Jul 05 04:07:41 ora_p009_anbob4
	行 146533: oracle   119729      1  19  5.2 12.9 263064764 136588312 synchr D   Jul 05 04:07:41 ora_p009_anbob4
	行 151745: oracle   119729      1  19  5.2 12.9 263064764 136588488 synchr D   Jul 05 04:07:42 ora_p009_anbob4
	行 156959: oracle   119729      1  19  5.2 12.9 263064764 136588636 synchr D   Jul 05 04:07:42 ora_p009_anbob4
	行 162175: oracle   119729      1  19  5.2 12.9 263064764 136589868 synchr D   Jul 05 04:07:43 ora_p009_anbob4
	行 167398: oracle   119729      1  19  5.2 12.9 263064764 136589940 synchr D   Jul 05 04:07:44 ora_p009_anbob4
	行 172646: oracle   119729      1  19  5.2 12.9 263064640 136590328 synchr D   Jul 05 04:07:45 ora_p009_anbob4
	行 177881: oracle   119729      1  19  5.2 12.9 263064640 136590480 synchr D   Jul 05 04:07:45 ora_p009_anbob4
	行 183109: oracle   119729      1  19  5.2 12.9 263064764 136590852 synchr D   Jul 05 04:07:45 ora_p009_anbob4
	行 188344: oracle   119729      1  19  5.2 12.9 263064632 136590872 blockd D   Jul 05 04:07:46 ora_p009_anbob4
	行 193567: oracle   119729      1  19  5.2 12.9 263064764 136591096 synchr D   Jul 05 04:07:46 ora_p009_anbob4
	行 198787: oracle   119729      1  19  5.2 12.9 263064764 136591264 synchr D   Jul 05 04:07:47 ora_p009_anbob4
	行 204007: oracle   119729      1  19  5.2 12.9 263064640 136591312 synchr D   Jul 05 04:07:47 ora_p009_anbob4
	行 209240: oracle   119729      1  19  5.2 12.9 263064764 136591608 synchr D   Jul 05 04:07:48 ora_p009_anbob4
	行 214467: oracle   119729      1  19  5.2 12.9 263064764 136591780 synchr D   Jul 05 04:07:48 ora_p009_anbob4
	行 219707: oracle   119729      1  19  5.2 12.9 263064764 136591952 synchr D   Jul 05 04:07:49 ora_p009_anbob4

NOTE:
从osw ps每30秒快照可见存在近1-2个小时并行进程连续处于”D” 状态。

“D” 状态进程

A process in Linux can be in several states: running, sleeping, etc. Running process runs on a CPU just now, sleeping process waits for its turn on CPU or for some other event. First big S stands for Sleeping, R stands for running (“+” means that the process is foreground and small “s” means that the process is session leader, but it is not relevant for this article).

D state occurs then the process is in uninterruptible sleep,Processes in a “D” or uninterruptible sleep state are usually waiting on I/O. The ps command shows a “D” on processes in an uninterruptible sleep state. This state is bad, because you can’t do anything with the process in D state. Fortunately, process normally remains in such state not for so long. But if you have a heap of D state processes then some logic in system is disrupt. If that is happening, the very important thing is to determine where this unlucky sleep occurs. It is easy to do with ps command with l option. WCHAN column shows the name of the kernel function where the process is sleeping,You cannot kill “D” state processes, even with SIGKILL or kill -9. As the name implies, they are uninterruptible. You can only clear them by rebooting the server or waiting for the I/O to respond.

“D”状态进程通常是在等待I/O,无法终止只到i/o返回, 出现该问题时通常查看WCHAN列判断内核调用函数。但是像本安例中能确认是synchr开头,显示不完整,查看以synchr开头的所有函数。

[oracle@oel7db1 ~]$ cat /boot/System.map-$(uname -r)|awk '$3 ~ "^synchr"'
ffffffff810fd130 T synchronize_hardirq
ffffffff810fd240 T synchronize_irq
ffffffff81106ed0 t synchronize_rcu
ffffffff81108b30 T synchronize_srcu_expedited
ffffffff81108b60 T synchronize_srcu
ffffffff8110ac80 T synchronize_sched_expedited
ffffffff8110acb0 T synchronize_sched
ffffffff8110ad70 T synchronize_rcu_bh
ffffffff8110adf0 T synchronize_rcu_expedited
ffffffff811f7620 t synchronous_wake_function
ffffffff8170e630 T synchronize_net

[oracle@oel7db1 ~]$ cat /boot/System.map-$(uname -r)|awk '$3 ~ "^blockd"'
ffffffff8264a3f0 D blockdev_superblock

因为历史无法再查看,可以查看当前问题节点是否存在synchr开头进程。

# ps -eo pid,tid,class,state,pcpu,wchan:30,comm|grep ora_|awk '$4="D"&& $6 ~ "sync"'

发现存在几个D状态的oracle server进程,函数为synchronize_sched

-/**
– * synchronize_sched – block until all CPUs have exited any non-preemptive
– * kernel code sequences.
– *
– * This means that all preempt_disable code sequences, including NMI and
– * hardware-interrupt handlers, in progress on entry will have completed
– * before this primitive returns. However, this does not guarantee that
– * softirq handlers will have completed, since in some kernels, these
– * handlers can run in process context, and can block.
– *
– * This primitive provides the guarantees made by the (now removed)
– * synchronize_kernel() API. In contrast, synchronize_rcu() only
– * guarantees that rcu_read_lock() sections will have completed.
– * In “classic RCU”, these two guarantees happen to be one and
– * the same, but can differ in realtime RCU implementations.
– */
-#define synchronize_sched() __synchronize_sched()

问题原因

不确认当时CPU在做什么, 或是内核存在逻辑缺陷原因, 至少这样可以解释,在数据库层看到的长时间 ON CPU,是因为OS 层的进程处理D 状态,一直在等待内核某个调用完成。

OS层的内核调用未响应,导致DB 层会话为on cpu状态,SQL运行时间增加,直到OS响应后自动恢复。

解决方案

建议找主机工程师或存储工程师分析问题时间点的存储性能 或 OS是否有瓶颈。