X RAC之DRM解析

关于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),减少实例间通信,提高系统性能。

原文地址:https://www.cnblogs.com/chendian0/p/14700433.html