性能优化 ---- ORACLE数据库的ASH

许劭
• 阅读 1751

Active Session History (ASH)视图以及实表是ORALCE数据库提供的一个非常有价值的调优工具。

ASH提供两个细粒度的视图:V$ACTIVE_SESSION_HISTORYDBA_HIST_ACTIVE_SESS_HISTORYV$ACTIVE_SESSION_HISTORY是1秒钟采样1次的动态视图,DBA_HIST_ACTIVE_SESS_HISTORY是10秒1次采样,存储到实表(WRH$_ACTIVE_SESSION_HISTORY)中的活动SESSION历史数据。

关于ASH数据的采样逻辑和关联的PROCESS,可以参考以下。

性能优化 ---- ORACLE数据库的ASH

下面我用一个简单的例子来说明如何通过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数据的每一个字段。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
4年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Wesley13 Wesley13
4年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Wesley13 Wesley13
4年前
RAC环境单实例启动数据库收到ORA
     在RAC环境中,如果你在没有启动节点的集群服务的情况下单实例启动数据库,将收到类似如下的报错:\oracle@rhel1u01\$sqlSQL\Plus:Release10.2.0.5.0ProductiononTueApr215:00:272013Copyright(
Stella981 Stella981
4年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
4年前
Oracle11g中数据库表、索引、视图、同义词的管理(使用OEM工具)(一)
Oracle11g中数据库表、索引、视图、同义词的管理(使用OEM工具)(一)作者介绍:TNTEVE,\狐小E\资深开发工程师,专注移动协同办公平台的SAAS软件开发以及轻应用开发最近开发了一款移动办公软件\狐小E\表的管理1启动OEM$oemctlstartdbconsole!Oracle11g中数据库表
Stella981 Stella981
4年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
许劭
许劭
Lv1
撩乱边愁听不尽,高高秋月照长城。
文章
4
粉丝
0
获赞
0