您好,登錄后才能下訂單哦!
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個塊,也就是說一般馬上就能拿到重用塊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。