10G后Latch的工作方式(一)
Latch是10GR2后改变了许多,但现在网上针对Latch工作原理的文档,大多数还是针对9i时的Latch。你只要稍微留意一下10GR2联机文档中V$LATCH视图,其中有差不多一半的列都deprecated,包括WAITERS_WOKEN、WAITS_HOLDING_LATCH、SLEEP[1 | 2 | 3]、SLEEP4、SLEEP[5 | 6 | 7 | 8 | 9 | 10 | 11]。这说明Latch内部的工作原理已经和9i有了很大的变化。那么,10G后的Latch是什么样子呢。
让我们先来温习一下9i的Latch获得流程。
1、请求某Latch
2、如果不能获得,开始Spin
3、spin一定次数后(通常是2000次),如还不能获得,进入睡眠,这是SLEEP1。
4、睡眠醒来再次请求Latch,如还不行,再次睡眠,这是SLEEP2。
等等。
10G后Latch是什么样的流程呢?下面我们来看一下。
首先,我们先说明一下如何长时间的持有某个Latch。因为Latch的持有到释放很短,使用普通的方式,几乎不可能让一个Latch长时间的持有。这样我们很难详细观察Latch的持有、争用。如果能长时间持有指定Latch,就可以很方便的观察Latch的争用。
有什么方式可以随心所欲的持有Latch吗? Certainly ,但我们需要使用一个强大的工具:DTRACE。这个玩意只能在Solaris平台使用。Linux也有类似的,但要重新编译内核,调整DEBUG级别,这样会对后面装Oracle,特别是装RAC带来影响。相比之下,还是Solaris下的Dtrace更好用。Dtrace的使用非常简单,如果有兴趣,装个Solaris,跟着我的总结做几次,就能掌握它的使用。可以说,Dtrace是居家旅行、杀人灭口、研究Oracle必备良药,药效胜过含笑半步跌。
好,闲言少叙,开始。
首先,在武林奇书,有Oracle内功心法之称的DSI中,第405册138页,Oracle介绍了Latch的调用和释放函数:
我们主要感兴趣的是Kslgetl、Kslgetslt和kslfre。OraDebug工具中有一个功能,可以在Sqlplus中直接调用Oracle的函数。猜想Oracle留此功能的目的是方便调式代码,Oracle的本来目的都无所谓,对于我们来说,这等于给我们有志于研究Oracle的人大开方便之门,如果我们能直接调用Kslgetl、Kslgetslt获得某一个Latch,这样就可以很方便的观察Latch的获得、争用、等待。哪么,这几个函数的调用规则是怎样的呢?DSI中并无明确提示,该Dtrace出场了,我们在Solaris中,用vi类工具创建如下无格式文本:
相关文章