latch free等待事件
latch free
latch是一種輕量級的鎖。一般來說,latch由三種記憶體元素組成:pid(程式id),記憶體地址和記憶體長度。Latch保證對共享資料結構的排它性訪問,以此來保證記憶體結構的完整性不受到損壞。在多個會話同時修改或者檢視(inspect)sga中同一個記憶體結構時,必須序列化訪問以保證sga中資料結構的完整性。
Latch只是用來保護sga中的記憶體結構。對資料庫中的物件的保護,使用的lock而不是latch。Oracle sga中有許多latch,用來保護sga中各種記憶體結構不會因為併發訪問而損壞。常見的Latch Free等待事件是由於熱塊 (buffer cache中的latch爭用) 及未使用繫結變數(shared pool中的latch爭用) 導致的。
最常見的Latch集中於Buffer Cache的競爭和Shared Pool的競爭。和Buffer Cache相關的主要Latch競爭有cache buffers chains和cache buffers lru chain,和Shared Pool相關的主要Latch競爭有Shared Pool Latch和Library Cache Latch等。 Buffer Cache的Latch競爭經常是由於熱點塊競爭引起;Shared Pool的Latch競爭通常是由於SQL的硬解析引起。
在oracle9i(包括9i)之前,latch free等待事件包括了所有的latch等待,但從oracle10g起,latch被分成不同的種類,並且某些latch表現為獨立的等待事件。
如果我們在v$session_wait中發現有latch free等待事件,就意味著,程式在請求一個willing_to_wait模式的latch,在重試了_spin_count次 (預設為2000) 後還是沒有獲得latch,然後轉入睡眠狀態了。如果latch爭用嚴重,將會由於不斷的spin導致cpu資源緊張,從而增加系統響應時間。
V$system_event檢視的total_waits列記錄了程式獲取willing-to-wait模式latch失敗的次數。V$latch的sleeps列記錄了程式由於等待某個latch而進入睡眠狀態的次數。由於一個程式在_spin_count次嘗試請求latch失敗後會轉入睡眠狀態,total_waits列應該等於sleeps列的值的和,如以下sql所示。但是,某些時候,total_waits會比sleeps的和要大,這是因為,只有在程式獲得latch後才會更新total_waits的值,而不是每次請求latch失敗就更新。
Latch的獲取
如果請求latch時,該latch不可用,程式就會在cpu中等待一小段時間(spin)然後重新請求latch。如果latch一直不可用,該過程(spin一段時間然後重新請求)會一直重複。重複的次數由隱含引數_spin_count決定,預設值2000。如果在請求_spin_count次之內獲得了latch,就對spin_gets和misses列各加一,否則,程式在v$session_wait中記錄latch free等待事件,然後釋放cpu,轉入睡眠狀態。睡眠一定時間後,程式被喚醒並重覆上面的過程,一直到獲得latch。在成功獲得latch後,才會更行sleep列得統計資訊。
由於程式只有在獲得latch後才會停止對latch得請求,如果某個持有latch的程式發生異常,其他請求該latch的程式該怎麼辦?豈不是要一直等待下去?不會的。當一個程式請求latch失敗一定次數後,它會請求pmon程式檢視該latch的持有者,如果持有程式異常,pmon就會清理該程式,釋放latch。
Latch 爭用
程式在spin的過程中,會一直持有CPU,spin的機制是假設Latch可以被快速釋放(正常情況下,Latch的持有時間是微秒級,相對spin機制如果直接採用Sleep方式引起的上下文切換會相當昂貴,所以Oracle針對Latch引入了spin演算法),如果其他CPU上的其他程式釋放了Latch,SPIN程式就可以立即獲得這個Latch。如果系統只有單CPU,那就談不上SPIN了。另一方面也可以看到,Latch競爭是非常昂貴的,可能導致嚴重的CPU耗用,所以Latch競爭在任何時候都應該引起充分的重視。經過spin後成功獲得Latch的次數被記錄在v$latch.spin_gets欄位。透過下圖來說明一下Latch競爭的情況。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-697396/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Latch free等待事件(轉)事件
- Latch free等待事件三事件
- Latch free等待事件四事件
- Latch free等待事件二事件
- Latch free等待事件一事件
- Latch free等待事件三(轉)事件
- Latch free等待事件四(轉)事件
- Latch free等待事件二(轉)事件
- latch free 等待事件說明事件
- 【分享】latch free等待事件(一)事件
- latch free 等待事件說明(轉)事件
- latch free 等待事件的診斷語句事件
- latch等待事件彙總事件
- latch 相關等待事件事件
- latch free事件的整理事件
- Cache Buffer Chain Latch等待事件AI事件
- latch free事件的整理(轉)事件
- latch:library cache lock等待事件事件
- cache buffer lru chain latch等待事件AI事件
- [20170324]cpu 100%,latch free等待分析
- ORACLE等待事件latch: cache buffers chainsOracle事件AI
- 【效能調整】等待事件(九) latch原理事件
- 等待事件_cache_buffers_chains_latch事件AI
- 等待事件_cache_buffers_lru_chain_latch事件AI
- [20211229]再論19c latch free等待事件分析.txt事件
- [異常等待事件latch undo global data]分析事件
- 轉_診斷latch:shared pool等待事件事件
- buffer cache與相關的latch等待事件事件
- 【效能調整】等待事件(十) 10g中的latch等待事件
- oracle library cache相關的等待事件及latchOracle事件
- 模擬產生CBC LATCH與buffer busy wait等待事件AI事件
- 處理 latch_cache_buffers_chains等待事件一例AI事件
- 12c設定RESULT_CACHE_MODE=MANUAL發生'Result Cache:RC Latch'型別的Latch Free等待型別
- latch free(cache buffers chain)AI
- latch 相關效能問題診斷: latch: row cache objects等待事件導致CPU負載高Object事件負載
- Identify Which Latch is Associated with a "latch free" wait-413942.1IDEAI
- 【等待事件】ORACLE常見等待事件事件Oracle
- 【等待事件】等待事件系列(5.1)--Enqueue(佇列等待)事件ENQ佇列