Oracle RAC Cache Fusion 系列十四:Oracle RAC CR Server Part One
Oracle数据库环境中隔离级别为read committed,每个事务都只能看到其他事务已提交的更改和自己未提交的更改。所有关于CR块的统计都可以通过x$bh视图查看。read-commited隔离级别下的有两种可能性:
- 语句级别:查询结果与查询的开始一致(snap_scn =当前SCN)。
- 事务级别:查询结果与事务开始时一致(snap_scn =事务开始时的当前SCN)。
CR块请求流
ktrget:
- 初始化CR扫描请求。
- 调用kcbgtcr获取最佳缓存区域构建CR缓冲区。
- 调用ktrgcm应用undo来构建CR缓冲区。
- 将CR缓冲区返回给请求者。
kcbgtcr:
- 如果成功,返回“最佳”候选人(由ktrexf执行)。
- 扫描哈希桶,以获取可用于构建CR缓冲区的缓冲区。
- 如果不成功,请求调用kcbget。
kcbget:
- 重新尝试kcbgtcr的扫描。
如果找到缓冲区,则立即返回。
如果没有,那么如果它正在读入或存在当前模式缓冲区,则等待它可用后,然后重新扫描缓冲区。
如果这些失败,则不能使用任何本地缓存的缓冲区。
如果上述操作失败:
- CR服务重新分配管理CR请求。
CR块的请求最多涉及三个实例:请求者实例,锁定主实例和当前块所有者实例。
如果满足以下条件之一,则授予锁定:
资源保持模式为NULL。
资源保持模式为S,主节点中没有S锁的持有者。
否则,主设备将CR请求转发给持有者节点。
如果锁是全局的,那么Oracle将选择一个节点来转发CR请求,如下所示:
如果锁主实例中存在过去镜像(PI),并且PI SCN比snap-scn大,则主节点是为该节点。
否则,您选择具有最小SCN的PI镜像且PI-SCN大于snap-SCN。此PI的所有者节点是系统将CR请求转发到的节点。用最小SCN的PI的原因是这样应用的UNDO较少。
如果根本没有PI,则选择当前块的所属实例。
Light Work Rule
为了避免因为块清除而产生消耗资源过多的CR块构建工作,将合适的缓冲区发送给请求者以完成CR构建。Oracle引入了LWR。CR请求节点的LMS进程通过调用kcbgtcr或ktrget以构建CR缓冲区。当LWR规则触发条件:
- 请求物理I/O。
- 找到具有相同类,相同AFN和相同blockID单objectID的的缓冲区,一般是删除或truncate的对象。
- 写进行中。
Fairness
Oracle为了在锁转换和cr块构造产生的开销之间选择最小消耗资源的方式,引入了fairness机制。当一个节点多次(_fairness_threshold)请求另一个节点具有独占锁的buffer的时候。另外一个节点会将buffer上的锁降级为scur然后把block传输到请求节点。之后这个节点再次访问该buffer的时候直接到本地buffer cache申请即可。
LMS(构建CR缓冲区)执行buffer锁的降级转换动作,如果:
- 块不是UNDO,锁定保持在X模式
- 自上次对块进行更改以来,缓冲区的CR请求过多。如果有超过_fairness_threshold次数的CR请求,LMS会执行此操作。
还没有评论,来说两句吧...