oracle等待事件之freebufferwaits

1.什么時候會發(fā)生free buffer waits呢?
    簡單來說,當(dāng)需要在buffer cache中尋找可用塊但是找不到時,就會發(fā)生這個等待。找尋可用塊的理由包括讀取數(shù)據(jù)塊到內(nèi)存中,或者構(gòu)造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讀取數(shù)據(jù)塊的過程
1)比如Oracle要讀取1號對象,2號文件,3號塊,首先根據(jù)對象號,文件號,塊號計算hash值,然后去搜索哈希表,確定是否目標(biāo)數(shù)據(jù)塊已經(jīng)存在在內(nèi)存中。這里的hash表是CBC鏈的header的集合。
2)根據(jù)計算出的hash值得到bucket的內(nèi)存,然后去掃描這個bucket的CBC鏈,掃描的時候會在CBC latch的保護下,依次對比結(jié)果,如果匹配,那么取得BA地址,讀取buffer。
3)如果不存在,那么需要在LRU鏈上尋找可重用的塊,在掃描過程中,被pin住的塊,TCH大于2的塊和臟塊不會被重用,pin住的塊會被跳過,TCH大于2的塊會被移動到LRU鏈表的熱端,TCH小于2的臟塊會被移動到LRUW鏈,當(dāng)掃描到LRU鏈的40%時,40%是由隱含參數(shù)_db_block_max_scan_pct控制的,此時若還沒有找到可覆蓋的buffer,將會停止掃描,喚醒DBWR進程寫臟塊,同時前臺進程轉(zhuǎn)入睡眠狀態(tài),此時的等待事件就是free buffer waits。
4)如果找到可覆蓋的buffer,那么在下一步之前會首先根據(jù)臟塊的總數(shù),決定是否主動喚醒DBWR進程寫臟塊,如果臟塊數(shù)占到了檢查點隊列的25%,那么不等DBWR進程3秒醒來,而是主動喚醒。25%是由隱含參數(shù)_db_large_dirty_queue決定的。主動喚醒是不會有free buffer waits等待的。
5)DBWR進程被喚醒或者3秒醒來寫臟塊后,將可重用的臟塊掛到輔助LRU鏈表上。
從上述過程可以看到,隱含參數(shù)_db_block_max_scan_pct隱含參數(shù)通過控制臟塊數(shù)目,主動喚醒DBWR寫臟塊,有助于緩解free buffer waits事件。

產(chǎn)生free buffer waits的原因?
1)db_cache_size值太小
2)檢查db_writer_processes參數(shù),一般來說這個值不太會主動修改,默認每8個CPU會有一個dbwr進程
3)存儲性能有問題,可能寫臟數(shù)據(jù)慢,可能寫redo慢
4)延遲塊清除,這種行為可能會占用大量的buffer
5)sql效率差,物理讀過大或者要構(gòu)造的CR塊過多,比如大表select *,笛卡爾積等

上述讀取數(shù)據(jù)塊的過程中提到過掃描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鏈尋找可重用的塊時候跳過的塊的個數(shù)
free buffer requested:請求重用塊的次數(shù)
上述結(jié)果表明平均每次請求掃描0.32個塊,也就是說一般馬上就能拿到重用塊。

泌陽網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站

本文題目:oracle等待事件之freebufferwaits
文章地址:http://muchs.cn/article36/pdjppg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)網(wǎng)站改版、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管