Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1213183
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2008-01-06 21:54:31

Buffer Busy Waits的原因

       有很多原因导致一个会话等待buffer busy,并且随着时间的推移,该事件包含了全部的原因。

       如果一个会话希望检查一个数据块,第一步是检查它是否在内存中。最常见的事件发生顺序如下:

1.         计算哈希桶/id

2.         争夺相关的缓存缓冲链latch

3.         查找哈希桶/链;

4.         如果找到了并且当前没有保持在不兼容模式,则pin缓冲头;

5.         删除latch

6.         使用缓冲;

7.         争夺latch

8.         Unpin缓冲头;

9.         删除latch

为了pin一个缓冲,会话在缓冲头上创建一个缓冲处理器并将其链接到保持者队列(通

x$bh.us_nxtx$bh.us_prv可见)。

 

等待其他会话读取块(p3 = 130

       在这种情况下,查找哈希桶指示缓冲不在内存中,因此会话得到一个空缓冲,将其附属到哈希链,设置缓冲头指向该缓冲,以排斥模式pin缓冲头,然后删除latch。此时会话可以从磁盘读取数据块。

       此时如果第二个会话想要使用相同的块,它将会计算恰当的哈希链,争夺latch,查找正确的缓冲头。但是缓冲头将在排斥模式被pin,因此第二个会话将创建一个pin结构,并且附属到在等待者队列上的缓冲头上(通过x$bh.wa_nxtx$bh.wa_prv可见),然后删除latch,在buffer busy waits上等待。

       当一个会话在buffer busy waits上等待时,知道其意义是非常重要的会话在一个缓冲头等待队列上有一个pin结构。

       'wait for other session to finish a read'buffer busy等待的一个很常见的原因,在10g中以一个独立的事件出现(read by other session),但是这个事件没有在v$segstat中体现出来。

       为了看见该事件,可以在多个会话上执行磁盘扫描很大的查询:

       select source from sys.source$ where source = 'xxxx';

      

       为了解决p3 = 130的情况,关键的策略是识别出并发,I/O的对象(通过V$SEGSTAT)并尽量减少读的需求或增加缓冲的数量。在热点磁盘上通常也会出现这种事件,即使没有过量的访问。

阅读(4142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~