DRM锁重构风暴是Oracle RAC中因_gc_affinity_time过短导致LMD0频繁触发资源重主,引发GRD冻结、全局锁等待飙升及gc current split等等待事件集中爆发的性能抖动现象。
DRM锁重构风暴是什么现象
这是 Oracle RAC 中一种隐蔽但杀伤力强的性能抖动:LMD0 进程频繁触发资源重主(remastering),导致 GRD 冻结、全局锁等待飙升,gc current split、gc buffer busy 等等待事件集中爆发,业务响应延迟突增 200%–500%,尤其在批量插入或索引维护期间更明显。
根本不是“锁太多”,而是 drm 在错误的时间、对错误的对象做了太多次重主 —— 比如一个被 3 个节点高频访问的索引块,在 _gc_affinity_time 设置过短时,几分钟内反复在节点间迁移 master,每次迁移都伴随 grd 冻结和跨节点广播。
禁用 DRM 的实操路径与副作用
禁用是最快止血手段,但必须分场景判断:
- 如果是 11gR2+ 且集群稳定、无频繁扩缩容,可直接禁用:
ALTER SYSTEM SET "_gc_affinity_time"=0 SCOPE=SPFILE;
- 不要只改一个实例,必须所有节点统一设置,否则残留 affinity 统计会引发不一致行为
- 禁用后
x$object_affinity_statistics 不再更新,但已有 master 分布维持不变,不会自动回退到静态分配
- 副作用:失去负载自适应能力;若某节点长期离线后恢复,其 buffer cache 可能持续访问远端 master,增加跨节点通信开销
ALTER SYSTEM SET "_gc_affinity_time"=0 SCOPE=SPFILE; x$object_affinity_statistics 不再更新,但已有 master 分布维持不变,不会自动回退到静态分配 注意:禁用 ≠ 关闭所有重主。实例启停、节点驱逐等 reconfiguration 仍会触发必要重主,只是消除了“动态”部分。
_gc_affinity_limit 和 _gc_affinity_minimum 怎么调才不翻车
这两个参数控制 DRM 启动门槛,调得太松等于没关,太紧又可能漏掉真实热点:
-
_gc_affinity_limit 默认 50:指“非当前 master 节点”访问次数需超过当前 master 多少次才考虑迁移。建议压测后设为 200–500,避免单次误判触发
-
_gc_affinity_minimum 默认 2400(即每分钟 40 次):是启动统计的“冷启动阈值”。若业务峰值访问频次低于此值(比如某些报表库每分钟仅 10 次访问),DRM 根本不会启动,此时调低反而无效
- 关键陷阱:这两个参数只对 对象级(10gR2+)生效,对文件级(10gR1)完全无效;确认版本再调,别在 10.1 上折腾
_gc_affinity_minimum
如何验证 DRM 是否真被抑制了
不能只看参数,得看运行态证据:
- 查 LMD trace 文件(路径通常为
$ORACLE_HOME/rdbms/log/lmd*.trc),搜索 "DRM start" 或 "remastering",禁用后应完全消失
- 查询
x$object_affinity_statistics:如果 _gc_affinity_time=0 已生效,该视图中 OPENS 列将长期为 0 或不再增长
- 监控 AWR 报告中 “Global Cache and Enqueue Services” 部分:DRM 相关等待(如
gc drm freeze)应归零,且 gc current split 等待不再与 DRM 时间窗口强相关
_gc_affinity_limit 默认 50:指“非当前 master 节点”访问次数需超过当前 master 多少次才考虑迁移。建议压测后设为 200–500,避免单次误判触发 _gc_affinity_minimum 默认 2400(即每分钟 40 次):是启动统计的“冷启动阈值”。若业务峰值访问频次低于此值(比如某些报表库每分钟仅 10 次访问),DRM 根本不会启动,此时调低反而无效 _gc_affinity_minimum
- 查 LMD trace 文件(路径通常为
$ORACLE_HOME/rdbms/log/lmd*.trc),搜索"DRM start"或"remastering",禁用后应完全消失 - 查询
x$object_affinity_statistics:如果_gc_affinity_time=0已生效,该视图中OPENS列将长期为 0 或不再增长 - 监控 AWR 报告中 “Global Cache and Enqueue Services” 部分:DRM 相关等待(如
gc drm freeze)应归零,且gc current split等待不再与 DRM 时间窗口强相关
最常被忽略的一点:DRM 参数修改后必须重启实例才生效,alter system set … scope=spfile 不会热加载 —— 很多人改完就去看 AWR,发现没变化,其实是忘了重启。










