Latch free
目录
表示进程用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事件。
latch free等待事件的参数定义如下。
P1:进程等待的锁存器所在的内存地址。
P2:锁存器号(与V$LATCHNAME.LATCH# 统一) 为了查询对应的锁存器号可以执行以下SQL语句。
SELECT * FROM v$latchname WHERE latch# = &p2_value; |
P3:尝试次数。即,进程为了获取锁存器而尝试的次数。
事件的等待时间是指数级(exponential)增加。
latch free事件的发生原因和解决方法是以锁存器种类而区分。参照各种latch free的事件说明。
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!