【深入解析】DRM和read-mostly locking

2016-11-09 何剑敏

何剑敏 

Oracle ACS华南区售后团队,首席技术工程师。多年从事第一线的数据库运维工作,有丰富项目经验、维护经验和调优经验,专注于数据库的整体运维。

1了解DRM(Dynamic Resource Remastering)

讲DRM(Dynamic Resource Remastering),首先一定说说cache fusion的机制,cache fusion是在8i OPS中引入,解决的目的是原来在OPS中,instance A读某个block,instance B也要读时,instance A必须把该block写入到磁盘,然后由instance B从磁盘读取。当时在8i中引入cache fusion,使得“读”能跨节点的“读”,但是“写”(或者说修改),还是要写入到磁盘,再在另一个节点读出来,然后修改。

9i中,“写”得到了改进,脏块也能跨节点的传输。这就是常说的Write / Write Cache Fusion。

10gR1引入DRM,但当时的DRM功能很有限,只有在instance变化的时候(如instance被踢出集群,instance加入集群)才进行资源的remastering。

10gR2引入Affinity Locks和Object级别的DRM。

11g引入Read-Mostly和Reader Bypass

2DRM的实现依赖以下的功能:


1、Read-mostly locking

【原理】11g的DRM引入了read mostly locking的机制,它会基于对象的global operation历史。

read mostly locking机制,能减少读访问的消息传递和CPU消耗,但是写访问就会比传统的cache fusion locking机制消耗更多的IO。

oracle的cache层记录着每个对象上的S lock和X lock的数量,如果某个节点打开了大量的S lock并且很少了的X lock,并且block传输的比较少,那么这个对象在这个节点上就是read mostly了。当read mostly发生的时候,对象的共享就停止了,并且block不再通过interconnect进行传输(除非block被修改)。

当一个对象被定义成read mostly,他会被master node授予在所有节点上的S affinity lock,这意味着所有的节点都被“提前”授予了该block的读访问权限,因此,减少了在各个节点间互相传递S lock的消息量。

Oracle使用一种特殊的叫anti-lock,来控制read mostly对象上的X锁。当x lock被申请时,所有的节点会被广播通知到要打开anti-lock,,在anti-lock的淫威之下,所有的对那个块的访问(不管是S lock还是X lock)都会变成标准的cache fusion locking,即使该对象本身还是read-mostly。广播会在分配X lock之前完成,仅当block上没有anti-lock打开的时候。anti-lock将会在read-mostly消失的时候,或者脏块写入磁盘的时候清除掉,并且X lock会降级。

为read-mostly的对象打开x lock是非常昂贵的操作,在分配x lock之前,master node需要广播anti-lock给所有的节点。在x lock关闭之前,anti-lock不能被移除。另外,在节点加入集群的时候,他也会创建anti-lock,anti-lock只是在LE上标记KCLL_F_ANTI,并且在有anti-lock的情况下,read-mostly lock不能被分配。

【性能优势】在读居多的情况下,由于减少了消息传递,因此"gc cr grant 2-way", "gc current block 2-way" and "gc current block 3-way"的等待大大减少,但是你会看到"db file sequential read"的等待有所增多,因为不在内存间传输block块,而改成去物理文件读取了。GCS消息传递和block transfer的统计值也大大减少了。

在写居多的情况下,X lock的请求会增加,anti-lock广播的次数也会增多,此时"gc current grant busy"的等待就会增加,因为GCS的消息传递增加了。 另外,由于打开anti-lock的block的行为都会变成传统的cache fusion的行为,你将又能看到一些2-way grant和block transfer的等待了。

由于减少分配S lock,只要在读居多的情况下(即X lock申请量不多的情况下),cluster还是很能从read-mostly特性中得到好处的。

这是因为在节点数多的情况下,远程分配的机会将会大大增加。这意味着利用read-mostly将能减少消息传递。另一方面,当节点增加时,X lock的请求将会增多,这是因为X lock的请求会传播到每个节点,当节点数增加的时候,消息传递的成本也增加了。

总而言之,clsuster将会在节点数多,且X lock请求少的情况,因为read-mostly特性而收益。但是当X lock请求增加的事情,性能会急剧的降低。从另一方面说,如果你的节点数比较少,那么或许你从read mostly特性那里得不到很多好处。

而由于read mostly会消耗比较多的IO,这个时候你就要估计你一下你的IO情况了,如果你的块和消息传递的收益小于IO负载变重的情况,或者你已经处于IO压力很大的情况下,那么,就不建议你开启read mostly的特性了,你可以禁用read mostly的特性。设置方式是:_gc_read_mostly_locking=FALSE

因此,read-mostly的特性是给那些读很多,写很少的系统来启用比较合适。

【read-mostly的过渡】

oracle的cache层保留着每个object的x/s lock的请求统计信息,他会根据统计信息,自动初始化或者舍弃read-mostly。这种过渡和affinity很相像,通过标准DRM协议。当cache层看到太多anti-lock的时候,read-mostly将会被舍弃。当read-mostly的负载突然变成大量的写的负载的时候,大量的anti-lock增加的时候,这种过渡就会发生了。举例来说,就是当一个大量被read-mostly的表,进行了大量的update操作的时候,这种过渡就发生了。

2、Object affinity

说实在的,我一直不知道affinity这个词该怎么翻译,亲和力?吸引力?我们姑且把它叫做对象吸引吧。

在默认的情况下,即当没有吸引机制或者read-mostly策略生效的情况下,buffer cache的资源master权限是会被均匀分发到每个active的节点,也就是说,某个数据库节点成为master的概率是N分之一,N为active的节点数。

吸引机制能通过master节点上被访问最多的buffer cache资源,来减少消息传递和CPU的负载。吸引机制是在10gR1版本引入的,但是只是针对datafile级别,如果某个datafile被某个instance经常访问,所有属于这个datafile的buffer都会remaster到这个节点上。从10gR2版本开始,吸引机制是基于object级别了。某个对象会在某个实例上特别的受欢迎,因此该节点上对应的global cache资源也会变成master。

吸引机制能通过减少代码路径的长度和GCS的消息传递,从而达到优化性能的效果。当一个block是在远端节点是master,GCS信息就要从请求者处发送到master处。用来接收锁分配和读权限。如果这个block remaster到了请求者的节点上,那么消息传递的过程就免了。其他类似的操作也会免了,如写或关闭操作。

一旦吸引完成,请求者节点就基本上能“廉价”的affinity (b)locks,从而大量的减少代码路径。

3、Undo affinity

undo的吸引和对象吸引类似,只不过它发生在undo block上,也就是说,所有的global cache资源的undo segment,都将master在某个实例上。

undo吸引发生在如下的情况下:

undo_management设置成auto时,发生在instance启动的时候,在undo_tablespace里面指定的undo segment,或者当undo_tablespace发生变化时候。

undo_management设置成manual是,发生在instance启动时,在rollback_segments中指定的rollback_segments,或者运行“alter rollback segment…online”,致使rollback_segments变化。

当instance crash时,recovering instance会暂时master crash instance的undo block,当recover完成之后,所有的undo buffer会flush到disk上,用来优化remaster在crash instance再次启动的时候。

当对象变成read-mostly的时候,打开S lock就变成非常廉价的操作了,因为没有消息传递,并且没有了分配和初始化LE(LOCK ELEMENT)、lock context、KJBL结构、KJBR结构和准备READING buffer。

read-mostly lock是非常简单的在buffer header处标记KCBBHFRM,这和S lock的操作是等价的。read-mostly lock会很快被grant。

3DRM的大致机制

GCS会追踪每个节点、每个对象上的锁请求和锁类型,有3个进程执行DRM的功能:LCK0,LMD0和LMON。

一旦DRM请求开启,它先会将请求插入到请求队列中,接着,LMD0会为DRM请求检查请求队列,如果LMD0找到了一个请求,消息将在各个节点间交换,然后set DRM为freeze状态。

当所有节点都成功的完成此操作后,LMON进程将发起和LMS进程一起进行remaster操作。

remaster的步骤和LMON进程的reconfiguration类似,remaster会在一个所谓的“窗口”完成,(“窗口”的大小原来由_lm_drm_window确定,在11g中由_lm_num_pt_bucket/_gc_latches决定。)这项技术由于只是冻结部分的资源,因此可用性得到了增强。

它的步骤包含以下几个状态:

QUIESCE - 这个状态是发生在相关的block刚刚完成transfer的情况下,没有新的OPENS和CONVERTS发生在remaster的资源上。

FREEZE - LMON进程等待所有节点都确认当前“窗口”已经被冻结。

CLEANUP - 老的master清理remote lock,并且删除需要remaster的所有对象的resource。

REPLAY - 将本地的lock信息传送到新的master上。

FIXWRITES - 重建新master节点上的资源的写状态。

END - 解冻当前“窗口”,移动到下一个窗口。

SYNC –发生在上述的步骤中。本地的节点等待其他节点完成他们之前的DRM操作。


4DRM的相关参数

1. _gc_policy_time (Oracle10g: _gc_affinity_time), default=10

表示检查对象是否进行吸引或read mostly的时间间隔。

2. _gc_affinity_ratio (Oracle10g: _gc_affinity_limit), default=50

表示某节点上的对象访问比其他节点多50倍(2015-11-30 15:40更新,注意是50倍,不是50次。),就认为是满足吸引的条件。

3. _gc_policy_minimum (Oracle10g: _gc_affinity_minimum) default=600 in Oracle10g, 1500 in Oracle11g

表示在发生affinity之前,每分钟每个CPU访问文件/对象的次数。当默认的超过每分钟每个CPU 600次时,触发吸引或read-mostly。

4. _gc_undo_affinity and _gc_undo_affinity_locks, both default to TRUE

决定undo吸引是否进行。这个参数不建议改动。

5. _gc_transfer_ratio defaults to 2 (which means 50%)

如果block在内存间传输量少于从磁盘读取的block的量的50%,那么read mostly将会被允许进行。

6. _gc_affinity_locking and _gc_affinity_locks, both default to TRUE

决定对象吸引是否开启。

7. _gc_read_mostly_locking, defaults to TRUE

决定read mostly特性是否启用。

8. _lm_drm_max_requests, default=100

在一次DRM中,DRM请求能被处理的数量。

About Me

..........................................................................................................................................................................................................................................................................................................

● 本文来自于微信公众号转载文章,若有侵权,请联系小麦苗及时删除,非常感谢原创作者的无私奉献

● 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● QQ群:230161599  微信群:私聊

● 原文地址:http://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650272226&idx=1&sn=7a0ca3b29a65c5743f27e42ef3664dbb&chksm=be4869f4893fe0e2203a704b0c7905b0f98ed43ab15b775b741d30adf7f63f29c40610a2add5&mpshare=1&scene=23&srcid=1119oV9dQWGqpy6K2bl1EAYK#rd

● 小麦苗分享的其它资料:http://blog.itpub.net/26736162/viewspace-1624453/

● 小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● QQ群: 230161599   微信群:私聊

● 联系我请加QQ好友(642808185),注明添加缘由

● 文章内容来源于小麦苗整理的笔记,若有侵权或不当之处还请谅解!

●【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】

..........................................................................................................................................................................................................................................................................................................

手机长按下图识别二维码或微信客户端扫描下边的二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,免费学习最实用的数据库技术。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2128730/,如需转载,请注明出处,否则将追究法律责任。

【微信公众号】【深入解析】DRM和read-mostly locking相关推荐

  1. 超详细 erlang服务器之微信公众号被动解析用户消息(明文模式安全模式)

    目录 一.前言: 二.配置微信公众号基础接口 (1)填写IP白名单和App Secret (2)配置微信公众号服务器URL​编辑 (3)配置微信公众号网页授权域名 (4)自定义菜单 (4)微信公众号推 ...

  2. js如何调用h5的日期控价_微信公众号支付H5调用支付解析

    最近项目需要微信支付,然后看了下微信公众号支付,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付 ...

  3. h5通过php微信支付宝支付,用H5调用支付微信公众号支付的解析

    这篇文章主要为大家详细介绍了微信公众号支付H5调用支付,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近项目需要微信支付,然后看了下微信公众号支付,虽然不难,但是细节还是需要注意的,用了大半天时 ...

  4. php如何判断是否关注,微信公众号判断用户是否已关注php代码解析

    搜索热词 <:微信公众号判断用户是否已关注PHP代码解析>要点: 本文介绍了:微信公众号判断用户是否已关注PHP代码解析,希望对您有用.如果有疑问,可以联系我们. 用户关注公众号,才能参与 ...

  5. 如何用python爬取公众号文章搜狗微信搜索_python如何爬取搜狗微信公众号文章永久链接的思路解析...

    这篇文章主要介绍了python如何爬取搜狗微信公众号文章永久链接的思路解析 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 本文主要讲解思路,代码部分请自行解决搜狗微信 ...

  6. 微信公众号网页授权思路解析及具体代码

    微信公众号网页授权思路解析及具体代码 微信开发文档 实现方式也是两种: 1.静默授权登录 授权登录以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静 ...

  7. php公众号被动回复,微信公众号被动消息回复原理解析

    背景:某分厂需要实时查询工件堆放的位置,要求快速便捷,因此设计了采用微信公众号被动回复信息的方案. 技术实现:开发者服务器--基于Angular2框架的已发布网站,编程语言为Python,后台存储数据 ...

  8. 带你解析微信公众号灵魂有香气的女子的创始人李筱懿

    我呢?是一个家庭主妇,平时在家没什么事,无聊的时候就喜欢看看网上的一些衣服从而打发一下时间,这不朋友向我推荐了一个微信公众号--灵魂有香气的女子,发现里面的衣服.化妆品都蛮不错的,衣服穿在身上非常的时 ...

  9. 解析:外部网页内如何一键换气手机微信关注微信公众号

    参考接口样式:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=*********==&scene=110==#wec ...

最新文章

  1. RabbitMQ 入门系列(10)— RabbitMQ 消息持久化、不丢失消息
  2. DELL服务器利用OMSA修改BIOS设置
  3. Spring boot的Spring MVC自动配置
  4. 《实用软件架构:从系统环境到软件部署 》——2.4 架构视图与架构视点
  5. LOOP WITH CONTROL 用法
  6. K8S中手动扩容云盘数据卷
  7. 引用类型--Object类型、Array类型
  8. HyperLeger Composer 重启 | 进入play ground | 进入 couchdb
  9. python中nameerror怎么处理_python中的错误如何查看
  10. find命令日常用法和文件名后缀
  11. CCIE红头发讲解CCNA、CCNP视频教程
  12. 数据结构(C语言版第二版)思维导图
  13. STM32用串口(USB串口)下载程序的方法
  14. idea打包jar的多种方式
  15. 美味冰皮月饼的做法 月饼的做法
  16. 企业微信如何发成绩给家长-Leo老师来教你
  17. Java的SSL连接
  18. 【C语言】打印出一箭穿心图案(简单版)----gotoxy函数
  19. 最优化方法之梯度下降法和牛顿法
  20. Proteus报错:External model DLL “ADC083X.DLL“ not found. GLE=0x000036B1

热门文章

  1. golang 消息忽略 signal.Ignore(syscall.SIGHUP) 示例
  2. 回头看看,是否会有更好的人与物……
  3. 甘肃增值税起征点变10万元 惠及61万小规模纳税人
  4. 3DSlicer扩展模块如何加入外部扩展包?
  5. 使用SQL语句对表进行插入、修改和删除数据操作
  6. 巩固知识体系!这么香的技术还不快点学起来,高级面试题+解析
  7. mingw-w64-dgn
  8. メイプルストーリー、「魔法少女まどか☆マギカ」とのタイアップを実施
  9. 设备EAP管理 Equipment Automation Program
  10. JSE2-对象和类基础