Oracle Deep Internals | 第三课(2)
2018-03-01
关于DB性能优化的一切|利用MaxGauge进行DB深度优化2
2018-05-02

 

Latch free

 

目录

1 Basic Info. 1

2 Parameter & Wait Time. 3

2.1 Wait Paremeters 3

2.2 Wait Time. 3

3 Check Point & Solution. 3

4 Event Tip. 3

4.1 锁存器相关的动态性能视图… 3

 

 

1 Basic Info

表示进程用Willing-to-wait模式执行相当于_SPIN_COUNT次数的自旋(spin)后失败后进入睡眠(sleep)。

Oracle为了保护SGA而使用锁存器。SGA是本地实例的单位存在,所以锁存器只能在相应实例上观察。锁存器的获取方式有Willing-to-wait和No-Wait两种。

Willing-to-wait方式等待到获取锁存器为止的方式,分为自旋(Spin)方式与Posting方式。自旋方式是在进程若在获取锁存器过程中失败,则循环适当的次数,并试图重新获取锁存器,它的循环次数与_SPIN_COUNT(缺省值是2000)参数值相同。而以Posting方式是执行的锁存器比起自旋方式相比是会长时间等待锁存器,是前一个锁存器解除为止在等待列(wait list)中等待的方式。在这里注意的部分虽然使用了等待列,但无法保障顺序。使用Posting方式的代表性锁存器是shared pool latch和library cache latch。

大部分的锁存器获取是使用Willing-to-wait模式,但以下情况使用No-wait模式。当前拥有其他锁存器的进程要获取比最近获取的锁存器级别低或相同的级别的锁存器时,会以No-wait方式尝试获取。

之所以使用Willing-to-wait和 No-Wait两种方式,是为了防止锁存器的死锁发生。要获取的锁存器比最近一个获取的锁存器的级别相同或小的时候,以No-wait请求;获取比最近一个获取锁存器的级别高的锁存器时,以willing-to-wait请求。发生锁存器的死锁时会报ORA-600的错误。

Latch基本上使用独占(exclusive)模式,瞬间只让一个进程占用锁存器,但在特殊的锁存器上也可以用共享模式占用。9i以上在cache buffers chains latch下读取时使用共享模式。

到9i为止所有锁存器等待现象是以latch free表示,但是10g开始重要的锁存器以其他的形式来表示了等待事件。虽不能直接掌握锁存器名称的latch free等待事件中,P2的值就是latch#,将该值与V$LATCHNAME.LATCH#连接就可以知道锁存器的名字。

SQL> select event#, name from v$event_name

where name like ‘latch:%’;

EVENT#  NAME

———- —————————————————————-

58 latch: cache buffers chains

106 latch: redo writing

107 latch: redo copy

191 latch: Undo Hint Latch

193 latch: In memory undo latch

194 latch: MQL Tracking Latch

204 latch: row cache objects

210 latch: shared pool

211 latch: library cache

212 latch: library cache lock

……

– latch: cache buffers chains
在高速缓冲区要查找特定块的进程需要获取cache buffers chains锁存器。在这个过程中若发生争用,会等待latch:cache buffers chains事件。

– latch: cache buffers lru chain
在高速缓冲区查找空闲缓存和脏缓存的进程需要获得cache buffers lru chain锁存器。在这个过程中若发生争用,会等待latch:cache buffers lru chain事件。

– latch: shared pool
在共享池的堆区域中分配新的大块(Chunk)的进程需要获取shared pool的锁存器。在这个过程中若发生争用,会等待latch:shared pool事件。

– latch: library cache
要探查库高速缓冲区的进程需要获取library cache锁存器。在这个过程中发生争用,会等待latch:library cache事件。

– latch: redo copy
将因DML修改内容记录到重做缓冲区进程需要获取redo copy的锁存器。在这个过程中若发生争用,会等待latch:redo copy事件。

 

2 Parameter & Wait Time

2.1 Wait Paremeters

latch free等待事件的参数定义如下。

P1:进程等待的锁存器所在的内存地址。

P2:锁存器号(与V$LATCHNAME.LATCH# 统一) 为了查询对应的锁存器号可以执行以下SQL语句。

SELECT * FROM v$latchname WHERE latch# = &p2_value;

P3:尝试次数。即,进程为了获取锁存器而尝试的次数。

2.2 Wait Time

事件的等待时间是指数级(exponential)增加。

 

3 Check Point & Solution

latch free事件的发生原因和解决方法是以锁存器种类而区分。参照各种latch free的事件说明。

 

4 Event Tip

4.1 锁存器相关的动态性能视图

V$LATCH:锁存器的分类统计值

GETS                  : Willing-to-wait 模式下睡眠之前的锁存器请求次数。

MISSES                : Willing-to-wait 模式下睡眠之前的锁存器的获得失败次数。

SPIN_GETS             : Willing-to-wait 模式下睡眠之前的自旋阶段的获得成功次数。

SLEEPS                 : Willing-to-wait 模式下睡眠次数。

IMMEDIATE_GETS       : No-wait 模式下锁存器获得成功次数。

IMMEDIATE_MISSES     : No-wait 模式下锁存器获得失败次数。

SLEEP1~SLEEP4        : 1~3 次的睡眠次数和4 次以上的睡眠次数。Oracle 10g R2 开

始不再使用,而是用V$EVENT_HISTOGRAM 视图代替。

WAITERS_WOKEN       : 使用latch wait posting 时,会话“苏醒”的次数。Oracle 10g R2开始不

使用latch wait list 锁存器,这意味着latch wait posting算法完全被替换。

WAIT_TIME             : 为获得锁存器而等待的时间(单位是ms)。

V$LATCH_PARENT      :独立锁存器和父子锁存器的统计

V$LATCH_CHILDREN    :子锁存器级统计值

V$LATCH_HOLDER      :提供获取锁存器时发生错误的oracle内核代码的位置信息

 

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz