zoukankan      html  css  js  c++  java
  • 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),减少实例间通信,提高系统性能。

  • 相关阅读:
    经方膏方
    荆防柴朴汤
    温经汤治痤疮
    经方治疗带状疱疹
    用排除法诊断半表半里证
    leaflet 学习备忘
    在线数据库设计 初稿 想法简单验证
    SVG PATH 生成器
    模仿bootstrap做的 js tooltip (添加鼠标跟随功能)
    js 生成随机炫彩背景
  • 原文地址:https://www.cnblogs.com/chendian0/p/14700433.html
Copyright © 2011-2022 走看看