1.相关概念

latch free等待事件

latch free等待事件

latch是一种保护内存结构的轻量级锁。进程在等待当前繁忙latch时(此latch被其他进程持有),会产生此等待事件。在10g之前latch free包含了所有latch等待类型。在10g及以后,相关latch等待事件更容易分辨,比如latch: shared pool。然而还是有一些latch等待还以latch free等待事件表达。

如11.2.0.3环境

latch free等待事件

 

2.相关视图

      v$latchname

v$latchname中的信息就是从v$latch中获取的,v$latch和v$latchname的记录一一对应。

      v$latch

该视图描述了已latch name分组的更包括父子latch的信息,parent latch和child latch信息分别在 V$LATCH_PARENT 和V$LATCH_CHILDREN中。

我们通过查询一条记录来描述这个视图的字段含义

latch free等待事件

latch编号为187,name为redo allocation,也就是说这是一个关于redo分配的latch,latch address:0700000000021070,latch hash:999804931,latch等级为5(latch等级在后面做介绍),willing-to-wait 模式的latch请求次数GETS,willing-to-wait 模式且请求者需要等待的次数为misses,也就是说misses肯定小于等于gets。willing-to-wait的latch在等待latch时,请求者处于sleeping状态的请求次数。那么GETS>=MISSES>=SLEEPS。申请latch时直接获取到latch资源没有等待的次数IMMEDIATE_GETS。申请latch时直接失败IMMEDIATE_MISSES。Willing-to-wait首次申请latch失败,在spin时成功的次数为SPIN_GETS。WAIT_TIME等待latch的时间,单位微秒。WAITERS_WOKEN,WAITS_HOLDING_LATCH已在旧版本中不可用。

可以看出latch的总申请次数应该是:GETS+IMMEDIATE_GETS+IMMEDIATE_MISSES。

那么平均latch平均响应时间应是:

WAIT_TIME /( GETS+IMMEDIATE_GETS+IMMEDIATE_MISSES)。

比较奇怪的是SLEEP[1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11]这些字段,刚开始看上去令人费解,其实就是直方图。

官方文档中描述为:这些列只在oracle的较早版本有效,现在这些列已经不收集数据了,全部显示为0。可以通过V$EVENT_HISTOGRAM 视图中搜索关键字latch free或latch:%查看。

latch free等待事件

latch free等待事件

      v$latch视图看上去字段很多,但是可用的并不多。

      dba_hist_latch_name

先看看这个视图描述

latch free等待事件

latch free等待事件

dba_hist_latch_name没有snap_id,说明该视图其实不是一个真正的hist视图,官方文档中描述有点不太合适

latch free等待事件

其实把v$latchname和dba_hist_latch_name看成是静态视图即可,与v$statname类似。不同版本的数据库latch会有所不同,比如11.2.0.3和11.2.0.4中的latch数量就不同,11.2.0.3中为553个,11.2.0.4中未582个。

       dba_hist_latch

dba_hist_latch与快照就相关了,该视图收集的是v$latch的信息,字段与v$latch类似。值得注意的是,dba_hist_latch记录了快照内的latch申请信息等,但是不是每次申请latch都会造成latch free等待。

 

参考文档:

WAITEVENT: "latch free" Reference Note (文档ID 34576.1)

Resolving Issues Where "Latch Free" Wait Contention Causes Performance Degradation (文档ID 1476736.1)

相关文章: