做RAC的DBA久了会养成一个习惯:看到任何和RAC相关的性能问题,第一反应不是急着跑脚本、看AWR,而是先问自己——这个等待是走GCS还是GES?换句话说,问题的根子是出在PCM资源上,还是非PCM资源上?这个分类意识,比背一百个等待事件名称都管用。
Oracle RAC的“内存融合技术”,就是大家常说的Cache Fusion,它之所以能在多个实例之间像一份大缓存一样工作,是因为底层把需要全局协调的资源分成了PCM资源和非PCM资源两大类。PCM管的是数据块本体,非PCM管的是锁、字典缓存、库缓存这些“元秩序”。两类资源像两个声部,在私网上协同演奏,才形成了集群缓存一致性的交响效果。
这篇文章不打算从头讲一遍RAC体系架构,也不打算罗列命令,而是专门把PCM和非PCM资源这两条主线拎出来,从原理拆到实操,再结合实际场景聊聊怎么用这套思路做问题定位。刚接触RAC不久、书本看得云里雾里的DBA适用,被gc等待事件和library cache lock折磨过的运维老兵也一样适用。
1. 先想清楚:内存融合到底融合的是什么
很多人以为RAC里的缓存融合就是把多个实例的SGA拼成一个大内存池,这是最常见的误解。实际上每个实例的buffer cache依旧是物理独立的,只是通过某种协议让这些独立的缓存对外表现为一个“逻辑上一致”的整体。数据块不一定只存在一个实例里,多个实例可能同时持有同一个数据块的不同副本,但它们彼此都清楚谁手里的版本最新、谁可以安全读取、哪个副本可以用来构造一致性读。
1.1 从磁盘Ping到高速私网传输
在Oracle 9i之前的OPS(Oracle Parallel Server)时代,多个实例访问同一个数据块,如果块不在本地,必须先让持有块的实例把脏块写回磁盘,请求方再从磁盘读进自己的buffer cache。这个动作在当时叫“磁盘Ping(Disk Ping)”,代价极其昂贵——一次跨实例共享访问至少产生两次磁盘写和一次磁盘读。OPS也因此只能在极少数几乎不冲突的场景里跑出扩展性,更多时候性能和单实例相比反而是灾难。
Cache Fusion彻底改变了路径:数据块不再需要先落盘再被另一个实例读取,而是直接通过专用的高速私有网络,从持有该块的实例buffer cache送到请求实例的buffer cache。这个过程叫“块传输”,在等待事件里就是gc cr request、gc current request这一族。注意,融合的是缓存中的块,不是磁盘文件本身。Disk I/O并没有被消灭,只是被极大延后:只有到了检查点、实例恢复、空间管理等时机,脏块才会被批量写入磁盘。
1.2 让多实例缓存保持一致性的核心矛盾
有了块传输还不够,Oracle必须回答三个问题:这个数据块现在在哪个实例手上?那个实例手上持有的是最新版本吗?如果我要修改它,需不需要先通知别人?
解决这三个问题的机制就是GRD(Global Resource Directory,全局资源目录)。GRD是一份分布式目录,不集中存放在单独节点,而是按资源散落在各个实例上。每个资源有一个“主节点”(Resource Master),负责记录该资源的持有者、请求者、锁模式等信息。谁想访问一个数据块,先向这个块的资源主节点问路,主节点根据目录内容决定是直接授权,还是转交持块实例去传送。
1.3 为什么要把资源人为分成PCM和非PCM
RAC里需要全局协调的实体远远不止数据块。表结构定义、数据库字典缓存、库缓存中的SQL游标、DML时的表锁,这些都需要实例间一致协调。但它们和数据块有一个本质区别:数据块是访问最频繁、最追求低延迟、数量最庞大的资源;而锁和元数据更多是短促、低频、逻辑复杂的排队型资源。面向不同特性设计两套协调机制,性能和可靠性才能兼顾。
于是Oracle把资源拆成两大类:
- PCM资源(Parallel Cache Management Resource):协调数据文件中的数据块,归GCS(Global Cache Service)管理,对应Cache Fusion核心流程。
- 非PCM资源(Non-PCM Resource):协调除数据块外的其他全局资源,归GES(Global Enqueue Service)管理,常见的是各种enqueue、library cache lock、row cache lock。
用一个生活化类比:PCM资源像高速公路上的车流,讲究的是快速通过、少停车、低延迟;非PCM资源像路口红绿灯系统,讲究的是规则清晰、公平排队、按序放行。两者共同构成立体交通,单看哪一边都无法理解RAC的全貌。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PCM资源深度拆解:数据块的“通行证”机制
PCM资源是整个内存融合技术的核心,也是最容易让人卡住概念的地方。我见过不少朋友把PCM资源直接理解成“数据块本身”,严格说这并不准确。PCM资源更像挂在每个数据块上的“通行证”,通行证记录了当前允许谁持有、允许哪种方式的访问。
2.1 PCM资源到底映射了什么
每个PCM资源通过哈希算法与数据文件中的block映射。Oracle内部会依据file number和block number计算出一个资源I
