理论实践:循序渐进理解AWR细致入微分析性能报告

1. AWR 概述

Automatic Workload Repository(AWR) 是10g引入的一个重要组件。在里面存贮着近期一段时间内(默认是7天)数据库活动状态的详细信息。

AWR 报告是对 AWR 视图进行查询而得到的一份自动生成的报告。可以通过下面的脚本手工得到一份 AWR 报告。

wps21B5.tmp

通过 AWR 和 AWR 报告,DBA 可以容易地获知最近数据库的活动状态,数据库的各种性能指标的变化趋势曲线,最近数据库可能存在的异常,分析数据库可能存在的性能瓶颈从而对数据库进行优化。

AWR 报告所有的数据来源于 AWR 视图,即以 DBA_HIST_开头的所有系统表,Database Reference 有对所有这些系统表的描述,这应该是 Oracle 官方对 AWR 报告的官方注释了。而对于如何有效地去分析 AWR 报告,这可能更需要 DBA 经验的日积月累。

AWR的前身是Statspack,Statspack在10g和11g中也有提供,同时和AWR一起做了同步更新,而且Statspack是公开源代码的,因此,关于Statspack的资料,还有Statspack的源代码,都是理解AWR的一个有用的辅助。

本文着重对AWR中的一些要点进行剖析,欢迎一起讨论AWR相关的问题。

2.  DB CPU - CPU负载分析

如果关注数据库的性能,那么当拿到一份 AWR 报告的时候,最想知道的第一件事情可能就是系统资源的利用情况了,而首当其冲的,就是 CPU。

而细分起来,CPU 可能指的是:

1、OS 级的 User%,Sys%, Idle%

2、DB 所占 OS CPU 资源的 Busy%

3、DB CPU 又可以分为前台所消耗的 CPU 和后台所消耗的 CPU

如果数据库的版本是11g,那么很幸运的,这些信息在AWR报告中一目了然:

wps21B6.tmp

wps21C7.tmp

分析上面的图片,我们可以得出下面的结论:

· OS 级的 User%,Sys%,Idle%:

OS 级的 %User 为75.4,%Sys 为2.8,%Idle 为21.2,所以 %Busy 应该是 100-21.1=78.8。

· DB所占OSCPU资源的Busy%

DB占了OS CPU资源的69.1,%Busy CPU则可以通过上面的数据得到:%Busy CPU = %Total CPU/(%Busy) * 100 = 69.1/78.8 * 100 = 87.69,和报告的87.7相吻合。

如果是10g呢,则需要手工对 Report 里的一些数据进行计算了。

Host CPU 的结果来源于 DBA_HIST_OSSTAT,AWR 报告里已经帮忙整出了这段时间内的绝对数据(这里的时间单位是centi second,也就是1/100秒)

wps21C8.tmp

根据上面的数据,稍加计算分析便可得出下面的结果。

· OS级的User%,Sys%, Idle%:

%User = USER_TIME/ (BUSY_TIME+IDLE_TIME)*100 =146355/ (152946+41230)*100 = 75.37

%Sys = SYS_TIME/ (BUSY_TIME+IDLE_TIME)*100=5462/(152946+41230)*100=2.81

%Idle = IDLE_TIME/ (BUSY_TIME+IDLE_TIME)*100=21230/(152946+41230)*100=10.93

值得注意的,这里已经隐含着这个AWR报告所捕捉的两个Snapshot之间的时间长短了。有下面的公式:BUSY_TIME + IDLE_TIME = ELAPSED_TIME * CPU_COUNT

注意:正确的理解这个公式可以对系统CPU资源的使用及其度量的方式有更深一步的理解。

因此ELAPSED_TIME =(152946+41230)/8/100 =  242.72 seconds

至于DB对CPU的利用情况,这就涉及到10g新引入的一个关于时间统计的视图V$SYS_TIME_MODEL,简单而言,Oracle采用了一个统一的时间模型对一些重要的时间指标进行了记录,具体而言,这些指标包括:

1) Background elapsed time

   2) Background CPU time

          3) RMAN CPU time (backup/restore)

1) DB time

   2) DB CPU

   2) Connection management call elapsed time

   2) Sequence load elapsed time

   2) SQL execute elapsed time

   2) Parse time elapsed

          3) Hard parse elapsed time

                4) Hard parse (sharingcriteria) elapsed time

                    5) Hard parse (bindmismatch) elapsed time

          3) Failed parse elapsed time

                4) Failed parse (out of sharedmemory) elapsed time

   2) PL/SQL execution elapsed time

   2) Inbound PL/SQL RPC elapsed time

   2) PL/SQL compilation elapsed time

   2) Java execution elapsed time

   2) Repeated bind elapsed time

这里我们关注的只有和 CPU 相关的两个: Background CPU time 和 DB CPU。

这两个值在 AWR 里面也有记录:

wps21C9.tmp

Total DB CPU = DB CPU + Background CPU time = 1305.89 + 35.91 = 1341.8 seconds

Total DB CPU除以总的 BUSY_TIME + IDLE_TIME可得出% Total CPU。

% Total CPU = 1341.8/1941.76 = 69.1%,这刚好与上面Report的值相吻合。

其实,在 Load Profile 部分,我们也可以看出DB对系统CPU的资源利用情况。

wps21CA.tmp

用 DBC PU per Second 除以 CPU Count 就可以得到 DB 在前台所消耗的 CPU% 了。这里 5.3/8 = 66.25 %比69.1%稍小,说明DB在后台也消耗了大约3%的 CPU,这是不是一个最简单的方法了呢?

3. DB Time – 进程消耗时间分析

DB CPU 是一个用于衡量 CPU 的使用率的重要指标。假设系统有N个 CPU,那么如果 CPU全部处于繁忙状态的话,一秒钟内的 DB CPU 就是N秒。

如何去表征一个系统的繁忙程度呢?除了利用 CPU 进行计算外,数据库还会利用其它计算资源,如网络、硬盘、内存等等,这些对资源的利用同样可以利用时间进行度量。假设系统有M个 Session 在运行,同一时刻,有的 Session 可能在利用 CPU,有的 Session 可能在访问硬盘,那么,在一秒钟内,所有 Session 的时间加起来就可以表征系统在这一秒内的繁忙程度,一般的,这个和的最大值应该为 M。这其实就是 Oracle 提供的另一个重要指标:DB Time,它用以衡量前端进程所消耗的总时间。

对除 CPU 以外的计算资源的访问,Oracle 用等待事件进行描述。同样地,和 CPU 可分为前台消耗 CPU 和后台消耗 CPU一样,等待事件也可以分为前台等待事件和后台等待事件。

DB Time 一般的应该等于DB CPU + 前台等待事件所消耗时间的总和。等待时间通过 V$SYSTEM_EVENT 视图进行统计,DB Time 和 DB CPU 则是通过同一个视图,即V$SYS_TIME_MODEL 进行统计。

Load Profile 一节就有了对 DB Time 的描述:

wps21CB.tmp

这个系统的 CPU 个数是8,因此我们可以知道前台进程用了系统 CPU 的7.1/8=88.75%。 DB Time/s 为11.7,可以看出这个系统是 CPU 非常繁忙的。里面 CPU 占了7.1,则其它前台等待事件占了11.7 –7.1 = 4.6 Wait Time/s。DB CPU 占 DB Time 的比重呢? 7.1/11.7= 60.68%

Top 5 Timed Events,或许很多人都对它有所耳闻,按照 CPU/等待事件占 DB Time 的比例大小,这里列出了 Top 5。如果一个工作负载是 CPU 繁忙型的话,那么在这里应该可以看到 DB CPU 的影子。

wps21CC.tmp

注意到,我们刚刚已经算出了 DB CPU 的 %DB time 为60%左右。

其它的 external table read,direct path write, PX Deq: read credit, PXDeq: Slave Session Stats 这些就是占比重40%的等待事件里的 Top 4了。

回过头再研究下这个 Top 5 Timed Foreground Events,如果先不看 Load Profile,你能说出这个一个 CPU-Bound 的工作负载吗?

答案是否定的,要知道系统 CPU 的繁忙程序,还要知道这个 AWR 所基于两个 Snapshot 的时间间隔,还要知道系统 CPU 的个数。否则,系统可以是一个很 IDLE 的系统呢。记住 CPU 利用率= DB CPU/(CPU_COUNT*Elapsed TIME)。

这个 Top5 给我们的信息只是这个工作负载应该是并行查询,从外部表读取数据,并用 insert append 的方式写入磁盘,同时,主要时间耗费在 CPU 的运算上。

上面提到,DB Time 一般的应该等于 DB CPU + 前台等待事件所消耗时间的总和。在下面有对这三个值的统计:

wps21CD.tmp

· DB CPU = 6474.65

· DB TIME = 10711.2

· FG Wait Time = 1182.63

明显的,DB CPU + FG Wait Time < DB Time,只占了71.5%

其它的28.5%被消耗到哪里去了呢?这里其实又隐含着一个 Oracle 如何计算 DB CPU 和  DB Time 的问题。当 CPU 很忙时,如果系统里存在着很多进程,就会发生进程排队等待 CPU 的现象。在这样,DB TIME 是把进程排队等待 CPU 的时间算在内的,而 DB CPU 是不包括这一部分时间。这是造成 DB CPU + FG Wait Time < DB Time 的一个重要原因。如果一个系统 CPU 不忙,这两者应该就比较接近了。

不要忘了在这个例子中,这是一个 CPU 非常繁忙的系统,而71.5%就是一个信号,它提示着这个系统可能是一个 CPU-Bound 的系统。

4.  IO数据分析

除了 DB CPU、DB Time,或许另一个比较常用的指标应该是 IO 的利用情况。关于 IO 的指标就比较多了,单单在 Load Profile 里面就有5个,在 DB Time 和 DB CPU 的下面:

wps21DD.tmp

这5个指标的值都来自 V$SYSTAT 视图,分别是:

· Redo Size: ‘redo size’

· Logical reads = ’session logical reads’or (’db block gets’ + ‘consistent gets’)

· Blocks Changes = ‘db block changes’

· Physical reads = ‘physical reads’

· Physical writes = ‘physical writes’

具体指标的解释可以参考Database Reference (http://docs.oracle.com/cd/B28359_01/server.111/b28320/stats002.htm)

如何得到系统大致的 MBPS(Megabits Per Second) 呢?

MBPS= (Physical reads + Physical writes) *Block_Size = (196,271.4+2.0)*8*1024/1024/1024 = 1533 MB/s

更准确的 MBPS 可以从 Instance Activity Stats 部分获得。

wps21DE.tmp

Physical IO disk bytes = physical read total bytes+ physical write total bytes

值得注意的是这里 physical write total bytes 大致是 physical write bytes 的两倍。这应该是 physical write total bytes 统计的是磁盘的 IO,而这里,我们做了 ASM,normal redundancy,一份数据写了两遍的原因。

Load Profile 剩下的部分主要是关于各种执行情况的统计,除了 W/A MB processed 来自 V$PGASTAT(单位其实也是 Byte,不是 MB),其它数据都是来自于 V$SYSSTAT。

· Blocks Changes: ‘db block changes’

· User calls: ‘user calls’

· Parses: ‘parse count (total)’

· Hard parses: ‘parse count (hard)’

· Logons: ‘logons cumulative’

· Executes: ‘execute count’

· Rollbacks: ‘user rollbacks’

· Tranasactions: ‘user rollbacks’ + ‘usercommits’

· W/A MB processed: ‘bytes processed’

一般而言,Hard parses < Parses < Executes < User Calls。

AWR 的一般性介绍我想差不多就这些了,其它部分的介绍借助于一些更具体的 AWR 报告进行分析可能会更加方便和清晰。

5. AWR 报告分析 – 实战1

构建 DSS 系统的第一步离不开数据加载,通过文本文件加载是最常见的方式,Oracle 提供了外部表加载的方法,即把一个文本文件当成一个正常的表来进行操作,通过类似 insert /*+ append */ into table select from external_table 的方式进行加载。

数据加载是一个 CPU-Bound 的过程,不过是通过什么工具,external table 也好,sqlldr 也好,imp 也好,impdp 也好。换句话说,如果连数据加载都出现 IO 瓶颈,这个系统的配置就说不过去了。

这个过程的 AWR 报告会是什么样子的呢?

先做个一般的假定,从外部表加载数据到一个本地分区表。

Top 5 Timed Events 类似下面:

wps21DF.tmp

如果去抓取这段时间 DBA_HIST_ACTIVE_SESS_HISTORY 的数据,并转换为图表的话,我们会得到更形象的 Top 10 Wait Events。(如何实现这一步可以参考用 Oracle 实现 ASH 的数据透视图:http://www.cnblogs.com/rootq/archive/2009/09/24/1573200.html)

wps21E0.tmp

enq: HV –contention 是什么东西呢?

在11.2以前,对于分区表的 parallel direct-path load,Oracle 采用的是 brokered load 的方式,即所有的 PX Slaves 共享对每个分区的 high water mark 的访问,通过轮流持有 high water mark 实现对每个 segment 添加新的 blocks。这种方法对于充分利用 extent 的空间是有帮助的,不过带来的问题就是对 high water mark 的竞争,也就是这里的 enq: HV – contention。在执行计划中,这以 RANDOM LOCAL 标记。下面是一个例子:

wps21E1.tmp

一个好消息是,11.2引入了一种新的方式,叫做 PKEY distribution。在这种方式下,一个特定的分区只交给一个或多个特定的 PX slave 负责,这种方式不仅减少了对 high water mark 的争用,而且可以实现 Partition 内更好的压缩率。

6.  AWR报告分析 – 实战2

有一次跟一个 QQ 上的朋友一起探讨了另一个对系统 CPU 进行度量的指标: CPU used by this session。

他刚好有一份 AWR 报告,在这份报告里,出现了严重的 CPU used by this session 和 DB CPU 不一致的现象。

下面是这份报告的一些片断:

wps21F2.tmp

wps21F3.tmp

wps21F4.tmp

wps21F5.tmp

再做进一步的归纳:

OS Busy% =1821080/(1821080+5384293) = 25%

Inst CPU% (using DB CPU) = 8934.22*100/ (1821080+5384293)=12%

Inst CPU% (using CPU used by this session) = 418035/ (1821080+5384293) = 6%

用 CPU used by this session 计算出的 CPU 利用率竟然只是用 DB CPU 计算出来的利用通率的一半!

我的第一个反应是在 Jonathan Lewis 网站看到的一篇相关文章,里面提到了 DB CPU 和 CPU used by this session 计算时的不同之处: (https://jonathanlewis.wordpress.com/2009/05/26/cpu-used/)

“Prior to10g Oracle usually updated time figures at the end of each database call; butfrom 10g there are some views where time is updated more regularly.

The “DB CPU” from v$sess_time_model increases every six seconds, while the “CPU used by this session” from v$sesstat changes only at the end of the test.”

如何验证这一点呢?

在浏览这份报告的 TOP SQL 时,我们发现了下面的现象:

wps21F6.tmp

这是从 SQL ordered by Elapsed Time 截取出来的 Top 3 SQL。TOP 1 的 SQL 用了 DB Time 的30.10%,用了2517s 的 CPU Time。但请注意它的 Executions 的值却为0。也就是说,这里的 CPU Time 是还没有被计算入 CPU used by this session 这个指标里面的。

我们再把2517s加回来,看出误差缩小多少:(251700+418035)/(1821080+5384293) = 9%

这时和用 DB CPU 计算出来的12%还是有1/4的差距。

从这个例子可以看出,用 DB CPU 度量还是比用 CPU usedby this session 来得准确的。特别在有大查询在跑的过程中抓的 AWR,这个误差很有可能会被放大。这是一个有趣的实际例子。

7. 总结

AWR 是分析数据库运行状况的利器,将其运用好可帮助 DBA 提早发现数据库中存在的问题并加以解决。文中主要对 DB CPU、DB Time、IO 等 AWR 报告中的数据进行了分析说明,当然分析AWR报告不能仅限于此,更需要DBA日积月累的经验。希望本文对想了解 AWR 的朋友有一定帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql sql语句书写之面试部分

要求一 :查询时,将用户的手机号码(比如1331234567)显示为133***4567 这是在交流群里看到别人发的一个面试题,我本人非常反感直接在查询时进行处理数据的,查询出来再处理不好吗,但是面试题要求是这样. 这里,简单的写了两个表关联查询,然后把手机号码进行处理显示出来select a.ui…

Redis --数据类型 [1]

一 string 类型 (最简单常用的类型) string是redis最基本的类型&#xff0c;你可以理解成与Memcached一模一样的类型&#xff0c;一个key对应一个value。二 Hash类型(哈希) Redis hash是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。三 List(列…

KestrelServer详解[3]: 自定义一个迷你版的KestrelServer

和所有的服务器一样&#xff0c;KestrelServer最终需要解决的是网络传输的问题。在《KestrelServer详解[2]: 网络连接是如何创建的&#xff1f;》&#xff0c;我们介绍了KestrelServer如何利用连接接听器的建立网络连接&#xff0c;并再次基础上演示了如何直接利用建立的连接接…

c# 文件下载

这样的下载方式 减少服务器的压力&#xff0c; 还有一种省懒劲的方式&#xff1a;后端在iis上配置一个虚拟目录&#xff0c;然后让前端自己拼url地址下载&#xff0c; 这个东西是给后期其他工作人员埋坑&#xff0c;哈哈。 本帖原文转自与 农码一生转载于:https://www.cnbl…

Redis -- 基础操作 [2]

一 获取redis当前数据库符合条件键名 [keys pattern]二 设置string形式key-value [set key value]三 获取存储在指定 key 中字符串的子字符串 [GETRANGE KEY start end]四 删除指定键值对 [del key]五 为给定key设置过期时间 [Expire KEY SECONDS]注: Expireat KEY TIMESTAMP 同…

Centos7作为VNCserver,本地使用VNCViewer连接

1.概念 VNC是一个远程连接工具 VNC is used to display an X windows session running on another computer. Unlike a remote X connection, the xserver is running on the remote computer, not on your local workstation. Your workstation ( Linux or Windows ) is only …

在URL中实现简易的WebAPI验签

本文主要介绍一种与微信公众平台对接方式类似的&#xff0c;为 AspNetCore 提供的一种简易的 WebAPI 签名验证中间件。本文相关源码和案例已开源&#xff0c;地址&#xff1a;https://github.com/sangyuxiaowu/SignAuthorization原理说明简易的 API url 签名验证中间件&#xf…

Redis -- Hash(哈希) [3]

Redis Hash 是一个string类型的field和value的 映射表 &#xff0c;hash特别适合用于存储对象。 注 : Redis 中每个 hash 可以存储 232 - 1 键值对&#xff08;40多亿&#xff09;。 比如这样:注:在此,首先推荐一款redis可视化工具 https://redisdesktop.com/download , 是非常…

HBuilder 打包流程

1.运行HBuilder---百度搜索HBuilder&#xff0c;官网下载安装包&#xff0c;解压&#xff0c;运行HBuilder.exe。注册账号&#xff0c;并登陆 2.新建app---在左边右键&#xff0c;选择新建APP&#xff0c;或者&#xff0c;点击中间的新建app 3.在弹出的窗口&#xff0c;填入应用…

Python3——字典

Python 字典(Dictionary) 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值(key>value)对用冒号(:)分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号({})中 定义字典 d {} d {key1 : value1, key2 : value2 } d di…

科技以换皮为本:路遥工具箱 V4 版本发布

作为定位“开发辅助”的工具&#xff0c;我也一直在想如何让工具更有效率。是更快的打开速度还是更丰富的功能&#xff1f;路遥工具箱 V3 版本的界面布局是偏 BS 后台系统的风格&#xff1a;可折叠的树形菜单用来拓宽用户的操作区域&#xff0c;多标签的功能布局让软件保持整洁…

myisam数据表根据frm文件恢复数据表

有时,我们重装mysql时,可能忘记备份数据了, 只留下了之前的mysql下面的data文件夹里的数据, 这时我们应该如何去恢复数据表呢 如果直接将原来的data目录导进现在的mysql,肯定是不行的,其实很简单 我们常用的数据表结构有myisam和innodb,这两种数据表恢复数据的方式是不一样的,这…

本文主要总结关于mysql的优化(将会持续更新)

2019独角兽企业重金招聘Python工程师标准>>> ON DUPLICATE KEY UPDATE 事件背景 在阅读公司原来代码的过程中&#xff0c;我发现了这样一段代码: $sql "INSERT INTO {$table} ({$fields}) VALUES " . $values; if (!empty($onDuplicate)) {$sql . ON DU…

ASP.NET Core 在 IIS 下的两种部署模式

KestrelServer最大的优势体现在它的跨平台的能力&#xff0c;如果ASP.NET CORE应用只需要部署在Windows环境下&#xff0c;IIS也是不错的选择。ASP.NET CORE应用针对IIS具有两种部署模式&#xff0c;它们都依赖于一个IIS针对ASP.NET CORE Core的扩展模块。一、ASP.NET CORE Cor…

navicat连接远程mysql

环境介绍: 这里,我连接的是阿里云的服务器,自己搭的环境,用的是mysql 5.7一 首先第一步,需要进入远程服务器的mysql,更改host访问权限 然后,将root允许访问的host 改为%(任何ip地址都可以访问) 注: 原来是只允许本地访问二 本地用navicat连接远程mysql 1. 常规部分填写2. SSH部…

面向对象五大设计原则

最近在看七牛云许式伟的架构课, 重温了面向对象五大设计原则(SOLID)&#xff0c;扣理论文字找出处。&#xff08;当然许老板是不可能深聊这么低级的内容&#xff0c;&#x1f921;&#xff09;注意区分设计原则和设计模式。设计原则更为抽象和泛化&#xff1b;设计模式也是抽象…

谷歌F12调试公众号时,让鼠标显示出来

yi 环境介绍: win10 , 谷歌浏览器yii 概述: 在项目中,需要调试公众号,本地环境搭好之后,在谷歌浏览时,发现移动到公众号区域,鼠标居然不见了,这让我怎么操作?各种操作可谓是日了狗了,非常麻烦yiii 调试时鼠标不见的解决办法: 网上各种说法众说纷纭,这里,我给出本人认为最恰当简…

利用bootstrap插件设置时间

$("#"id_rand" .shijian-input").each(function () { $(this).datetimepicker({ lang:"ch", //语言选择中文 注&#xff1a;旧版本 新版方法&#xff1a;$.datetimepicker.setLocale(ch); format: "hh : ii", /…

C# 编写的 64位操作系统 -MOOS

MOOSMOOS ( My Own Operating System )是一个使用.NET Native AOT技术编译的C# 64位操作系统。项目地址&#xff1a;https://github.com/nifanfa/MOOS编译关于编译MOOS的信息&#xff0c;请阅读 编译维基页面&#xff1a;https://github.com/nifanfa/MOOS/wiki/。编译要求VMwar…

JAVA语言基础-面向对象(IO:IO字符流、递归)

2019独角兽企业重金招聘Python工程师标准>>> 21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.2.FileReader FileReader类的read()方法…