专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 缓冲区溢出:Oracle缓冲区忙等待的识别和解决 »正文

缓冲区溢出:Oracle缓冲区忙等待的识别和解决

来源: 发布时间:星期日, 2009年3月29日 浏览:0次 评论:0
="t18"> =tpc_content>众多Oracle有关问题中其中最重要个是缓冲区忙等待(buffer busy wait)事件缓冲区忙等待是I/O-bound Oracle系统中最常见现象尤其是在Oracle STATSPACK报告前 5个忙等待读(顺序/分散)系统中如前5个定时事件:                          
% 总和事件           等待      时间(s)    消逝时间
-----------------------     ------------ ----------- -----------
db文件顺序读           2,598    7,146      48.54
db文件分散读           25,519    3,246      22.04
库缓冲区载入死锁         673     1,363     9.26
CPU时间            2,154     934      7.83
日志文件平行写          19,157     837      5.68


  
减轻缓冲区忙等待主要方式是减少系统中I/O这可以通过SQL使用更少块读(block reads比如添加索引)方式得以实现即使对于个比较大db_cache_size我们也可以减少缓冲区忙等待时间

为了能够查看整个系统等待事件我们可以查阅v$system_event性能视图性能视图提供了等待事件名称等待事件和时间总和以及每事件平均等待时间

可以通过v$waitstat视图来查询导致等待缓冲区类型视图列出了每缓冲区类型等待COUNT是类所有等待总和TIME是这类所有等待时间总和如下所示:


  
  select * from v$waitstat;
  
  类          COUNT    TIME
  ------------------   ---------- ----------
  data block      1961113   1870278
  segment header    34535   159082
  undo header      233632   86239
  undo block        1886    1706


  
个session访问缓冲区块时就有可能产生缓冲忙等待缓冲区忙等待产生可能由以下原因造成:

块可能被其它session读到缓冲区所以session必须等待块读入结束

session可能有和等待session查询不协调缓冲块

由于缓冲区忙等待是由区别特定块的间竞争而造成所以只能通过识别哪些块发生冲突和冲突产生原因你才有可能做出判定相应调整包括识别和消除块竞争原因

v$session_wait性能视图提供了识别等待产生原因思路方法

v$session_wait视图列代表缓冲区忙等待事件如下:

P1—和等待相关数据文件全部文件数量

P2—P1中数据文件块数量

P3—描述等待产生原因代码

这里是个这些值Oracle数据词典查询:


  
select
p1 "File #".
p2 "Block #",
p3 "Reason Code"
from
v$session_wait
where
event = 'buffer busy waits';


  
假如以上查询结果显示个块在忙等待以下查询将显示这名称和类型:


select
owner,
segment_name,
segment_type
from
dba_extents
where
file_id = &P1
and
&P2 between block_id and block_id + blocks -1;


  
旦这块被识别v$segment_statistics性能视图促使块水平统计实时监控过程使得DBA识别和独立列表和索引有关问题

我们也可以查询dba_data_files以确定卷入等待文件file_name思路方法是使用v$session_wait中P1

从v$session_wait中查询P3(原因编码)值可以知道session等待原因原因编码范围从0到300并可以解码

个SCUR或XCUR缓冲区产生且没有结束改变

0 块被读入缓冲区

100 我们想要NEW(创建)个块但这块当前被另session读入

110 我们想将当前块设为共享但这块被另session读入所以我们必须等待read结束

120 我们想获得当前但其他人已经将这块读入缓冲区所以我们只能等待他人读入结束

130 块被另session读入而且没有找到其它协调所以我们必须等待读结束缓冲区死锁后这种情况也有可能产生所以必须读入块CR

200 我们想新创建个block但其他人在使用所以我们只好等待他人使用结束

210 Session想读入SCUR或XCUR中假如块交换或者session处于非连续TX模式所以等待可能需要很长时间

220 在缓冲区查询个块当前版本但有人以不合法模式使用这所以我们只能等待

230 以CR/CRX方式获得个块但块中更改开始并且没有结束

231 CR/CRX扫描找到当前块但块中更改开始并且没有结束


原因编码

正如我在开始时所说那样缓冲区忙等待是I/O bound系统中最常见现象数据块等待导致I/O竞争通常是由当扫描相同索引时多个session重复读入相同在这样情况下session 1快速扫描缓冲区然后块从磁盘被读入当session 1等待磁盘读完成过程中其它块扫描相同索引并很快捕捉session 1并想从磁盘上读入相同由此产生了缓冲区忙等待

以下规则有助于解决提及当处于竞争时情况:

数据块竞争—通过改变PCTFREE或者PCTUSED值来识别和消除HOT块以减少数据块数量

Freelist块竞争—增加FREELISTS值当使用Parellel服务器时定确保每事例有自己FREELIST GROUPs

Segment header竞争—增加FREELISTS值并使用FREELIST GROUPs

Undo header块—增加回滚段(rollback segments)数量

好处

缓冲区忙等待识别和解决是比较复杂和棘手Oracle提供了v$segment_statistics视图有助于监视缓冲区忙等待当能够正确地识别和修正缓冲区忙等待原因时你所努力付出定会得到回报


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: