Oracle性能调优 AWR分析一例

来源:互联网 发布:诺基亚e72i 软件下载 编辑:程序博客网 时间:2024/05/17 10:07
        (本文是在网贴的基础上汇总修改,然后对朋友公司的AWR报告进行了分析。)

        AWR 是 Oracle  10g 版本 推出的新特性, 全称叫Automatic Workload Repository-自动负载信息库。它是一种Oracle10g提供的性能收集和分析工具,是进行Oracle性能调优的利器。它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解一个系统的整个运行情况,这就像一个人全面的体检报告。

        AWR 是通过对比两次快照(snapshot)收集到的统计信息,来生成报表数据,生成的报表包括多个部分。

        下面根据某朋友公司让我帮忙分析的AWR报告来逐条说明。

WORKLOAD REPOSITORY report for    

DB NameDB IdInstanceInst numStartup TimeReleaseRACFXXOA3654559930fxxoa108-Mar-17 06:0311.2.0.1.0NO

这是DB的一些基本信息,DB name,instance name, instance number, DB version以及是否是RAC安装。从这里看出这是一个11gr2的single DB。


Host NamePlatformCPUsCoresSocketsMemory (GB)PXX_F10_client1AIX-Based Systems (64-bit)12060
50.00
显然,这是DB安装的机器名,操作系统是AIX64bit,逻辑CPU有120个,物理CPU有60个,内存有50G。


Snap IdSnap TimeSessionsCursors/SessionBegin Snap:3818508-Mar-17 08:00:13602.0End Snap:3818608-Mar-17 09:00:211136.6Elapsed:
60.14 (mins)

DB Time:
197.25 (mins)

此表显示抓取时间为2017/3/8 8:00:13至9:00:21,共计60.14分钟。开始sessions(即连接数)是60个,结束时sessions增到113个。

Cursors/Session是指平均每个session open的cursors数量。这个数的作用具体请参照 http://www.cnblogs.com/sumsen/archive/2012/07/19/2599206.html

DB Time不包括Oracle后台进程消耗的时间。如果DB Time远远小于Elapsed时间,说明数据库比较空闲。 
  db time= cpu time + wait time(不包含空闲等待)(非后台进程) 
说白了,db time就是记录的服务器花在数据库运算(非后台进程)和等待(非空闲等待)上的时间 
  DB time = cpu time + all of nonidle wait event time。

这个报告中显示,snap间隔60.14分钟,那么120个cpu就有60.14*120=7216.8分钟,DB Time为197.25分钟,那么

cpu有197.25/7216.8 * 100% = 2.73%的时间花费在正经工作上。说明DB的负载很低。

  对于大多数系统,数据库的工作负载总是集中在一段时间内。如果快照周期不在这一段时间内,或者快照周期跨度太长而包含了大量的数据库空闲时间,所得出的分析结果是没有意义的。这也说明选择分析时间段很关键,要选择能够代表性能问题的时间段。

Report Summary

Cache Sizes


BeginEnd

Buffer Cache:3,840M3,584MStd Block Size:8KShared Pool Size:5,536M5,536MLog Buffer:116,608K

我们知道Buffer Cache也叫数据库缓冲区高速缓存,是SGA中用来缓存已从数据文件中检索到的数据块的副本。说白了就是缓存最常用的段,以便尽可能减少访问数据时物理磁盘I/O的次数。基本上Buffer Cache越大越好。

        Shared Pool主要包括library cache和dictionary cache。library cache用来存储最近解析(或编译)过的SQL、PL/SQL语句及它们对应的hash值和执行计划等。library cache用来存储最近引用的数据字典。发生在library cache或dictionary cache的cache miss代价要比发生在buffer cache的代价高得多。因此shared pool的设置要确保最近使用的数据都能被cache。

Std Block Size是数据块大小。

Log Buffer是重做日志缓冲区大小。

Load Profile


Per SecondPer TransactionPer ExecPer CallDB Time(s):3.34.40.000.00DB CPU(s):1.41.90.000.00Redo size:6,057.58,158.4

Logical reads:125,528.3169,064.1

Block changes:5,191.46,991.9

Physical reads:356.6480.2

Physical writes:25.534.3

User calls:2,628.23,539.7

Parses:1,180.01,589.2

Hard parses:62.884.6

W/A MB processed:0.60.8

Logons:0.20.2

Executes:1,185.81,597.1

Rollbacks:0.00.0

Transactions:0.7


显示数据库负载概况,将之与基线数据比较才具有更多的意义,如果每秒或每事务的负载变化不大,说明应用运行比较稳定。单个的报告数据只说明应用的负载情况,绝大多数据并没有一个所谓“正确”的值,然而Logons大于每Redo size:每秒产生的日志大小(单位字节),可标志数据变更频率, 数据库任务的繁重与否。

Redo size:每秒产生的日志大小(单位字节),可标志数据变更频率, 数据库任务的繁重与否。

Logical reads:每秒/每事务逻辑读的块数.平均每秒产生的逻辑读的block数。Logical Reads= Consistent Gets + DB Block Gets  

Block changes:每秒/每事务修改的块数 

Physical reads:每秒/每事务物理读的块数 

Physical writes:每秒/每事务物理写的块数 

User calls:每秒/每事务用户call次数 

Parses:SQL解析的次数.每秒解析次数,包括fast parse,soft parse和hard parse三种数量的综合。 软解析每秒超过300次意味着你的"应用程序"效率不高,调整session_cursor_cache。在这里,fast parse指的是直接在PGA中命中的情况(设置了session_cached_cursors=n);soft parse是指在shared pool中命中的情形;hard parse则是指都不命中的情况。 
Hard parses:其中硬解析的次数,硬解析太多,说明SQL重用率不高。每秒产生的硬解析次数, 每秒超过100次,就可能说明你变量绑定使用的不好,也可能是共享池设置不合理。这时候可以启用参数cursor_sharing=similar|force,该参数默认值为exact。但该参数设置为similar时,存在bug,可能导致执行计划的不优。 
Sorts:每秒/每事务的排序次数 

Logons:每秒/每事务登录的次数 

Executes:每秒/每事务SQL执行次数 
Transactions:每秒事务数.每秒产生的事务数,反映数据库任务繁重与否。  
Blocks changed per Read:表示逻辑读用于修改数据块的比例.在每一次逻辑读中更改的块的百分比。 
Recursive Call:递归调用占所有操作的比率.递归调用的百分比,如果有很多PL/SQL,那么这个值就会比较高。 

Rollback per transaction:每事务的回滚率.看回滚率是不是很高,因为回滚很耗资源 ,如果回滚率过高,可能说明你的数据库经历了太多的无效操作 ,过多的回滚可能还会带来Undo Block的竞争 该参数计算公式如下: Round(User rollbacks / (user commits + user rollbacks) ,4)* 100% 。 

Rows per Sort:每次排序的行数 

注: 
     Oracle的硬解析和软解析  
     提到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程。当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程:   

       1、语法检查(syntax check)   检查此sql的拼写是否语法。   

        2、语义检查(semantic check) 
                     诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。  

        3、对sql语句进行解析(prase) 
                    利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。

4、执行sql,返回结果(execute and return)   其中,软、硬解析就发生在第三个过程里。 
  Oracle利用内部的hash算法来取得该sql的hash值,然后在library cache里查找是否存在该hash值; 
  假设存在,则将此sql与cache中的进行比较;   假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。   

诚然,如果上面的2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。 
  创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。

Instance Efficiency Percentages (Target 100%)

Buffer Nowait %:100.00Redo NoWait %:99.99Buffer Hit %:99.77In-memory Sort %:100.00Library Hit %:93.27Soft Parse %:94.68Execute to Parse %:0.49Latch Hit %:99.58Parse CPU to Parse Elapsd %:26.82% Non-Parse CPU:87.07本节包含了Oracle关键指标的内存命中率及其它数据库实例操作的效率。其中Buffer Hit Ratio 也称Cache Hit Ratio,Library Hit ratio也称Library Cache Hit ratio。同Load Profile一节相同,这一节也没有所谓“正确”的值,而只能根据应用的特点判断是否合适。在一个使用直接读执行大型并行查询的DSS环境,20%的Buffer Hit Ratio是可以接受的,而这个值对于一个OLTP系统是完全不能接受的。根据Oracle的经验,对于OLTP系统,Buffer Hit Ratio理想应该在90%以上。 
Buffer Nowait表示在内存获得数据的未等待比例。在缓冲区中获取Buffer的未等待比率。Buffer Nowait的这个值一般需要大于99%。否则可能存在争用,可以在后面的等待事件中进一步确认。 
buffer hit表示进程从内存中找到数据块的比率,监视这个值是否发生重大变化比这个值本身更重要。对于一般的OLTP系统,如果此值低于80%,应该给数据库分配更多的内存。数据块在数据缓冲区中的命中率,通常应在95%以上。否则,小于95%,需要调整重要的参数,小于90%可能是要加db_cache_size。一个高的命中率,不一定代表这个系统的性能是最优的,比如大量的非选择性的索引被频繁访问,就会造成命中率很高的假相(大量的db file sequential read),但是一个比较低的命中率,一般就会对这个系统的性能产生影响,需要调整。命中率的突变,往往是一个不好的信息。如果命中率突然增大,可以检查top buffer get SQL,查看导致大量逻辑读的语句和索引,如果命中率突然减小,可以检查top physical reads SQL,检查产生大量物理读的语句,主要是那些没有使用索引或者索引被删除的。 
Redo NoWait表示在LOG缓冲区获得BUFFER的未等待比例。如果太低(可参考90%阀值),考虑增加LOG BUFFER。当redo buffer达到1M时,就需要写到redo log文件,所以一般当redo buffer设置超过1M,不太可能存在等待buffer空间分配的情况。当前,一般设置为2M的redo buffer,对于内存总量来说,应该不是一个太大的值。 
library hit表示Oracle从Library Cache中检索到一个解析过的SQL或PL/SQL语句的比率,当应用程序调用SQL或存储过程时,Oracle检查Library Cache确定是否存在解析过的版本,如果存在,Oracle立即执行语句;如果不存在,Oracle解析此语句,并在Library Cache中为它分配共享SQL区。低的library hit ratio会导致过多的解析,增加CPU消耗,降低性能。如果library hit ratio低于90%,可能需要调大shared pool区。STATEMENT在共享区的命中率,通常应该保持在95%以上,否则需要要考虑:加大共享池;使用绑定变量;修改cursor_sharing等参数。 
Latch Hit:Latch是一种保护内存结构的锁,可以认为是SERVER进程获取访问内存数据结构的许可。要确保Latch Hit>99%,否则意味着Shared Pool latch争用,可能由于未共享的SQL,或者Library Cache太小,可使用绑定变更或调大Shared Pool解决。要确保>99%,否则存在严重的性能问题。当该值出现问题的时候,我们可以借助后面的等待时间和latch分析来查找解决问题。 
Parse CPU to Parse Elapsd:解析实际运行时间/(解析实际运行时间+解析中等待资源时间),越高越好。计算公式为:Parse CPU to Parse Elapsd %= 100*(parse time cpu / parse time elapsed)。即:解析实际运行时间/(解析实际运行时间+解析中等待资源时间)。如果该比率为100%,意味着CPU等待时间为0,没有任何等待。 
Non-Parse CPU :SQL实际运行时间/(SQL实际运行时间+SQL解析时间),太低表示解析消耗时间过多。计算公式为:% Non-Parse CPU 
=round(100*1-PARSE_CPU/TOT_CPU),2)。如果这个值比较小,表示解析消耗的CPU时间过多。与PARSE_CPU相比,如果TOT_CPU很高,这个比值将接近100%,这是很好的,说明计算机执行的大部分工作是执行查询的工作,而不是分析查询的工作。 
Execute to Parse:是语句执行与分析的比例,如果要SQL重用率高,则这个比例会很高。该值越高表示一次解析后被重复执行的次数越多。计算公式为:Execute to Parse =100 * (1 - Parses/Executions)。所以如果系统Parses > Executions,就可能出现该比率小于0的情况。该值<0通常说明shared pool设置或者语句效率存在问题,造成反复解析,reparse可能较严重,或者是可能同snapshot有关,通常说明数据库性能存在问题。 本例中这个值比较低,说明SQL重用率很低。
In-memory Sort:在内存中排序的比率,如果过低说明有大量的排序在临时表空间中进行。考虑调大PGA(10g)。如果低于95%,可以通过适当调大初始化参数PGA_AGGREGATE_TARGET或者SORT_AREA_SIZE来解决,注意这两个参数设置作用的范围时不同的,SORT_AREA_SIZE是针对每个session设置的,PGA_AGGREGATE_TARGET则时针对所有的sesion的。 
Soft Parse:软解析的百分比(softs/softs+hards),近似当作sql在共享区的命中率,太低则需要调整应用使用绑定变量。sql在共享区的命中率,小于<95%,需要考虑绑定,如果低于80%,那么就可以认为sql基本没有被重用。

Shared Pool Statistics


BeginEndMemory Usage %:10.4887.46% SQL with executions>1:53.1668.92% Memory for SQL w/exec>1:45.9787.21Memory Usage %:对于一个已经运行一段时间的数据库来说,共享池内存使用率,应该稳定在75%-90%间,如果太小,说明Shared Pool有浪费,而如果高于90,说明共享池中有争用,内存不足。这个数字应该长时间稳定在75%~90%。如果这个百分比太低,表明共享池设置过大,带来额外的管理上的负担,从而在某些条件下会导致性能的下降。如果这个百分率太高,会使共享池外部的组件老化,如果SQL语句被再次执行,这将使得SQL语句被硬解析。在一个大小合适的系统中,共享池的使用率将处于75%到略低于90%的范围内. 
SQL with executions>1:执行次数大于1的sql比率,如果此值太小,说明需要在应用中更多使用绑定变量,避免过多SQL解析。在一个趋向于循环运行的系统中,必须认真考虑这个数字。在这个循环系统中,在一天中相对于另一部分时间的部分时间里执行了一组不同的SQL语句。在共享池中,在观察期间将有一组未被执行过的SQL语句,这仅仅是因为要执行它们的语句在观察期间没有运行。只有系统连续运行相同的SQL语句组,这个数字才会接近100%。 
Memory for SQL w/exec>1:执行次数大于1的SQL消耗内存的占比。这是与不频繁使用的SQL语句相比,频繁使用的SQL语句消耗内存多少的一个度量。这个数字将在总体上与% SQL with executions>1非常接近,除非有某些查询任务消耗的内存没有规律。在稳定状态下,总体上会看见随着时间的推移大约有75%~85%的共享池被使用。如果Statspack报表的时间窗口足够大到覆盖所有的周期,执行次数大于一次的SQL语句的百分率应该接近于100%。这是一个受观察之间持续时间影响的统计数字。可以期望它随观察之间的时间长度增大而增大。  

小结:通过ORACLE的实例有效性统计数据,我们可以获得大概的一个整体印象,然而我们并不能由此来确定数据运行的性能。当前性能问题的确定,我们主要还是依靠下面的等待事件来确认。我们可以这样理解两部分的内容,hit统计帮助我们发现和预测一些系统将要产生的性能问题,由此我们可以做到未雨绸缪。而wait事件,就是表明当前数据库已经出现了性能问题需要解决,所以是亡羊补牢的性质。

Top 5 Timed Foreground Events

    EventWaitsTime(s)Avg wait (ms)% DB timeWait ClassDB CPU
    5,035
    42.55
    db file sequential read682,68944413.75User I/Odb file scattered read40,27916041.35User I/Olibrary cache: mutex X334782340.66Concurrencylatch: shared pool3,89671180.60Concurrency这是报告概要的最后一节,显示了系统中最严重的5个等待,按所占等待时间的比例倒序列示。当我们调优时,总希望观察到最显著的效果,因此应当从这里入手确定我们下一步做什么。例如如果‘buffer busy wait’是较严重的等待事件,我们应当继续研究报告中Buffer Wait和File/Tablespace IO区的内容,识别哪些文件导致了问题。如果最严重的等待事件是I/O事件,我们应当研究按物理读排序的SQL语句区以识别哪些语句在执行大量I/O,并研究Tablespace和I/O区观察较慢响应时间的文件。如果有较高的LATCH等待,就需要察看详细的LATCH统计识别哪些LATCH产生的问题。 
    一个性能良好的系统,cpu time应该在top 5的前面,否则说明你的系统大部分时间都用在等待上。 
    在这里,log file parallel write是相对比较多的等待,占用了7%的CPU时间。 通常,在没有问题的数据库中,CPU time总是列在第一个。 更多的等待事件,参见本报告 的Wait Events一节。


    Host CPU (CPUs: 120 Cores: 60 Sockets: )

    Load Average BeginLoad Average End%User%System%WIO%Idle2.256.081.81.90.196.3

    Instance CPU

    %Total CPU%Busy CPU%DB time waiting for CPU (Resource Manager)1.231.00.0

    Memory Statistics


    BeginEndHost Mem (MB):51,200.051,200.0SGA use (MB):9,792.09,536.0PGA use (MB):188.1329.4% Host Mem used for SGA+PGA:19.4919.27

    未完待续


    0 0
    原创粉丝点击