Oracle Database Performance Tuning Guide

Oracle数据库中我们分析一个会话或SQL执行时间效率或者分析解释导致会话等待的原因的一个很重要的方法是分析它花费的时间构成。在Oracle RAC中,Oracle使用不同的等待事件时间来表示不同的请求结果及时间消耗。例如,当一个会话上实例正在寻找全局缓存中的块,它不知道它是否会接收另一个实例缓存的数据块,或者它是收到消息让它直接从磁盘读取。全局缓存的等待事件向我们精确传达它是等待全局缓存块还是消息:Oracle将RAC相关的等待事件汇总在一个名为Cluster Wait Class的广泛类别中。当用户需要请求访问一个数据块时,就会有相应的事件等待处于活动状态,例如:

1. gc current block request

2. gc cr block request

当知道请求的结果时:

1. gc current block 3-way

2. gc current block busy

3. gc cr block grant 2-way

Oracle RAC的等待事件非常细致的传达了Cache Fusion发生的每一个阶段消耗的时间,帮助我们很好的定位问题。


GCS and GES Statistics

缓存融合传输的响应时间由消息传递、处理及私网传输时间(IPC协议和GCS协议)组成。gc current block busy等待事件表示对缓存数据块的延迟访问,因为它们在远程或本地缓存中正在被访问。

这可能是由以下任何原因引起的:

1. 数据块被pinned住。

2. 数据块被其他会话持有。

3. 远程实例上的日志写入出现延迟。

4. 同一实例上的会话已请求访问的块并且正在实例间进行转换,当前会话的会产生(gc current block busy)等待。

使用V$SESSION视图可以查看具有争用的对象和数据块,并且其中的p1和p2列表示块请求的数据文件和块号,AWR基础结构提供了活动会话历史记录的视图,也可以用于跟踪最近的等待事件及其指标。AWR和Statspack报告工具都包含大多数相关的等待事件,这可以有效的帮助我们分析Cache fusion的问题。建议在AWR基础架构收集的快照数据上运行ADDM获得全局缓存影响的总体评估。该advisory也将识别繁忙对象和SQL高gc等待时间。


GCS Statistics

本节介绍如何通过识别读取的对象修改和访问所产生的服务时间来监视GCS性能。在cache fusion过程中对块的请求到达是整个响应时间的重要组成部分,同样从磁盘读取可能会增加块访问延迟。在大多数情况下,缓存融合传输比磁盘访问响应更快。以下等待事件表明当前实例向主节点申请了一个当前或者一致性块并且这个申请已经被主节点响应,而且没有出现超时。也就是说远程缓存的块已发送到本地实例并且没有产生busy,pinned或需要logflush:

1. gc current block 2-way

2. gc current block 3-way

3. gc cr block 2-way

4. gc cr block 3-way

gc current blocks received和gc cr blocks received可用于快速判断访问的对象目前是被多个实例共享的。 前面列表中提到的事件的平均等待时间的任何增加可能是由以下事件引起的:

1. 系统负载过高:CPU,IO资源不足,运行队列过长,计划任务出现延迟等。

2. 私有网络问题:网络延迟过高,带宽不够。

如果平均等待时间可以接受,并且诊断后没有私网或负载问题,那么等待的累计时间通常可以通过Top SQL进行SQL语句的调整优化以最小化访问的块数,使用检查buffer cache的大小,fast_start_mttr_target(检查点触发频繁)导致刷脏块频率过高。V$SQLAREA中的列CLUSTER_WAIT_TIME表示发生的全局缓存事件等待时长,可以通过它来进行确定哪些SQL需要调整。注意:Oracle建议使用ADDM和AWR。Statspack也可以但是需要使用级别7运行Statspack才能收集统计信息与块争用和段块等待有关。


Response Times Based on Wait Events

大多数全局缓存等待事件在AWR报告或者动态性能视图的中显示时间占比较高并且可能存在它们作为顶级数据库时间消费者但是并不一定代表有问题。如果用户响应时间增加并且等待很高比例的时间用于全局高速缓存(gc),这个时候需要我们确定原因。大多数报告都包括细分事件按总时间的百分比排序。从ADDM报告开始是有用的,该报告分析常规收集的报告性能统计与其影响有关,并指向哪些对象和SQL对等待的时间贡献最大,然后由AWR和Statspack提供更详细的报告。Oracle RAC最重要的等待事件包括以下类别:

1. Block-Related Wait Events

2. Message-Related Wait Events

3. Contention-Related Wait Events

4. Load-Related Wait Events


Block-Related Wait Events

与块相关的等待事件统计信息表明已收到的块经过作为2次或3次消息传递的结果,即块是从任何一个发送的资源master需要1次消息和1次块传输,或者被转发到第三个节点,需要2条消息和1个块传输。

1. gc current block 2-way

2. gc current block 3-way

3. gc cr block 2-way

4. gc cr block 3-way


Message-Related Wait Events

与消息相关的等待事件统计信息表明没有收到任何阻塞,因为它在任何实例中都没有缓存。表示的是一个全局授权,使其能够实现请求实例从磁盘读取块或修改它。如果这些事件消耗的时间很长,那么可以假设SQL导致很多磁盘I/O(在cr授权的情况下)或者说工作负载会插入大量数据,并且需要经常查找和格式化新块。

1. gc current grant 2-way

2. gc cr grant 2-way


Contention-Related Wait Events

与争用相关的等待事件统计信息表明请求的块被另一个节点上的会话持有,并且所做的更改尚未结束因此不能马上发送传递。一个块产生busy等待也可能会发生在本地,当一个会话启动了一个缓存融合操作,同节点上的另一个会话正在尝试读取或修改相同的数据。高服务时间可能会加剧在全局高速缓存中传递块的争用,大部分情况下busy类的等待事件表明用户对同一数据的频繁并发读写访问。gc current block busy and gc cr block busy等待事件表明发出请求的本地实例没有立即收到当前或一致性读取块。这些事件名称中的busy一词表示发送该块在远程实例上被延迟发送了。例如,如果Oracle数据库尚未为块的更改写入redo。与block busy等待事件相比,gc buffer busy等待事件表Oracle数据库无法立即授予对存储在本地的缓存的访问权限。这是因为缓冲区上的全局操作正在等待且操作尚未完成。换句话说,缓冲区正忙,所有其他尝试访问本地缓冲区的进程必须等待完成。gc buffer busy也同样意味着多次访问本地块的请求。Oracle数据库必须排队这些请求。Oracle数据库需要处理的时间长度队列取决于块的剩余服务时间。服务时间受:网络延迟时间,远程和本地实例处理时间,以及等待队列的时间。平均等待时间和总等待时间都应该被考虑进去,这些特定的等待对系统有巨大的影响。

1. gc current block busy

2. gc cr block busy

3. gc buffer busy acquire/release


Load-Related Wait Events

与负载相关的等待事件表明在处理中发生了延迟GCS,这通常是由高负载,CPU饱和,负载平衡,新节点的添加删除。对于上面提到的事件,等待时间包含整个节点从会话开始等待启动块请求之后到请求的块被返回。

1. gc current block congested

2. gc cr block congested




沃趣科技,让客户用上更好的数据库技术!