buffer cache —— free buffer waits

来源:互联网 发布:php环境安装包 编辑:程序博客网 时间:2024/05/17 03:45
服务器进程将块载入到内存的过程如下:
(1)在用户所请求的DBA上应用HASG函数,获得适当的Hash bucket。
(2)检索伴随Hash bucket的Hash Chain,确认块所对应的缓冲区头是否存在。若缓冲区头已经存在,相应块已经位于高速缓冲区的状态,则使用该快。
(3)若高速缓冲区上不存在,首先在LRU列按最少使用的顺序寻找空闲缓冲区。在次过程中发现脏缓冲区,则将脏缓冲区移动到LRUW列。找到空间缓冲区后,可以从数据文件将块读取到该缓冲区上。

(4)在LRU列上寻找空闲缓冲区时,扫描与_DB_BLOCK_SCAN_MAX_PCT(缺省值是40)参数相同的LRU列部分后,若还没有找到空闲缓存区,则服务器进程将停止LRU列的扫描,并且向DBWR请求将脏缓冲区写入到磁盘,以得到空闲缓冲区。写入完成以后使用该块。

在第4个步骤,若检索LRU列的一定区域后,也没有找到空闲缓冲区,就会向DBWR发出写入请求。知道写入工作结束为止,一直到等待free buffer waits事件。请留意与write complete waits等待的准确差异。

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name like 'free buffer waits';NAME                           PARAMETER1           PARAMETER2           PARAMETER3------------------------------ -------------------- -------------------- --------------------free buffer waits              file#                block#               set-id#
发生free buffer waits等待的理由如下:
低效的sql。
过小的高速缓冲区。
DBWR的性能下降。
低效的sql语句会请求许多空闲缓冲区,因此相应free buffer waits等待也会正比增加。告诉缓冲区过小时,较少的空闲缓冲区请求,也会引发free buffer waits等待。若sql语句或高速缓冲区大小都没有问题,free buffer waits等待的最终原因就是DBWR的性能问题。通过改善DBWR的性能,即便在最恶劣的情况下也能保障一定程度的性能,这就是最佳的解决办法。

关于改善DBWR性能的一般方法如下:
使用裸设备和AIO。或只用direct I/O,还使用多个DBWR。
避免过多不必要的DBWR的活动量。即维持合理的检查点次数。
恰当使用多重缓冲池(default、keep、recycle),可以间接的减少DBWR的负荷。