全局热块冲突是RAC平台经常出现的一种等待事件,这种等待如果比较严重的话,会对系统的性能产生十分重大的影响,甚至导致数据库被短时挂住。
全局热块冲突和普通的热块冲突类似,普通的热块冲突是在一个单节点上多个会话访问相同的数据块导致的等待事件。如果大量会话访问某个或某些特定的数据块,那么这些数据块被称为热块。相比单实例环境,全局热块冲突的危害更大,因为全局的热块需要在实例间进行传递。严重的全局热块冲突会导致系统性能急剧下降。
最典型的案例就是,如果某个应用要对某张表进行大批量的数据插入,而且插入的进程都跑在一个节点上,那么这个系统可能会出现一些buffer busy waits等待事件,不过不会产生很严重的性能问题。如果这个应用负载均衡方式分布在不同的节点上,那么从STATSPACK/AWR报告中,我们可能看到下面的情况:
Top 5 Timed Events
Avg %Total
~~~~~~~~~~~~~~~~~~
wait Call
Event Waits Time (s)
(ms) Time Wait Class
------------------------------ ------------ -----------
------ ------ ----------
buffer busy waits 17,149 12,743
743 37.3 Concurrenc
gc buffer busy 21,057 12,328
585 36.1 Cluster
enq: HW - contention 19,571 7,155
366 20.9 Configurat
CPU time 1,253
3.7
gc current block 2-way 207,726 525
3 1.5 Cluste
-------------------------------------------------------------
对于这种情况,需要在应用的底层进行设计。比如有一种很常用的方法,就是在某张表中设计一个INSTANCE_ID字段,在插入数据时,每个实例插入的数据中都带有INSTANCE_ID,然后按照INSTANCE_ID对这张表进行分区,两个实例之间的gc buffer busy争用就会大幅度地减少。下面就是通过这种方式优化后的AWR报告。
Event Waits Time(s) Avg Wait(ms) % Total Call Time Wait Class
CPU time 1,334 92.3
log file sync 554,591 334 1 23.1 Commit
log file parallel write 536,004 106 0 7.3 System I/O
gc cr multi block request 449,571 85 0 5.9 Cluster
wait for scn ack 417,500 73 0 5.1 Other
从上面的报告可以看出,gc buffer busy消失了。
RAC 上解决gc buffer busy的常用方法之一:
对表结构做一个调整,来彻底解决这个问题。我们重新对表进行分区,使之成为一个复合分区表,在这张表上加入一个字段 inst_id,也就是
实例编号,这个字段作为主分区字段,按照这个分区做范围分区后,再设置msg_id的hash分区。调整后的表结构如下:
Create table qstore
{
MSG_ID VARCHAR2(64 BYTE) NOT NULL,
DOCE_ID VARCHAR2(100 BYTE) NOT NULL,
DOC_KEY VARCHAR2(100 BYTE) NOT NULL,
BUS_NAME VARCHAR2(100 BYTE) NOT NULL,
MODULE_NAME VARCHAR2(100 BYTE) ,
CATEGORY VARCHAR2(64 BYTE) ,
SUB_CATEGORY VARCHAR2(64 BYTE) ,
DOC_SIZE NUMBER(11) DEFAULT 0,
CREATE_TIME DATE,
MODIFY_TIME DATE,
EXPIRED_TIME DATE,
DOC_FLAG
Inst_id number
}initrans 20 pctfree 20 tablespace TS_DATA_EAI
PARTITION BY RANGE(inst_id)
SUBPARTITION BY HASH(msg_id) SUBPARTITIONS 8
(PARTITION p1 VALUES LESS THAN (2)),
(PARTITION p1 VALUES LESS THAN (3));
inst_id的值就是插入进程连接到的实例的ID,这样调整后,在1号节点上插入的数据将全部被插入到inst_id=1的分区,插入操作就不会产生大量的global cache request了。这种做法也是在RAC上解决gc buffer busy 的常用方法之一。
即可以方便通过交换分区的方式对历史数据进行归档,而且可以通过HASH分区来减少buffer busy wait和 HW锁等待。这次老白在海南碰到的问题,是RAC环境下常见的性能问题,当两个节点对相同的表做跟新操作的时候,这些块需要在两个节点之间不停的传输,这就是我们常说的RAC实例间的热块,如果一个应用系统本身热块冲突比较严重,那么这个系统升级为RAC后,这些热块很可能变成实例级的,实例级的热块会导致比单实例环境下更为严重的后果,在一般情况下,会导致系统性能下降,严重的时候会出现类似海南这个案例的现象,
甚至导致系统被短暂的挂起。优化这种应用,关键是减少实例级的热块,减少数据块在实例之间传输。
老白使用的是一个很简单的方法,使相同的实例插入的数据存储在同一个分区里,这样这些数据就不需要在实例间做传输了。这实际上是一个典型的应用架构设计的问题,这种设计,再多实例的应用环境中,应该从底层架构就被考虑。在实际的工作中,老白经常会碰到类似的案例,
不过绝大多数情况下,很难像老白这次这么幸运的解决,因为系统上线后,甚至系统运行了几年之后才可能暴露出这个问题,这个时候,如果要采用今天的方法去优化就十分困难了。
参考至:http://blog.csdn.net/csucxcc/article/details/5896309
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
老白的日记中可能包括了Oracle数据库的性能调优、备份与恢复策略、高可用性架构(如RAC)、数据安全性以及复杂SQL查询优化等内容。这些知识对于理解和处理Oracle数据库中的日常问题至关重要。 MySQL则是开源数据库...
【老白DBA日记】是资深Oracle数据库DBA老白的个人笔记,这些笔记记录了他在数据库管理领域的丰富经验和深入理解。作为一名经验丰富的DBA,老白无疑在Oracle数据库的安装配置、性能优化、故障排查等方面积累了大量...
Oracle RAC 环境下索引热块的处理思路 Oracle RAC 环境下索引热块的处理思路是指在 Oracle RAC 环境下,due to the high concurrency and parallelism of multiple instances, the index block contention issue ...
在 Oracle RAC 环境中,每个实例都维护着一个 Local Cache(本地高速缓存),用于存储当前实例上的数据块,但是在某些情况下,数据块可能会被从全局高速缓存中删除,导致 gc block lost 问题的出现。 gc block ...
Oracle 19c RAC (Real Application Clusters) 和 RACDG (Data Guard) 是企业级数据库解决方案,用于实现高可用性和灾难恢复。RAC允许多个实例同时访问同一个数据库,而RACDG则提供了主库与备库之间的数据保护。 在...
RAC还提供了额外的进程,如LMS(Global Cache Service Process)处理全局缓存服务,LMD(Global Enqueue Service Daemon)处理全局队列服务,LMON(Global Enqueue Service Monitor)监视全局队列服务,以及LCK0...
Oracle 11GR2 RAC (Real Application Clusters) 和 RAC-DG (Data Guard) 环境的部署是一项复杂而关键的任务,涉及到多个层面的技术集成和配置。以下是根据提供的信息,对整个部署过程的详细说明: 1. **Oracle RAC ...
场景 4:4 节点 RAC 数据库,资源主节点为 D 节点,节点 A 要求修改数据块,把 SCN 变成 1013。 场景 5:4 节点 RAC 数据库,资源主节点为 D 节点,节点 C 要求读取数据块。 场景 6:4 节点 RAC 数据库,资源主...
根据提供的文件内容,以下是对RAC环境中常用的命令及其所检查状态的详细解释: ### 1. 检查集群状态 #### 命令:`crsctl check cluster` 此命令用于检查整个集群的状态,包括集群同步服务(Cluster ...
全局缓存服务(Cache Fusion)允许不同节点的实例通过高速网络共享和交换缓存数据块,从而减少物理读取和提高性能。 3. 数据访问与锁定:当多个实例同时访问相同的数据时,RAC提供了一套锁机制以防止数据冲突。通过...
为了提高性能并减少数据冲突,RAC采用了全局高速缓存协调机制。这一机制确保了所有节点都能快速访问最新的数据副本,而不会导致数据不一致的问题。具体来说,当一个节点对数据进行修改时,该变更会被立即传播到集群...
RAC提供了一些额外的进程,如Global Cache Service Process(LMS)、Global Enqueue Service Daemon(LMD)、Global Enqueue Service Monitor(LMON)和Instance Enqueue Process(LCK0),这些进程用于维护全局缓存...
RAC的关闭过程涉及到多个组件和服务的管理,主要包括数据库服务、监听器(Listener)、虚拟IP(VIP)、全局服务检测(GSD)以及集群网络服务(ONS)等。下面将详细介绍如何通过命令行工具`srvctl`来完成RAC实例的关闭操作。 ...
Oracle 12c Real Application Clusters (RAC) 是一种高可用性和可伸缩性的数据库解决方案,它允许多个服务器实例同时访问同一个数据库,提供故障切换和负载均衡能力。以下是对Oracle 12c RAC在ESXi平台安装过程中的...
### DBA日记(第二部):RAC开发者笔记解析 #### 一、Oracle RAC (Real Application Clusters) 概念及其发展历程 **标题与描述分析:** 标题“DBA日记(第二部)”和描述“讲述RAC开发者的笔记,值得借鉴和学习”...
### Oracle 11g RAC 卸载与清理详解 #### 概述 在某些情况下,可能需要彻底卸载和清理 Oracle RAC(Real Application Clusters)环境,尤其是在遇到安装失败或其他不可预料的问题时。本文将详细介绍如何进行“暴力...
4. **全局缓存服务**:RAC引入了全局缓存服务,确保所有实例都有相同的数据库缓存(DB Cache),减少了I/O操作。这一特性称为“缓存融合”(Cache Fusion)。 - **缓存融合**:当一个节点读取或修改数据块时,会将...
3. **Global Cache**:全局缓存(Global Cache)是RAC的关键组成部分,它包含数据库的数据块和控制文件。每个实例都有自己的本地缓存(Local Buffer Cache),但数据块的修改会实时同步到全局缓存,确保数据一致性。...
Oracle RAC 项目实施方案 Oracle RAC(Real Application Clusters)是 Oracle 公司的一种集群解决方案,旨在提供高可用性和高性能的数据库解决方案。在生产环境下实施 Oracle RAC 需要进行详细的规划和实施本文将...