Oracle12cRAC中GC等待高的本质是跨节点争抢同一数据块,而非网络问题;常见于热点块并发访问、未绑定变量SQL等场景。定位需分析等待时间分布桶、查询GC密集SQL及对象master节点。有效隐式参数包括_gc_affinity_time等,可减少块迁移。GC等待常与锁争用并发出现。
GC等待高本质是跨节点争抢同一数据块,而非网络问题;gc buffer busy acquire等待的是其他会话释放数据块锁,常见于热点块并发访问、未绑定变量SQL及非本地master执行全表扫描等场景。
首先要明确一点:Cache Fusion本身不是问题,它只是把应用或数据访问模式的缺陷暴露了出来。GC等待高,归根结底是跨多个节点争抢同一数据块。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
这个等待事件,实际上等待的是另一个会话释放对某个数据块的持有锁,而不是网络传输。举个例子,实例1的会话A正在更新某行数据(持有 XCUR 锁),实例2的会话B同时想读取这行(需要构造 CR 块),但发现该块正被修改且未提交,会话B就会卡在 gc buffer busy acquire 上。
常见的触发场景通常包括:
gc cr block busy查询 GV$SYSTEM_EVENT 中 gc cr block busy 和 gc current block busy 的等待时间分布,比什么都直观:
ethtool -S ethX 的 rx_discards 是否非零)ifconfig 显示的 RX/TX 字节数包含以太网头,不能直接用于计算 GC 的流量利用率;真正应该看的是 TCP 层的有效载荷和丢包指标不用靠猜测,用数据说话就行:
GV$SQL 中 buffer_gets/executions 高但 disk_reads/executions 低的语句——这类 SQL 在单实例上运行得很快,到了 RAC 上就成了 GC 杀手ALTER SYSTEM SET EVENTS '10046 trace name context forever, level 8',抓取 trace 看 WAIT #1: nam='gc current block 2-way' 后面跟着哪条 SQLGV$SEGMENT_STATISTICS 查找 global_cache_cr_blocks_served 高的对象,再反查它的 master 节点(x$kjbr 中 KJBRMASTER),确认是否与访问节点错位Oracle 官方虽然不公开推荐这些参数,但生产环境验证过确实有效的包括:
_gc_affinity_time = 10:让块在本地多停留10秒,减少不必要的迁移;适用于读多写少、热点稳定的场景_gc_affinity_percent = 50:只有本地访问占比低于50%时才考虑迁走块,避免“刚热起来就被踢走”的情况_gc_read_mostly_locking = TRUE:仅对显式标记为 READ ONLY 的表空间或分区生效,能大幅降低 GES 协调的开销_gc_lms_processes:默认是2,设为4可能有效,但超过4容易引发 LMS 进程之间的竞争,反而抬高 CPU 消耗最容易被忽略的一点是:GC 等待从来不是孤立存在的——它往往和 enq: TX - contention、buffer busy waits 或 gc current grant 2-way 串在一起出现。看到一个,就得顺着链条往下深挖,否则只调整表面参数毫无意义。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述