latch free事件的整理(轉)

ewelamb發表於2012-11-20

Latchesare like short duration locks that protect critical bits of code.  LatchFree事件表示該程式在等待一個被其它程式持有的latch。這個事件共有3個引數,意義如下:

  • p1  表示latch的地址,一般會用p1raw,也就是p1引數的16進位制。我們可以查詢v$latch_children和v$latch,透過addr=p1raw來查詢
  • P2 表示latch號,我們可以透過v$latchname來進行查詢該latch的名字
  • p3表示 我們已經試圖獲得該latch的次數
確定latch競爭:
  • 一般我們可以透過select * from v$latch where sleep>0 order by sleep desc; 來確定競爭最激烈的latch
  • 對於shared_pool latchlibrary cache latch一般可以透過繫結變數來進行最佳化
  • 對於cache buffer LRU chain,表示buffer cache的使用比較嚴重;我們要確保db_block_lru_statistics=false
  • 對於cache buffer chains latch表示存在單個塊的buffer cache競爭。一個cache buffer chains latch管理著一些buffer cache的列表。如果在v$latch_children中存在該latch,則我們可以查詢:select * from x$bh where hladd=&child_latch_address;如果查詢的記錄數在3-10之間,表示說明該latch管理的buffer中有一個塊存在嚴重的競爭;在透過x$bh表中的Tch列(接觸的次數),就可以確定是那個buffer存在競爭了。因為,存在競爭的buffer塊,其Tch值肯定是很大的
  • 我們也可以查詢v$latch_misses來檢視latch沒有申請到的情況select * from v$latch_misses where parent_name=&Latch_addr; 這個檢視中的WTR_SLP_COUNT表示等待latch而sleep的時間;SLEEP_COUNT表示等待而sleep的次數

導致latch競爭的幾個原因:

  • CPU的高利用率   一個程式在得到latch後,由於系統的CPU資源很忙,它得不到CPU來進行處理,從而導致其它程式等待latch,我們可以透過os的資訊來檢視CPU的高利用率
  • 希望所有的程式間歇的持有latch,但是如果一個程式持有latch過長,從而導致這個和諧被打破,導致受這個latch保護的在SGA中的link list過長。例如,在一個充滿碎片的shared pool中,標記free memory chunck的list就將很長,導致了latch的競爭。類似的還有hash chain在databuffer、library cache中等。  對於這種型別的latch競爭,我們可以調整_spin_count引數,來讓得不到latch的引數直接進入sleep狀態。當然,最好的辦法還是提高應用效率,減少等待latch的時間
  • 如果程式申請latch的次數過多,也會產生latch的競爭。   比如在一個高commit的應用中,我們可能就會存在redo allocation latch的競爭了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7191998/viewspace-749612/,如需轉載,請註明出處,否則將追究法律責任。

相關文章