Active Session History (ASH)视图以及实表是 ORALCE 数据库提供的一个十分有价值的调优工具。
ASH 提供两个细粒度的视图:V$ACTIVE_SESSION_HISTORY
和 DBA_HIST_ACTIVE_SESS_HISTORY
。V$ACTIVE_SESSION_HISTORY
是 1 秒钟采样 1 次的动静视图,DBA_HIST_ACTIVE_SESS_HISTORY
是 10 秒 1 次采样,存储到实表(WRH$_ACTIVE_SESSION_HISTORY)中的流动 SESSION 历史数据。
对于 ASH 数据的采样逻辑和关联的 PROCESS,我会在当前的文章里阐明。
上面我用一个简略的例子来阐明如何通过 ASH 数据考察 CPU 使用率高的问题。
客户问题形容
9 个节点形成的 RAC 环境中,有一个节点在下列时间段 CPU 使用率偏高,同时呈现以下待机事件。
【日時】2020/12/01
①12:00 ~ 13:00
②19:00 ~ 21:00
③22:00 ~ 23:00【待机事件】latch: row cache objects
enq: US - contention
enq: SQ - contention
为了确认第一个时间段(12:00~13:00)内“ON CPU”的解决内容,我查看了 ASH 数据的“SESSION_STATE=’ON CPU’”的输入。
SQL> select substr(to_char(SAMPLE_TIME,'yyyy/mm/dd hh24:mi'),1,15) aa,SESSION_STATE,SQL_OPNAME,PROGRAM,count(*)
from m_dba_hist_active_sess_history
where INSTANCE_NUMBER=5
and SESSION_STATE='ON CPU'
and to_char(SAMPLE_TIME,'yyyy/mm/dd hh24')='2020/12/01 12'
group by substr(to_char(SAMPLE_TIME,'yyyy/mm/dd hh24:mi'),1,15),SESSION_STATE,SQL_OPNAME,PROGRAM
order by substr(to_char(SAMPLE_TIME,'yyyy/mm/dd hh24:mi'),1,15);
2 3 4 5 6 7
AA SESSION_STATE SQL_OPNAME PROGRAM COUNT(*)
------------------------------ -------------------- --------------- ------------------------------ ----------
2020/12/01 12:0 ON CPU INSERT JDBC Thin Client 6
2020/12/01 12:0 ON CPU SELECT JDBC Thin Client 232
2020/12/01 12:0 ON CPU SELECT oracle@db215jln (PZ99) 1
2020/12/01 12:0 ON CPU SELECT python@db215jln (TNS V1-V3) 2
2020/12/01 12:0 ON CPU UPDATE JDBC Thin Client 1
2020/12/01 12:0 ON CPU UPDATE oracle@db215jln (SMON) 1
2020/12/01 12:0 ON CPU JDBC Thin Client 8
2020/12/01 12:0 ON CPU oracle@db215jln (DIA0) 1
2020/12/01 12:0 ON CPU oracle@db215jln (LCK0) 1
2020/12/01 12:0 ON CPU oracle@db215jln (LMD0) 1
2020/12/01 12:0 ON CPU oracle@db215jln (LMON) 1
2020/12/01 12:0 ON CPU oracle@db215jln (LMS0) 2
2020/12/01 12:0 ON CPU oracle@db215jln (LMS1) 1
2020/12/01 12:1 ON CPU INSERT JDBC Thin Client 13
2020/12/01 12:1 ON CPU PL/SQL EXECUTE JDBC Thin Client 3
2020/12/01 12:1 ON CPU SELECT JDBC Thin Client 249
2020/12/01 12:1 ON CPU UPDATE oracle@db215jln (SMON) 1
2020/12/01 12:1 ON CPU JDBC Thin Client 10
2020/12/01 12:1 ON CPU oracle@db215jln (DIA0) 1
2020/12/01 12:1 ON CPU oracle@db215jln (LCK0) 1
2020/12/01 12:1 ON CPU oracle@db215jln (LGWR) 3
2020/12/01 12:1 ON CPU oracle@db215jln (LMD0) 1
2020/12/01 12:1 ON CPU oracle@db215jln (LMS0) 5
2020/12/01 12:1 ON CPU oracle@db215jln (LMS1) 2
2020/12/01 12:1 ON CPU oracle@db215jln (PSP0) 1
2020/12/01 12:2 ON CPU INSERT JDBC Thin Client 34
2020/12/01 12:2 ON CPU SELECT JDBC Thin Client 317
2020/12/01 12:2 ON CPU UPDATE JDBC Thin Client 1
2020/12/01 12:2 ON CPU JDBC Thin Client 11
2020/12/01 12:2 ON CPU oracle@db215jln (DIA0) 2
2020/12/01 12:2 ON CPU oracle@db215jln (LCK0) 2
2020/12/01 12:2 ON CPU oracle@db215jln (LGWR) 2
2020/12/01 12:2 ON CPU oracle@db215jln (LMS1) 1
2020/12/01 12:3 ON CPU INSERT JDBC Thin Client 25
2020/12/01 12:3 ON CPU SELECT JDBC Thin Client 335
2020/12/01 12:3 ON CPU SELECT oracle@db215jln (PZ99) 2
2020/12/01 12:3 ON CPU UPDATE JDBC Thin Client 2
2020/12/01 12:3 ON CPU UPDATE oracle@db215jln (SMON) 1
2020/12/01 12:3 ON CPU JDBC Thin Client 12
2020/12/01 12:3 ON CPU oracle@db215jln (DBW3) 1
2020/12/01 12:3 ON CPU oracle@db215jln (DIA0) 2
2020/12/01 12:3 ON CPU oracle@db215jln (LGWR) 3
2020/12/01 12:3 ON CPU oracle@db215jln (LMD0) 1
2020/12/01 12:3 ON CPU oracle@db215jln (LMON) 1
2020/12/01 12:3 ON CPU oracle@db215jln (LMS0) 4
2020/12/01 12:3 ON CPU oracle@db215jln (LMS1) 2
2020/12/01 12:4 ON CPU INSERT JDBC Thin Client 90
2020/12/01 12:4 ON CPU PL/SQL EXECUTE JDBC Thin Client 2
2020/12/01 12:4 ON CPU SELECT JDBC Thin Client 407
2020/12/01 12:4 ON CPU SELECT oracle@db215jln (PZ99) 3
2020/12/01 12:4 ON CPU SELECT python@db215jln (TNS V1-V3) 1
2020/12/01 12:4 ON CPU UPDATE JDBC Thin Client 5
2020/12/01 12:4 ON CPU UPDATE oracle@db215jln (SMON) 1
2020/12/01 12:4 ON CPU JDBC Thin Client 13
2020/12/01 12:4 ON CPU oracle@db215jln (DBW3) 1
2020/12/01 12:4 ON CPU oracle@db215jln (DIA0) 1
2020/12/01 12:4 ON CPU oracle@db215jln (LCK0) 1
2020/12/01 12:4 ON CPU oracle@db215jln (LMS0) 1
2020/12/01 12:4 ON CPU oracle@db215jln (LMS1) 1
2020/12/01 12:5 ON CPU INSERT JDBC Thin Client 171
2020/12/01 12:5 ON CPU SELECT JDBC Thin Client 424 ★
2020/12/01 12:5 ON CPU UPDATE JDBC Thin Client 2
2020/12/01 12:5 ON CPU JDBC Thin Client 9
2020/12/01 12:5 ON CPU oracle@db215jln (DBW1) 1
2020/12/01 12:5 ON CPU oracle@db215jln (DIA0) 2
2020/12/01 12:5 ON CPU oracle@db215jln (LCK0) 3
2020/12/01 12:5 ON CPU oracle@db215jln (LMD0) 1
2020/12/01 12:5 ON CPU oracle@db215jln (LMS0) 4
2020/12/01 12:5 ON CPU oracle@db215jln (LMS1) 2
69 行が選択されました。
通过下面的后果,咱们能够看出在每个10分钟内,“PROGRAM =’JDBC Thin Client’”的“SELECT”解决数是比拟多的。导致这样的状况通常有两种起因:雷同的解决被大量的施行,或者不同的解决被同时施行。为了确认客户环境的具体起因,我又应用了上面的 SQL 文:
SQL> select SQL_ID,count(*)
from m_dba_hist_active_sess_history
where INSTANCE_NUMBER=5
and SESSION_STATE='ON CPU'
and PROGRAM='JDBC Thin Client'
and to_char(SAMPLE_TIME,'yyyy/mm/dd hh24')='2020/12/01 12'
group by SQL_ID
order by count(*) desc;
SQL_ID COUNT(*)
------------------ ----------
7f3a4khpu7n25 164 ★
1fa2urjuhszw0 112 ★
4f72h6sug6vah 75
7au5hjhjz8nd1 68
63
gmrv0dahmkhg6 58
0x1wyyvgkwx4g 49
ataahn09x2qr2 47
8mpsb34rxj96w 41
a0wsrytjhnncz 37
4wn22n0t23x8f 28
47ha0qjatpapp 28
2ppp78vj7ac34 28
273srycwymvpy 24
8037vz8n5t4j4 23
d94xfcs7yzwwn 21
19rf604u0dycw 21
6r4216jcwbyp2 21
9dqkydrfrpgm2 21
3d9pv0n2vsfp5 20
b9yjdusam9wp2 19
d9f8yxm8r3k3r 17
7mg7gtjwp644w 17
f7tqxnbcvv2ah 17
aszugq4dt7qcc 17
a97t6fkmquuj1 17
f21uh36n93rzv 16
1dg8hng84mrnc 15
bu51ut3y2ttr2 15
09u5mfdu2dyau 15
19d5qmbdwg028 15
4uf4x7zz96ban 15
2t21r20y0a3k7 15
65m1gs66zhw7z 14
05uya8bx3u382 14
ayknqa5wkd9zp 14
6ytwz7bgkbksc 14
bk3q8xpbr46n8 14
3kf4b3s3bdzaf 13
6z1hf4txv7f8c 13
438r3mjyuht18 12
8c1h7xwtm6gzv 12
fu9y7cmx4wy98 12
fgdtg91uuds65 12
4f96jfgdrwxgf 11
09yxbt27kpbq4 11
bghzspvbjh2vm 10
5xkjqnuqkbg2b 10
6za6t3kv5c7mj 10
fudk908tvjdfy 10
…略…
通过下面的后果,咱们根本能够确认这个问题的起因就是在特定的时间段内通过“JDBC Thin Client”发行的业务解决过多,并不是遇到了 Bug。
当然,在得出这个论断之前,咱们也确认了以下两点:
1. 在客户提到的时间段之外,通过“JDBC Thin Client”发行的业务解决数较少。2. 在客户提到的另外两个时间段,也确认到了 12:00 到 13:00 之间的景象。
最初,这只是一个利用 ASH 剖析性能问题的小例子,ASH 作为 ORACLE 数据库能提供的粒度最细的历史数据,还有许多实用的办法。如果想要灵便应用这些数据,笔者举荐仔细阅读 ASH 数据的每一个字段。