关于DRM(Dynamic Resource Mastering)
前段时间,生产环境RAC数据库相应较慢,怀疑与较多的"gcs drm freeze in enter server"事件有关。
在相关专家的建议下,数据库关闭了DRM:
_gc_undo_affinity=false
_gc_affinity_time=0
那么,什么是DRM?
系统启动时,在RAC中,以hash方式确定每个数据块的master实例。随着应用的运行,可能某个数据块更多的被非master实例访问,如果可以根据访问频率,
将数据块的master动态调整为访问频率最高的实例,将会减少实例间通讯,提高应用性能。
1,DRM相关参数
_gc_affinity_time:检查是否需要remaster的频率(以分钟为单位);设置为0禁用该特性(同时停止了相关信息收集);缺省值10分钟
_gc_affinity_limit: 某个节点至少需要访问一个对象(比当前master多)多少次才能被DRM;缺省值50
_gc_affinity_minimum: 在开始remaster一个对象前,每分钟至少需要访问的次数,缺省值2400
_gc_undo_affinity:对undo段是否启用drm,缺省值TRUE
2,DRM实现机制
(1)由LCK0进程维护对象统计信息x$object_affinity_statistics,在满足_gc_affinity_limit,_gc_affinity_minimum条件后,会被放在一个队列;
(2)LMD0读取该队列,启动GRD冻结;
(3)LMON与LMS进程完成重构.
x$object_affinity_statistics跟踪对象访问次数:
select * from x$object_affinity_statistics where bject=6099472; ADDR INDX INST_ID OBJECT NODE OPENS ---------------- ---------- ---------- ---------- ---------- ---------- FFFFFFFF7C05BFA8 0 1 6099472 1 7437
3,DRM相关视图:
(1)v$gcshvmaster_info
SQL> select * from v$gcshvmaster_info;
HV_ID CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT
1 1 1 32767 0
2 2 0 32767 1
3 3 1 32767 0
4 4 0 32767 1
...
126 126 0 32767 1
127 127 1 32767 0
128 128 25 6 117440517
已选择128行。
说明:
如果object_id>4294950912,表示undo segment no:
usn=object_id-4294950912,其中:
[ 4294950912 = power(2,32) - power (2,14) = xFFFFC000 ]
(2)v$gcspfmaster_info
SQL> select * from v$gcspfmaster_info; FILE_ID OBJECT_ID CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT ---------- ---------- -------------- --------------- ------------ 0 1 0 32767 1 0 4 1 32767 0 0 181049 1 32767 1 0 185360 1 32767 0 0 185364 1 32767 0 0 181614 0 1 2 0 181632 1 0 2 0 181679 0 1 3 0 182118 0 32767 1 0 182184 0 32767 1 0 184027 1 32767 1
已选择11行。
测试:
--对象
SELECT owner, object_name, object_type
FROM dba_objects
WHERE object_id = 181679;
OWNER OBJECT_NAME OBJECT_TYPE
BOCNETYL USERS TABLE
--表BOCNETYL.USERS当前master是1:
select * from v$gcspfmaster_info where object_id=181679;
FILE_ID OBJECT_ID CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT
0 181679 1 0 2
--在instance0上对表BOCNETYL.USERS进行全表扫描
select /*+ full(t) */count(*) from users t;
--表BOCNETYL.USERS当前master是0:
select * from v$gcspfmaster_info where object_id=181679;
FILE_ID OBJECT_ID CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT
0 181679 0 1 3
(3)表X$KJDRMAFNSTATS记录DRM次数
4,手工DRM
SQL> select object_id,current_master, previous_master ,remaster_cnt from V$GCSPFMASTER_INFO where object_id = 144615
OBJECT_ID CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT
---------- -------------- --------------- ------------
144615 0 2 0
The object 144615 is currently mastered on node 0.
NODE2> oradebug setmypid
Statement processed.
NODE2> oradebug lkdebug -m pkey 144615
Statement processed.
NODE2> select object_id,current_master, previous_master ,remaster_cnt from V$GCSPFMASTER_INFO where object_id = 144615
OBJECT_ID CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT
144615 2 0 0
To dissolve remastering of this object on this instance
SQL> oradebug lkdebug -m dpkey 144615
SQL> select object_id,current_master, previous_master ,remaster_cnt from V$GCSPFMASTER_INFO where object_id = 144615;
no rows selected
5,DRM相关等待事件
"gcs drm freeze in enter server",虽然10gR2采用并行方式remaster,仍然可能导致系统出现大量"gc buffer busy"事件.
6,DRM不同版本的变化
(1)10gR1是文件粒度的remaster;10gR2是对象粒度的remaster;
(2)11g后,affinity被替换为policy,比如:
x$object_affinity_statistics ==> x$object_policy_statistics
_gc_affinity_limit ==> _gc_policy_limit
_gc_affinity_time ==> _gc_policy_time
新增了视图v$policy_history,其中所有'initiate_affinity'都是DRM事件.
select * from v$policy_history INST_ID POLICY_EVENT DATA_OBJECT_ID TARGET_INSTANCE_NUMBER EVENT_DATE ---------- -------------------- -------------- ---------------------- -------------------- 2 glru_on 0 1 10/15/2010 10:58:28 2 glru_on 0 1 10/15/2010 11:21:32 2 initiate_affinity 74809 1 10/15/2010 13:27:44
7,DRM建议
不建议完全禁止drm,而是提高drm触发条件,比如增加_gc_affinity_time,_gc_affinity_limit,_gc_affinity_minimum.
在启用DRM的情况下,可以在不丢失高可用性的前提下,方便的实现应用访问特定实例(通过优先访问特定ip,而不是load_balance=yes),减少实例间通信,提高系统性能。