讀書筆記-高階owi與oracle效能調整-latch和lock

selectshen發表於2014-09-05
鎖存器和鎖存在的理由就是保護在同時工作中所使用的Oracle資源.若想解決鎖存器和鎖上發生的效能問題,不僅需要掌握鎖存器和鎖的工作方式,而且對具體資源等級上使用的鎖存器和鎖,也需要有比較詳細的知識.
Oracle為了降低與鎖存器相關工作的負荷,不保障鎖存器獲得次序.
鎖存器所保護的資源就是SGA.訪問SGA的所有程式,在獲得相應管轄的鎖存器後,方可訪問.
特定記憶體區域使用多個子鎖存器.相反,部份記憶體區域為了同步化,只使用一個鎖存器.子鎖存器的使用不只取決於記憶體區域的大小,還主要取決於記憶體結構和演算法 應透過多少鎖存器進行管理.父鎖存器和獨立鎖存器,可以透過v$latch_parent檢視觀察;子鎖存器,則可以透過 v$latch_children檢視觀察.隨著oracle版本的不斷更新,獨產鎖存器變為父,子鎖存器的情況較多,子鎖存器的數量也不斷在更新.鎖自 身也存在於SGA共享池區域的記憶體結構體,透過鎖存器受到保護.
在擁有一個以上鎖存器的狀態下,還想獲得其它鎖存器的程式,就必須獲得比最後一次獲得的鎖存器更高等級的鎖存器.如果因某種原因,要獲得比當前擁有的鎖存器等級低或相同的鎖存器時,會以NO-wait模式獲取,以防止死鎖引起的無限等待.
鎖存器基本上使用Exclusive模式.因此,第一瞬間只能有一個程式擁有鎖存器.但是對特定鎖存器也可以使用共享模式.
willing-to-wait模式下的鎖存器獲得過程中失敗,則迴圈適當的次數,並試圖重新獲取鎖存器,它的迴圈次數與_spin_count(預設值 是2000)引數值相同.最初的鎖存器獲得失敗後不會馬上睡眠,而是自旋(spin),其理由是:第一,因為期待其它的程式在很短時間內釋放鎖存器;第 二,因為如果陷入睡眠狀態,在OS層面上會發生Context switching,這部份的資源消耗比起使用較少的CPU進行自旋更多.
獲得鎖存器後,欲修改共享記憶體的程式,在修改前將要修改的內容記錄到鎖存器恢復區(altch recovery area).如果持有鎖存器的程式結束,則PMON呼叫對各個鎖存器所對應的清除功能.各鎖存器的清除功能是利用鎖存器恢復區所記錄的資訊,將共享記憶體恢 復原狀,此項工作結束後PMON將釋放鎖存器.為獲得鎖存器而等待的程式在嘗試4次失敗後,向PMON發出檢查持有相應鎖存器的程式是否存在的請求.
v$latch欄位說明:
gets:willing-to-wait模式下睡眠之前的鎖存器請求次數.
misses:willing-to-wait模式下睡眠之前的鎖存器的獲得失敗次數.
spin_gets:willing-to-wait模式下睡眠之前的自旋階段的獲得成功次數.
sleeps:willing-to-wait模式下睡眠次數.
immediate_gets:no-wait模式下鎖存器獲得成功次數.
immediate_misses:no-wait模式下鎖存器獲得失敗次數.
wait_time:為獲得鎖存器而等待的時間(ms)
如果在willing-to-wait模式下的misses/gets值和no-wait模式下的immediate_misses/(immediate_gets+
immediate_misses)值在1%以上,也可以判斷髮生了鎖存器爭用.或者用wait_time,當等待時間大於CPU時間一定值時,也可以判斷為發生了鎖存器爭用.透過等待事件的等待時間也可以獲得同樣的資訊.
鎖的名稱和資源名稱是相同的.例如TM鎖保護TM(table)資源.
鎖的模式:
0:none
1:null(N)
2:sub-shared(ss)或row-shared(rs)
3:sub-exclusive(sx)或row-exclusive(rx)
4:shared(s)
5:shared-sub-exclusive(ssx)或shared-row-exclusive(srx)
6:exclusive(x)

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

相關文章