文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

oracle等待事件之free buffer waits

2024-04-02 19:55

关注

1.什么时候会发生free buffer waits呢?
    简单来说,当需要在buffer cache中寻找可用块但是找不到时,就会发生这个等待。找寻可用块的理由包括读取数据块到内存中,或者构造CR块。
SQL> select name,parameter1,parameter2,parameter3,wait_class from v$event_name where name ='free buffer waits';

NAME                 PARAMETER1           PARAMETER2           PARAMETER3           WAIT_CLASS
-------------------- -------------------- -------------------- -------------------- --------------------
free buffer waits    file#                block#               set-id#              Configuration

2.Oracle读取数据块的过程
1)比如Oracle要读取1号对象,2号文件,3号块,首先根据对象号,文件号,块号计算hash值,然后去搜索哈希表,确定是否目标数据块已经存在在内存中。这里的hash表是CBC链的header的集合。
2)根据计算出的hash值得到bucket的内存,然后去扫描这个bucket的CBC链,扫描的时候会在CBC latch的保护下,依次对比结果,如果匹配,那么取得BA地址,读取buffer。
3)如果不存在,那么需要在LRU链上寻找可重用的块,在扫描过程中,被pin住的块,TCH大于2的块和脏块不会被重用,pin住的块会被跳过,TCH大于2的块会被移动到LRU链表的热端,TCH小于2的脏块会被移动到LRUW链,当扫描到LRU链的40%时,40%是由隐含参数_db_block_max_scan_pct控制的,此时若还没有找到可覆盖的buffer,将会停止扫描,唤醒DBWR进程写脏块,同时前台进程转入睡眠状态,此时的等待事件就是free buffer waits。
4)如果找到可覆盖的buffer,那么在下一步之前会首先根据脏块的总数,决定是否主动唤醒DBWR进程写脏块,如果脏块数占到了检查点队列的25%,那么不等DBWR进程3秒醒来,而是主动唤醒。25%是由隐含参数_db_large_dirty_queue决定的。主动唤醒是不会有free buffer waits等待的。
5)DBWR进程被唤醒或者3秒醒来写脏块后,将可重用的脏块挂到辅助LRU链表上。
从上述过程可以看到,隐含参数_db_block_max_scan_pct隐含参数通过控制脏块数目,主动唤醒DBWR写脏块,有助于缓解free buffer waits事件。

产生free buffer waits的原因?
1)db_cache_size值太小
2)检查db_writer_processes参数,一般来说这个值不太会主动修改,默认每8个CPU会有一个dbwr进程
3)存储性能有问题,可能写脏数据慢,可能写redo慢
4)延迟块清除,这种行为可能会占用大量的buffer
5)sql效率差,物理读过大或者要构造的CR块过多,比如大表select *,笛卡尔积等

上述读取数据块的过程中提到过扫描LRU链的时候跳过的块的情况可以这么查:
SQL>  select * from v$sysstat where name in ('free buffer inspected','free buffer requested');
STATISTIC# NAME                                CLASS      VALUE    STAT_ID     CON_ID
---------- ------------------------------ ---------- ---------- ---------- ----------
       206 free buffer requested                   8 1134972512 3411924934          0
       210 free buffer inspected                   8  366218879  941676439          0

SQL> select 366218879/1134972512 from dual;

366218879/1134972512
--------------------
           .32266762
free buffer inspected:扫描LRU链寻找可重用的块时候跳过的块的个数
free buffer requested:请求重用块的次数
上述结果表明平均每次请求扫描0.32个块,也就是说一般马上就能拿到重用块。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯