探索系列——神人steve adams之著oracle8i interal service(十三)

因为它们在本地会全部解决(或者处理)。如果这些等待所花时间从平均上讲长于10 centisecond,此时lmdn进程就会超负荷工作.


instance lock acquisition
   一旦得到一个锁句柄,需要一个实例锁的进程会构建并发送第二个消息给lmdn进程用来转换锁.这个消息会标识锁句柄,指定或说明新的所需要锁模式,还要配置另外的一些选项.
如果资源的主节点是已知的,这个往上可能直接发给主节点的lmdn进程,当然这依赖于_lm_direct_sends参数,在oracle8.1中它默认为all,仅仅在oracle8中是lkmgr.
   如果资源的主节点依旧是未知的,本地lmdn进程发送一个消息给目录结点,查找哪个结点是资源的主节点.如果一个主节点没有被分配,目录节点会分配或指派一个主节点。根据资源类型,the lock mastering(我译为锁驻于于对应主节点上面的这个操作机制),即可以循环性或周期性分配给所有活动的节点,或者分配给初始发起的实例(条件是这个资源不可能在其它实例中使用).
一旦主节点可知(或确定了),获取或转变请求可以forwarded给主节点.
   
   如果主节点上面的锁信息表明,锁是马上被授予的,于是这个锁会被在同时在主节点和本地节点链接到被授予的队列上,同时一个转变ast消息返回给客户端进程(通过客户端实例的lmnd进程)。否则,锁被链接到这个资源的转化队列上,客户端进程继续等待.

   当一个锁请求被阻塞(也就是不能马上得到锁),主节点的lmdn进程可能要求或询问锁持有者降低它们对于资源的锁模式,为了允许新的转变请求可以被授予.通过发送一个阻塞异步trap可以实现它,或者bast,给阻塞进程和实例.锁持有者是否能收到这个bast消息,它乐于或愿意降级锁级别,这些可以锁获取或转变期间进行配置.当一个阻塞进程遵从一个bast,它会发送(回复)ast确认或完成消息.


   gv$dlm_locks显示实例锁数据库中所有被阻塞及阻塞锁的一切细节信息,包括获取和转化锁的一切选项配置信息。gv$dlm_all_lock展示相同的细节信息,但只是针对性于所有的实例锁,包括 以null mode持有的锁.



lckn processes
     一些实例锁并不能直接经过需要锁的进程哪里获取(得到).相反,lckn进程代表整个数据库获取它们.lckn进程以异步方式操作它们.也就是说,当它们给lmdn进程发请求时,它们不会等待返回一个ast获取或转换确认.相反,它们会继续处理来自其它进程的其它锁请求.这就是为何在同步和异步global lock gets和conversions之间gv$sysstat统计信息有显著的区别。


     默认情况下,仅仅会开启一个lckn进程.正常情况这就足够了,因为它以异步方式操作.但是,如果lck0非常活跃(可以理解很busy),另外如果os不支持优先级固定机制priority fixing,这时lck0可能必须要排队等待cpu,因此会降低整个系统性能.如果是这样的话,可以用_gc_lck_procs开启多个lckn进程.



    


lock value blocks
     当一个进程需要或转化(变)一个实例锁时,它可能读写16byte字节lock value block锁值块,这个锁值块是在主节点的资源结构进行维护的.比如,sm(smon)实例锁资源的lock value block锁值块表示smon进程在任何实例上次运行时间last time.使用锁值块工具或机制也可以与多个实例间的scn进行通讯,建立并行执行通讯路径或通道.但是锁值块不能用于大多数资源类型.


     再多说一点,本地入队local enqueue的资源结构也包含一个锁值块,但它很少使用.



global locks
     单实例数据库中本地锁保护的一些资源,在ops下需要全局显露(可以理解为这个资源必须在所有ops实例可见).只要需要这些本地锁,也必须持有一个对应的实例锁,以保护跨多个实例ops的资源.像这种从全局性方面用于保护本地锁的实例锁,叫作全局锁global locks.但是,这个术语有时也可以通俗表示为所有资料实例锁的一个同义词或代言.




row cache instance locks
     row cache instance locks直接correspond对应local row cache enqueue locks.它们不会取代或替代本地锁(后者),但会让它们(后者:指本地锁)进行全局显露.

     当一个进程需要一个row cache instance lock时,它发通知给lck0后台进程,我想以实例的身份(或代表)得到这个锁,等待一个row cache lock等待.当等待对应的本地锁时也会记录这个等待.lck0以异步方式得到这个实例锁.当lck0从lmdn处接受到ast获取或转变的信息后,它会发一个信息给等待进程.

     当本地进程release它的row cache enqueue lock时,仍旧会缓存dictionary row,因此实例锁没有release,但会通过lck0进程在后台降级到null mode.但是,如果dictionary cache条目从共享池中被刷出,则会release row cache instance lock。


     虽然dictionary cache 条目和row cache enqueue locks在共享池中动态分配,但是它们对应的实例锁的锁状态信息lock state information不是这样.这些锁状态信息是在一个由_row_cache_instance_locks参数控制大小的一个固定队列中进行维护.这个队列的大小会限制每个实例可以缓存多少个null mode的实例锁,因此控制了row cache instance locks对于instance lock database实例锁数据库的资源使用程度或资源使用情况.
如果gv$rowcache显示正在进行dlm_releases且没有一些dlm_conflicts,可以考虑加大这个队列的大小,缓存这些处于工作状态或正在运行状态一系列的实例锁.





global enqueues
    单实例数据库的入队锁保护的大多数资源在ops下也要进行全局显露.这些就是全局入队.全局入队锁可以被前台或后台进程获取(当它们得到或持有一个本地锁时).它们并不能被代表整个实例的lckn进程获取.全局入队的实例锁资源是动态分配的,像本地入队资源一样,它们不是持久性的.大多全局入队资源类型是以本地方式主导mastered locally,因为这些资源上面的锁,其它实例很少会需要它们.


    优化全局入队locking的最简洁实效方式,就是禁用表锁table locking.确实,在ops下强烈建议这样.在所有相关的表上使用alter table disable table lock比配置dml_locks为0更为明智.






cross-instance calls
    一个全局入队类型one global enqueue type完全值得特别提及或谈论,因为实例内部或实例间通讯的规则.一些操作,如:改变表空间的备份状态,日志文件操作,全局检查点操作,及其它操作,这些皆需要
全局协调,因为实现这些操作时所有的实例必须要协力或配合工作.
    多个实例间的通讯是用ci(cross-instance call)enqueue入队来实现.对于每种操作类型,每个实例的后台进程持有这一系列资源的实例锁.通过以不同模式操作锁,有可能会触发全局行为或动作,同时等待这些全局动作的完成.

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

转载于:http://blog.itpub.net/9240380/viewspace-660676/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值