Oracle Shared Pool機制之——Latches, Locks, Pins and Mutexes
1. Lathes
如上場景中,Latches將派上用場。Latches是保護系統全域性區共享資料結構的簡單、低階的序列機制。Latches消除了多程式同時修改共享記憶體時面臨的衝突問題。當伺服器或後臺程式操作或訪問這些共享資料結構時,將會在很短時間內獲取Latches。
當Latch被長久持有或Latch需求太高時,就會產生Latch衝突。影響Latch
1) 覆蓋整個庫緩衝的Latches數。如果Latches數較多,那麼,每個Latch保護的雜湊桶數就會更少,當你需要搜尋某個雜湊桶連結串列時與其他使用相同Latch的使用者發生衝突的機率就會少;另一方面,如果系統中有更多的Latches,那麼,系統將會有更多的維護、報告或清理任務要做。
直到Oracle 10g版本,覆蓋庫緩衝的Latches數都非常少。該數目依賴於系統上的CPUs數,應該是與cpu_count引數值相當在,直至最大達到67個Latches。這個數目出奇的小,以至於,即使在系統上執行少量而頻繁執行的不透過語句,即使存取不同的雜湊桶,但可能因為獲取相同Latch而發生Latches衝突。
一旦發現某個物件,我們可以給該物件附加一個KGL Locks(kgllock),從而使得對庫緩衝的搜尋次數最小化,這樣,我們就擁有一個到該物件的捷徑(當開啟/關閉遊標時儲存於PGA中)。當下次同樣的語句釋出時,我們就可以在PGA中找到該物件而不必再搜尋相應的雜湊桶連結串列(軟軟解析)。
我們應該避免長時間持有Latches。這就意味著當我們對已發現的某個記憶體區域做一些耗時處理時,可以將該物件Pin住,以保護我們正使用的記憶體區域,從而我們能釋放相關Latch。
a) 獲取覆蓋相應雜湊桶的Latch;
c) 將該物件Pin住並釋放相應Latch;
e) 獲相應Latch,Unpin該物件並釋放相應Latch;
可以透過三種主要方式可以獲取KGL Locks:
2) 使用者可以設定session_cached_cursors引數,以使得Oracle看到使用者使用一條語句多於兩次時,庫緩衝將自動持有相關遊標;
除了最小化我們搜尋物件時對庫緩衝的檢索次數外,該Locks還提供如下好處:
2)也被稱為解析(Parse)Locks的庫緩衝Locks用於維護物件及其依賴物件的依賴機制。
5. 為什麼需要庫緩衝Pins(KGL Pins)?
Pin住物件會導致其相關堆被載入進記憶體。如果一個使用者想修改或檢查該物件,則必須獲取Lock後再獲取Pin。
庫緩衝物件上Locks及Pins的相關資訊可透過三個X$表進行查詢,即x$kgllk, x$kglpn和x$kglob.
2)x$kglob包含Locks資源項;
庫緩衝鎖及釘住(Locking和Pinning)機制也許會導致兩個問題。
KGL Locks及Pins相關的另一個問題是,當使用它們時,必須頻繁的建立記憶體區域,標明屬性,將它們插入連結串列(或移出連結串列並將其放回共享池),期間,這些操作需要一直持有獨佔模式的Latch,對繁忙的系統來說,整個庫緩衝Locks及Pins將帶來很大威脅。
為了改善遊標的執行和硬解析,Oracle 10gR2版本引入了一個新的、更好粒度的記憶體序列機制。對某些共享遊標相關的操作,Mutexes(Mutual exclusion objects,互斥物件)可用來替代庫緩衝Latches和庫緩衝Pins。Mutex工作方式與Latch基本相同,但操作Mutexes的程式碼路徑更短,更輕量級,通常也會被硬體直接支援。因此,與Latch機制相比,Mutexes會更快,耗費更少的CPU,併發性方面也會有很大提升。32位Linux系統上,常規Latch結構佔用110位元組,而Mutex僅佔28位元組。而Mutex消耗的指令也更少。獲取一個Latch需要消耗150~200個指令,而獲取一個Mutex則只需大約30-35個指令。
Mutexes可以共享或獨佔模式獲取,也可以等待或非等待模式完成。
2)替換Latches和Pins:Mutexes具有雙重性。其可以作為一種序列機制(像一個Latch),同時也可以作為一個Pin(例如:阻止物件從記憶體中被移除)。 一個Latch不能被多個會話同時獲取,而一個Mutex可以被多個會話同時參考,多個會話可以共享模式參考該Mutex。以共享模式參考一個Mutex的總會話數被稱為參考數(Ref Count)。一個Mutex的參考數被儲存於其自身。一個Mutex也可以獨佔模式被一個會話持有。
除了每個子游標控制程式碼中有Mutex結構且其作為遊標Pin結構而帶來的主要好處。如果你正有一個遊標被開啟(或在會話遊標緩衝內),你不必獲取庫緩衝Latch(而之前為了改變遊標Pin狀態而必須這麼做),就可以直接修改遊標Mutex的參考數(透過會話UGA內開啟遊標狀態區域的指標)。
1) 庫緩衝Latch機制在解析等操作中依然被需要,Mutexes僅僅解決了庫緩衝的Pin問題。
3)由於Mutexes是一種通用機制(而非庫緩衝專用),其也被用於V$SQLSTATS底層結構。
5)Latches和Mutexes為獨立的機制,即一個程式可以同時持有Latch和Mutex。Oracle10.2.0.2以上的版本中,只要“_kks_use_mutex_pin”引數被開啟,庫緩衝Pin Latch將被Mutex替代,同時,其他一些類似V$SQLSTATS陣列及父遊標檢查的操作也被Mutexes保護。然而,使用kksfbc()的真正子游標查詢依然被庫緩衝Latches保護,但是,頻繁軟解析加上很少的遊標緩衝及較長的庫緩衝雜湊鏈將導致這些Latches成為一個問題(記住,即使在普通的雜湊鏈掃描中,庫緩衝Latch始終被以獨佔方式獲取)。
Oracle 11g版本中,有另外一些Mutexes,其中最重要的一個是庫緩衝Mutex。同時,除了“library cache load lock”外,所有庫緩衝相關的Latches都消失了,取而代之,相應操作都被Mutexes保護。“libarary cache”Latches已被“library cache”Mutexes替代。
librarycache pin allocation
librarycache hash chains
librarycache
而Oracle 11g版本中僅剩的Latches為:
下列出現於Oracle 10g版本的與庫緩衝相關的等待事件在Oracle 11g版本中也不復存在:
latch:library cache lock
Oracle 11g版本中與庫緩衝相關的等待事件為:
librarycache lock
librarycache: mutex X
OSD IPClibrary
librarycache shutdown
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2151095/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Shared Pool Memory ManagementOracle
- Oracle基礎包之DBMS_SHARED_POOL(十)Oracle
- 共享池 shared pool
- 【TUNE_ORACLE】等待事件之“library cache pins”Oracle事件
- Oracle記憶體結構(二)----Shared Pool的詳細資訊(轉)Oracle記憶體
- [20190102]DBMS_SHARED_POOL.MARKHOT與表.txt
- [20210708]使用那個shared pool latch.txt
- 透過案例學調優之--和 SHARED POOL 相關的主要 Latch
- [20191219]shared_pool_size設定躍變.txt
- [20210803]使用那個shared pool latch(補充).txt
- [20220419]19c _enable_shared_pool_durations.txt
- oracle stream pool sizeOracle
- [20200213]使用DBMS_SHARED_POOL.MARKHOT的總結.txt
- [20200126]使用DBMS_SHARED_POOL.MARKHOT與sql語句.txtSQL
- [20200212]使用DBMS_SHARED_POOL.MARKHOT標識熱物件.txt物件
- 使用DBMS_SHARED_POOL包將物件固定到共享池物件
- [20190319]shared pool latch與library cache latch的簡單探究.txt
- [20220406]使用那個shared pool latch的疑問1.txt
- [20210512]shared pool latch與library cache latch的簡單探究.txt
- Android模組化之MicroModule(微信Pins工程)Android
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與sql語句3.txtSQL
- [20200213]使用DBMS_SHARED_POOL.MARKHOT標識熱物件2.txt物件
- [20200211]使用DBMS_SHARED_POOL.MARKHOT與sql語句2.txtSQL
- [20201117]使用DBMS_SHARED_POOL.MARKHOT與sql語句5.txtSQL
- [20201117]使用DBMS_SHARED_POOL.MARKHOT與sql語句6.txtSQL
- [20220412]shared pool latch與使用sga heap的疑問2.txt
- [20220413]shared pool latch與使用sga heap的疑問3.txt
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與檢視v$open_cursor.txt
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與sql的計算2.txtSQL
- [20200211]使用DBMS_SHARED_POOL.MARKHOT與sql_id的計算.txtSQL
- SHARED POOL中KGH: NOACCESS佔用大量記憶體的問題分析記憶體
- PostgreSQL DBA(158) - Locks(tuple locks)SQL
- PostgreSQL DBA(85) - Locks(lightweight locks)SQL
- [20210520]11g shared pool latch與library cache mutex的簡單探究.txtMutex
- Oracle SCN機制詳細解讀Oracle
- [20200217]使用snapper探究DBMS_SHARED_POOL.MARKHOT標識熱物件的等待事件.txtAPP物件事件
- Binder機制之AIDLAI
- pwn 之 沙箱機制
- Android Handler機制之Message及Message回收機制Android