3

AWR 报告深度解读:DB CPU 算法解析及CPU负载分析

黄凯耀 2019-09-05
4621

为了系统化的梳理 AWR 的知识体系,我们整理了一个系列文章,希望从原理、使用到 AWR 报告的解读,给读者展示全面的 AWR 知识体系,本文是系列文章的第六篇。


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


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

OS 级的 User%,Sys%, Idle%
DB 所占 OS CPU 资源的 Busy%
DBCPU 又可以分为前台所消耗的 CPU 和后台所消耗的 CPU


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


5.jpg

1.jpg


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

OS 级的 User%,Sys%,Idle%
OS 级的 %User 为75.4,%Sys 为2.8,%Idle 为21.2,

所以 %Busy 应该是 100-21.1=78.8。


DB所占OS CPU资源的Busy%:
DB占了OS CPU资源的69.1,%Busy CPU则可以通过上面的数据得到:
%Busy CPU = %Total CPU/(%Busy) * 100 

= 69.1/78.8 * 100 = 87.69,和报告的87.7相吻合。


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


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


2.jpg


根据上面的数据,稍加计算分析便可得出下面的结果:
 · 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 里面也有记录:


3.jpg


 · Total DB CPU = DB CPU + Background CPUtime = 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的资源利用情况。

4.jpg


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


最后修改时间:2019-09-06 08:05:36
「喜欢文章,快来给作者赞赏墨值吧」
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论