缓冲区溢出: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
相关文章读者评论发表评论 |
|