`
ijavagos
  • 浏览: 1190670 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Oracle latch free 等待事件 说明

 
阅读更多

. Latch 说明

有关Latch,在我之前的Blog里也有一些说明:

死锁 阻塞 Latch 等待 详解

http://blog.csdn.net/tianlesoftware/archive/2010/08/20/5822674.aspx

Latch是一种轻量级的锁,是一种低级排队(串行)机制。一般来说,latch由三种内存元素组成:pid(进程id),内存地址和内存长度。

Latch用于保护SGA中共享内存结构。Latch就像是一种快速被获取和释放的内存锁,用于防止共享内存结构被多个用户同时访问。其实不必把Latch想得过于复杂,Latch通常就是操作系统利用内存中的某个区域,通过设置变量为0或非0,来表示Latch是否已经被取得,大多数操作系统,是使用TEST AND SET的方式来完成Latch检查或持有的。

最常见的Latch集中于Buffer Cache的竞争和Shared Pool的竞争:

1)和Buffer Cache相关的主要Latch竞争有cache buffers chainscache buffers lru chain. Buffer CacheLatch竞争经常是由于热点块竞争引起;

2)和Shared Pool相关的主要Latch竞争有Shared Pool LatchLibrary Cache Latch等。 Shared PoolLatch竞争通常是由于SQL的硬解析引起。

oracle9i(包括9i)之前,latch free等待事件包括了所有的latch等待,但从oracle10g起,latch被分成不同的种类,并且某些latch表现为独立的等待事件。

. Latch Free

2.1 Latch的获取

如果请求latch时,该latch不可用,进程就会在cpu中等待一小段时间(spin)然后重新请求latch。如果latch一直不可用,该过程(spin一段时间然后重新请求)会一直重复。重复的次数由隐含参数_spin_count决定,默认值2000。如果在请求_spin_count次之内获得了latch,就对spin_getsmisses列各加一,否则,进程在v$session_wait中记录latch free等待事件,然后释放cpu,转入睡眠状态。睡眠一定时间后,进程被唤醒并重复上面的过程,一直到获得latch在成功获得latch后,才会更行sleep列得统计信息。

当一个进程请求latch失败一定次数后,它会请求pmon进程查看该latch的持有者,如果持有进程异常,pmon就会清理该进程,释放latch

2.2 Latch 争用

进程在spin的过程中,会一直持有CPUspin的机制是假设Latch可以被快速释放(正常情况下,Latch的持有时间是微秒级,相对spin机制如果直接采用Sleep方式引起的上下文切换会相当昂贵,所以Oracle针对Latch引入了spin算法),如果其他CPU上的其他进程释放了LatchSPIN进程就可以立即获得这个Latch。如果系统只有单CPU,那就谈不上SPIN了。另一方面也可以看到,Latch竞争是非常昂贵的,可能导致严重的CPU耗用,所以Latch竞争在任何时候都应该引起充分的重视。经过spin后成功获得Latch的次数被记录在v$latch.spin_gets字段

如果我们在v$session_wait中发现有latch free等待事件,就意味着,进程在请求一个willing_to_wait模式的latch,在重试了_spin_count (默认为2000) 后还是没有获得latch,然后转入睡眠状态了。如果latch争用严重,将会由于不断的spin导致cpu资源紧张,从而增加系统响应时间。

V$system_event视图的total_waits列记录了进程获取willing-to-wait模式latch失败的次数V$latchsleeps列记录了进程由于等待某个latch而进入睡眠状态的次数。由于一个进程在_spin_count次尝试请求latch失败后会转入睡眠状态,total_waits列应该等于sleeps列的值的和。 但是,某些时候,total_waits会比sleeps的和要大,这是因为,只有在进程获得latch后才会更新total_waits的值,而不是每次请求latch失败就更新。

The latch free Oracle metric occurs when the process is waiting for a latch held by another process (this wait event does not apply to processes that are spinning while waiting for a latch; when a process is spinning, it is not waiting).

如下blog上对Latch 有一些测试说明:

Latch Free

http://www.dbtan.com/2010/05/latch-free.html

-------------------------------------------------------------------------------------------------------

Blog http://blog.csdn.net/tianlesoftware

Email: dvd.dba@gmail.com

DBA1 群:62697716(); DBA2 群:62697977() DBA3 群:62697850()

DBA 超级群:63306533(); DBA4 群: 83829929 DBA5群: 142216823

DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics