等待度量vs等待事件



以下是对不同类型的指标视图的快速表格比较

metric_tables.

表的第一行是经典的等待事件和统计视图。以下行是度量标准视图。在Oracle 10g中引入了公制视图。

为什么指标很好

度量标准视图计算增倍和速率,它大大简化了回答简单问题的能力,如“现在我的数据库上的I / O率是什么?”在10G之前,这个问题令人惊讶地令人痛快。要回答问题,可以查询v $ sysstat:

Select value from v$sysstat where name=’physical reads’;

但是,查询V $ SYSSTAT刚刚无法回答这个问题,而是回答问题“自数据库开始以来已经完成了多少I / O?”要回答原始问题,可以将V $ SYSSTAT两次查询并在两个值之间取三角点:

  • 占据一段价值
  • 在时间拍摄
  • delta =(b-a)
  • 和/或获得率=(b-a)/经过时间

获得这些德国和利率可能是一个讨厌的任务,特别是通过电话与客户合作。然后,10G Oracle推出了在一个查询中回答问题的公制表。

使用等待指标

时间经营理念。

度量标准视图适用于等待事件以及统计信息。在未来的帖子中,我们将过度统计数据。在这个帖子中,我们将越过等待活动。可用于分析等待事件的视图数量可能会令人困惑。这篇文章的重点是阐明可用的不同视图以及如何使用的视图。

等待事件视图(在系统级别)

  • v $ system_event.  - 自启动以来等待事件累积
  • V $ FEMPETRIC.  - 等待60秒的等待活动Deltas
  • dba_hist_system_event.  - 上周的快照(小时)等待活动,自启动以来累积

等待事件卷起为名为wait类的组。对于等待类,我们有以下视图:

  • v $ system_wait_class.  - 自启动以来累积
  • v $ waitclassmetric.  - 最后60秒Δdeltas
  • v $ waitclassmetric_history.  - 最后一小时的60秒Δdeltas

笔记 :dba_hist_waitclassmetric_history. 用于警报和或基线而不是日常值。

使用等待延迟的等待事件指标

我对I / O延迟使用等待事件指标。

我不令人惊讶的是’T提到使用等待识别系统上的瓶颈和负载。对于系统上的瓶颈和负载数据 v $ active_session_history. (由于几个原因可能会更好。一个数据 是多模体,所以它可以由SQL和Session分组,也可以从中衍生CPU信息 。 CPU信息不在事件/ waitClass视图中,但在 随着等待的等待。

第二部分,延迟,特别是I / O延迟,只能在等待事件和等待条件视图中使用(以及每个文件的FILESTAT视图)

用户I / O延迟等待类

一种使用等待度量的使用是确定所有各种读取I / O和读取大小的平均读取I / O:

select 10*time_waited/nullif(wait_count,0) avg_io_ms -- convert centi-seconds to milliseconds
from   v$waitclassmetric  m
       where wait_class_id= 1740759767 --  User I/O
/
 AVG_IO_MS
----------
     8.916

v一个问题$ waitclassmetric. 是那个领域 wait_class. 名称不在视图中,所以我们要么必须使用 wait_class_id. (名称的哈希)如上所述或加入 v $ system_wait_class. as below

select
        10*m.time_waited/nullif(m.wait_count,0) avgms -- convert centisecs to ms
from   v$waitclassmetric  m,
       v$system_wait_class n
where m.wait_class_id=n.wait_class_id
  and n.wait_class='User I/O'
/
 AVG_IO_MS
----------
     8.916

另一个问题是11gr2的文件说明了 time_waited. 是微秒,但在我的测试中它实际上是centisecs

 desc V$SYSTEM_WAIT_CLASS
Name                                        Type
-----------------------------------------  ----------------------------
WAIT_CLASS_ID                                NUMBER
WAIT_CLASS#                                  NUMBER
WAIT_CLASS                                   VARCHAR2(64)
TOTAL_WAITS                                  NUMBER
TIME_WAITED                                  NUMBER  - centi-seconds

你可以获得所有的列表 wait_class. 在视图中的名称 v $ system_wait_class。  

 select wait_class_id , wait_class from V$SYSTEM_WAIT_CLASS ;

WAIT_CLASS_ID WAIT_CLASS
------------- ----------------------------------------------------------------
   1893977003 Other
   4217450380 Application
   3290255840 Configuration
   4166625743 Administrative
   3875070507 Concurrency
   3386400367 Commit
   2723168908 Idle
   2000153315 Network
   1740759767 User I/O
   4108307767 System I/O

特定I / O等待事件的延迟

对于特定的I / O延迟,有两种选择 - V $ EVENTMETRIC和V $ SYSTEM_EVENT。使用v $ system_event,它需要运行多个查询并拍摄Δ,但Δ已在V $ FemperMedric中计算。以下是从V $ femmedric获取I / O延迟的示例

过去一分钟的延迟

col name for a25
select m.intsize_csec,
       n.name ,
       round(m.time_waited,3) time_waited,
       m.wait_count,
       round(10*m.time_waited/nullif(m.wait_count,0),3) avgms
from v$eventmetric m,
     v$event_name n
where m.event_id=n.event_id
  and n.name in (
                  'DB文件顺序读取',
                  'db file scattered read',
                  'direct path read',
                  'direct path read temp',
                  'direct path write',
                  'direct path write temp',
                  'log file sync',
                  'log file parallel write'
)
/
INTSIZE_CSEC NAME                      TIME_WAITED WAIT_COUNT      AVGMS
------------ ------------------------- ----------- ---------- ----------
        6017 log file parallel write         2.538          4      6.345
        6017 log file sync                   2.329          1     23.287
        6017 DB文件顺序读取             0          0
        6017 db file scattered read              0          0
        6017 direct path read                    0          0
        6017 direct path read temp               0          0
        6017 direct path write                   0          0
        6017 direct path write temp              0          0

针对特定I / O等待事件的每个小时平均延迟

select
       btime,
       round((time_ms_end-time_ms_beg)/nullif(count_end-count_beg,0),3) avg_ms
from (
select
       to_char(s.BEGIN_INTERVAL_TIME,'DD-MON-YY HH24:MI')  btime,
       total_waits count_end,
       time_waited_micro/1000 time_ms_end,
       Lag (e.time_waited_micro/1000)
              OVER( PARTITION BY e.event_name ORDER BY s.snap_id) time_ms_beg,
       Lag (e.total_waits)
              OVER( PARTITION BY e.event_name ORDER BY s.snap_id) count_beg
from
       dba_hist_system_event. e,
       DBA_HIST_SNAPSHOT s
where
         s.snap_id=e.snap_id
   and e.event_name like '%&1%'
order by begin_interval_time
)
order by btime
/
BTIME               AVG_MS
--------------- ----------
20-JUL-11 06:00      5.854
20-JUL-11 07:00      4.116
20-JUL-11 08:00     21.158
20-JUL-11 09:02      5.591
20-JUL-11 10:00      4.116
20-JUL-11 11:00      6.248
20-JUL-11 12:00     23.634
20-JUL-11 13:00     22.529
20-JUL-11 14:00      21.62
20-JUL-11 15:00     18.038
20-JUL-11 16:00     23.127

I / O请求的大小是多少?

查看I / O潜伏期的一个问题正在确定I / O大小。如果在一个地方有I / O计数,大小和延迟存在的视图,那就太棒了。 Ash确实具有此信息,但ASH数据被加权到较长的延迟和大小,而不是平均值。必须从系统统计数据中获得平均大小。 “DB文件顺序读取”的I / O大小是单块读取,因此可以确定单个值,但其他读取事件的大小可以不同。为了获得I / O大小的一般思想,可以使用系统统计数据在所有I / O中平均平均

平均I / O尺寸(跨所有I / O等待)

select
          sum(decode(metric_name,'Physical Reads Per Sec',value,0))*max(intsize_csec)/100  blocks_read,
          nullif(sum(decode(metric_name,'Physical Read IO Requests Per Sec',value,0)),0)*max(intsize_csec)/100  reads,
            sum(decode(metric_name,'Physical Reads Per Sec',value,0))/
          nullif(sum(decode(metric_name,'Physical Read IO Requests Per Sec',value,0)),0) avg_blocks_read
from v$sysmetric
where group_id = 2  -- 60 second deltas only (not the 15 second deltas);

BLOCKS_READ      READS AVG_BLOCKS_READ
----------- ---------- ---------------
       4798       4798               1

 

负载和瓶颈

关于等待类的好处是他们简化了1000多个等待事件,并只是几个等待课程。我们可以在系统上获得快速的负载

select n.wait_class, round(m.time_waited/m.INTSIZE_CSEC,3) AAS
from   v$waitclassmetric  m,
       v$system_wait_class n
where m.wait_class_id=n.wait_class_id
and n.wait_class != 'Idle'
;
WAIT_CLASS             AAS
--------------- ----------
Other                    0
Application              0
Configuration            0
Administrative           0
Concurrency              0
Commit                   0
Network                  0
User I/O              .149
System I/O            .002

但是等待事件和/或等待类视图的大缺点是它们缺乏有关CPU负载的信息。 CPU负载可以在系统统计中找到,但它更容易在一个查询中使用 v $ active_session_history.。这是一个使用的查询 计算 AAS. 在过去60秒内加载数据库:

select
            round(count(*)/secs.var,3)     AAS,
            decode(session_state,'ON CPU','CPU',wait_class)  wait_class
       from v $ active_session_history. ash,
            (select 60 var from dual)  secs
       where
            SAMPLE_TIME > sysdate - (secs.var/(24*60*60)) and
            SESSION_TYPE = 'FOREGROUND'
       group by decode(session_state,'ON CPU','CPU',wait_class) , secs.var
/
      AAS WAIT_CLASS
---------- ---------------
      .016 Concurrency
      .001 Network
         0 Other
      .083 Configuration
      .001 Administrative
      .034 CPU
         0 System I/O
      .001 Commit
      .054 Application
         0 User I/O

虽然使用V $ SYSMETRIC,但它非常容易加入V $ WAYCLASSMETRIC

  select n.wait_class, round(m.time_waited/m.INTSIZE_CSEC,3) AAS
   from   v$waitclassmetric  m,
          v$system_wait_class n
   where m.wait_class_id=n.wait_class_id
   and n.wait_class != 'Idle'
  union
   select  'CPU', round(value/100,3) AAS from v$sysmetric where metric_name='CPU Usage Per Sec' and group_id=2 ;
WAIT_CLASS                                                              AAS
---------------------------------------------------------------- ----------
Administrative                                                            0
Application                                                            .009
CPU                                                                   1.696
Commit                                                                    0
Concurrency                                                            .001
Configuration                                                             0
Network                                                                .002
Other                                                                     0
System I/O                                                                0
User I/O                                                                  0

并向查询添加V $ sysmetric允许我做一些我一直想要的东西,它是在AAS中包含OS CPU

 select n.wait_class, round(m.time_waited/m.INTSIZE_CSEC,3) AAS
   from   v$waitclassmetric  m,
          v$system_wait_class n
   where m.wait_class_id=n.wait_class_id
   and n.wait_class != 'Idle'
  union
   select  'CPU', round(value/100,3) AAS from v$sysmetric where metric_name='CPU Usage Per Sec' and group_id=2
  union
   select 'CPU_OS', round((prcnt.busy*parameter.cpu_count)/100,3) - aas.cpu
  from
  ( select value busy from v$sysmetric where metric_name='Host CPU Utilization (%)' and group_id=2 ) prcnt,
  ( select value cpu_count from v$parameter where name='cpu_count' )  parameter,
  ( select  'CPU', round(value/100,3) cpu from v$sysmetric where metric_name='CPU Usage Per Sec' and group_id=2) aas
;
WAIT_CLASS                                                              AAS
---------------------------------------------------------------- ----------
Administrative                                                            0
Application                                                               0
CPU                                                                    .009
CPU_OS                                                                 .024
Commit                                                                    0
Concurrency                                                               0
Configuration                                                             0
Network                                                                .002
Other                                                                     0
System I/O                                                                0
User I/O                                                                  0

使用灰烬的一个巨大损失是等待CPU但不在CPU上运行的信息用户的丢失。

进一步阅读看

 

09-45-55-583_950x510

 

8 thoughts on “等待度量vs等待事件

  • 2014年1月6日在下午2:43
    永久链接

    嗨凯尔,
    如果我们计算dba_hist_system_event.的平均单块读取延迟(事件“DB文件顺序读取”)通过从OEM Metric Instance_Throughupputev_sync_singleBlk_Read_Latency进行比较结果:例如通过从Mgmt $ Metric_hourly选择每小时聚合),您是否同意这些应该与相同的数量级?
    谢谢,
    短剑

  • 2014年1月6日在下午2:53
    永久链接

    嗨德克–似乎是一个合理的期望。我希望这两幅度相同。我不’知道他们在哪里获得AVG_Sync_singleBlk_Read_Latency,但我的猜测将来自“DB文件顺序读取”。我认为avg_sync_singleblk_read_latency用于有时在addm上显示的慢速I / O上的警报。这两个价值是你的两个价值吗?
    – Kyle

  • 2014年1月6日在下午3:28
    永久链接

    kyle.–谢谢你的快速反应。根据Oracle文档(OEM度量标准参考手册)AVG_SYNC_SUTELEBLK_READ_LATINGS的源是V $ SYSMETRIC。问题是他们根本不是排队。手册表明该单位是毫秒,但我的印象是它可能在几秒钟内。以下输出给出了System_Event结果(仅限列AVG_AWR中的平均值)和OEM AVG_SYNC_SINGLEBLK_READ_LATING结果(平均,最小,最大和STDDEV),其中我已经乘以1000:

    Day_hour avg_awr 1000 * o.average 1000 * o.minimum 1000 * O.maximum stddev
    ———– ———- ————– ————– ————– ———-
    20140103 11 2.98452857 0 0 0 0
    20140103 12 3.17543701 0 0 0 0
    20140103 13 3.37031967 0 0 0 0
    20140103 14 2.70659531 0 0 0 0
    20140103 15 3.63222293 0 0 0 0
    20140103 16 4.48239286 1.14155251 0 6.84931507 .002796221
    20140103 17 4.26423932 0 0 0 0
    20140103 18 2.76167290 0 0 0 0
    20140103 19 5.04911055 0 0 0 0
    20140103 20 6.14038053 0 0 0 0
    20140103 21 16.6222783 1.68350168 0 10.1010101 .004123720
    20140103 22 3.23683648 2.76195298 0 5.46448087 .002461324
    20140103 23 1.48303086 0 0 0 0
    20140104 00 .200790547 .204044620 0.704044620 0 .705218618 .000321540
    20140104 01 .335566413 0 1.99203187 .000811544
    20140104 02 2.67060558 0.641025641 0 3.84615385 3.84615385 .001570186
    20140104 03 5.26931969 .538502962 0 3.23101777。200131777 .001319057
    20140104 04 4.99572549 0 0 0 0
    20140104 05 4.89646314 0 0 0 0
    20140104 06 2.34470897 2.59031822 0 11.3636364。
    20140104 07 3.74348815 0 0 0 0

    顺便说一下,数据库来自A是11.1.0.7,OEM版本为12C。
    短剑

  • 2014年1月6日在下午3:41
    永久链接

    kyle.–我在MOS上发现了两个Oracle错误,可能会解释单位问题:11781682和17299711.但即使那时我得到的数字也不是很接近,有很多零’s reported by OEM.
    短剑

  • 2014年1月6日在下午3:44
    永久链接

    对不起很多帖子。发现主错误:16310129平均同步单块延迟–吞吐量指标有错误的单位

  • 2014年1月7日在下午6:32
    永久链接

    嗨Dirk,谢谢你对错误的所有信息!– Kyle

  • 2014年5月26日在晚上8:01
    永久链接

    优秀的凯尔,这非常清晰,完全完整。
    这些观点真的是诊断数据库性能问题的伟大来源,并通过采样的数据轻松创建图形。

  • Pingback: 使用Telegraf,涌入和Grafana绘制Oracle性能指标| BDT.'s oracle blog

评论被关闭。