溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Oracle Latch 說明

發(fā)布時(shí)間:2021-11-05 10:47:01 來源:億速云 閱讀:109 作者:柒染 欄目:建站服務(wù)器

這篇文章給大家介紹如何進(jìn)行Oracle Latch 說明,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Oracle Latch 說明

. Latch說明

 

1.1    Latch

在之前的一篇文章里的第四部分對Latch有了說明,參考:

           鎖死鎖阻塞Latch等待詳解

           http://blog.csdn.net/tianlesoftware/archive/2010/08/20/5822674.aspx

 

           Latch屬于System Lock,用于保護(hù)SGA區(qū)中共享數(shù)據(jù)結(jié)構(gòu)的一種串行化鎖定機(jī)制。Latch的實(shí)現(xiàn)是與操作系統(tǒng)相關(guān)的,尤其和一個(gè)進(jìn)程是否需要等待一個(gè)latch、需要等待多長時(shí)間有關(guān)。

 

           LatchOracle提供的輕量級鎖資源,是一種能夠極快地被獲取和釋放的鎖,能快速,短時(shí)間的鎖定資源,防止多個(gè)并發(fā)進(jìn)程同時(shí)修改訪問某個(gè)共享資源,它只工作在SGA中,通常用于保護(hù)描述buffer cacheblock的數(shù)據(jù)結(jié)構(gòu)。

 

           比如SGA中,各種數(shù)據(jù)被反復(fù)從磁盤讀取到內(nèi)存,又被重新寫回到磁盤上,如果有并發(fā)的用戶做相同的事情,Oracle必須使用一種機(jī)制,來保證數(shù)據(jù)在讀取的時(shí)候,只能由一個(gè)會話來完成,這種保護(hù)機(jī)制就是Latch。

           并發(fā)(concurrency):是說有超過兩個(gè)以上的用戶對同樣的數(shù)據(jù)做修改(可能包括插入,刪除和修改)。

           并行(parallel):是說將一件事情分成很多小部分,讓每一部分同時(shí)執(zhí)行,最后將執(zhí)行結(jié)果匯總成最終結(jié)果。

 

           與每個(gè)latch相聯(lián)系的還有一個(gè)清除過程,當(dāng)持有latch的進(jìn)程成為死進(jìn)程時(shí),該清除過程就會被調(diào)用。Latch還具有相關(guān)級別,用于防止死鎖,一旦一個(gè)進(jìn)程在某個(gè)級別上得到一個(gè)latch,它就不可能再獲得等同或低于該級別的latch。

           

           Latch不會造成阻塞,只會導(dǎo)致等待。阻塞是一種系統(tǒng)設(shè)計(jì)上的問題,等待是一種系統(tǒng)資源爭用的問題。

 

1.2 有關(guān)SPin的說明:

           比如數(shù)據(jù)緩存中的某個(gè)塊要被讀取,我們會獲得這個(gè)塊的latch,這個(gè)過程叫做spin,另外一個(gè)進(jìn)程恰好要修改這個(gè)塊,他也要spin這個(gè)塊,此時(shí)他必須等待,當(dāng)前一個(gè)進(jìn)程釋放latch后才能spin住,然后修改,如果多個(gè)進(jìn)程同時(shí)請求的話,他們之間將出現(xiàn)競爭,沒有一個(gè)入隊(duì)機(jī)制,一旦前面進(jìn)程釋放所定,后面的進(jìn)程就蜂擁而上,沒有先來后到的概念,并且這一切都發(fā)生的非常快,因?yàn)?span lang="EN-US">Latch的特點(diǎn)是快而短暫。

 

SPIN與休眠:

           休眠意味著暫時(shí)的放棄CPU,進(jìn)行上下文切換(context switch),這樣CPU要保存當(dāng)前進(jìn)程運(yùn)行時(shí)的一些狀態(tài)信息,比如堆棧,信號量等數(shù)據(jù)結(jié)構(gòu),然后引入后續(xù)進(jìn)程的狀態(tài)信息,處理完后再切換回原來的進(jìn)程狀態(tài),這個(gè)過程如果頻繁的發(fā)生在一個(gè)高事務(wù),高并發(fā)進(jìn)程的處理系統(tǒng)里面,將是個(gè)很昂貴的資源消耗,所以Oracle選擇了spin,讓進(jìn)程繼續(xù)占有CPU,運(yùn)行一些空指令,之后繼續(xù)請求,繼續(xù)spin,直到達(dá)到_spin_count值,這時(shí)會放棄CPU,進(jìn)行短暫的休眠,再繼續(xù)剛才的動(dòng)作。

 

 

1.3 進(jìn)程獲取Latch的過程:

           任何時(shí)候,只有一個(gè)進(jìn)程可以訪問內(nèi)存中的某一個(gè)數(shù)據(jù)塊,如果進(jìn)程因?yàn)閯e的進(jìn)程正占用塊而無法獲得Latch時(shí),他會對CPU進(jìn)行一次spin(旋轉(zhuǎn)),時(shí)間非常的短暫,spin過后繼續(xù)獲取,不成功仍然spin,直到spin次數(shù)到達(dá)閥值限制(這個(gè)由隱含參數(shù)_spin_count指定),此時(shí)進(jìn)程會停止spin,進(jìn)行短期的休眠,休眠過后會繼續(xù)剛才的動(dòng)作,直到獲取塊上的Latch為止。

 

           進(jìn)程休眠的時(shí)間也是存在算法的,他會隨著spin次數(shù)而遞增,以厘秒為單位,如11,2,2,4,4,8,8,。。。休眠的閥值限制由隱含參數(shù)_max_exponential_sleep控制,默認(rèn)是2秒,如果當(dāng)前進(jìn)程已經(jīng)占用了別的Latch,則他的休眠時(shí)間不會太長(過長會引起別的進(jìn)程的Latch等待),此時(shí)的休眠最大時(shí)間有隱含參數(shù)_max_sleep_holding_latch決定,默認(rèn)是4厘秒。這種時(shí)間限制的休眠又稱為短期等待。

           另外一種情況是長期等待鎖存器(Latch Wait Posting),此時(shí)等待進(jìn)程請求Latch不成功,進(jìn)入休眠,他會向鎖存器等待鏈表(Latch Wait List)壓入一條信號,表示獲取Latch的請求,當(dāng)占用進(jìn)程釋放Latch時(shí)會檢查Latch Wait List,向請求的進(jìn)程傳遞一個(gè)信號,激活休眠的進(jìn)程。Latch Wait List是在SGA區(qū)維護(hù)的一個(gè)進(jìn)程列表,他也需要Latch來保證其正常運(yùn)行,默認(rèn)情況下share pool latchlibrary cache latch是采用這個(gè)機(jī)制。

           如果將隱含參數(shù)_latch_wait_posting設(shè)置為2,則所有Latch都采用這種等待方式,使用這種方式能夠比較精確的喚醒某個(gè)等待的進(jìn)程,但維護(hù)Latch Wait List需要系統(tǒng)資源,并且對Latch Wait ListLatch的競爭也可能出現(xiàn)瓶頸。

 

  如果一個(gè)進(jìn)程請求,旋轉(zhuǎn),休眠Latch用了很長時(shí)間,他會通知PMON進(jìn)程,查看Latch的占用進(jìn)程是否已經(jīng)意外終止或死亡,如果是則PMON會清除釋放占用的Latch資源。

 

           總之,Latch獲取的流程:請求-SPIN-休眠-請求-SPIN-休眠... ...占用。

 

 

1.4 LatchLock

           從某種意義上說,Latch是內(nèi)存中的資源鎖,數(shù)據(jù)庫對象(表,索引等)的鎖叫Lock。

 

LatchLock的區(qū)別:

 ?。?span lang="EN-US">1). Latch是對內(nèi)存數(shù)據(jù)結(jié)構(gòu)提供互斥訪問的一種機(jī)制,而Lock是以不同的模式來套取共享資源對象,各個(gè)模式間存在著兼容或排斥,從這點(diǎn)看出,Latch的訪問,包括查詢也是互斥的,任何時(shí)候,只能有一個(gè)進(jìn)程能pin住內(nèi)存的某一塊,幸好這個(gè)過程是相當(dāng)?shù)亩虝海駝t系統(tǒng)性能將沒的保障,從9I開始,允許多個(gè)進(jìn)程同時(shí)查詢相同的內(nèi)存塊。

 ?。?span lang="EN-US">2). Latch只作用于內(nèi)存中,他只能被當(dāng)前實(shí)例訪問,而Lock作用于數(shù)據(jù)庫對象,在RAC體系中實(shí)例間允許Lock檢測與訪問

  (3. Latch是瞬間的占用,釋放,Lock的釋放需要等到事務(wù)正確的結(jié)束,他占用的時(shí)間長短由事務(wù)大小決定

 ?。?span lang="EN-US">4). Latch是非入隊(duì)的,而Lock是入隊(duì)的

           5. Latch不存在死鎖,而Lock中存在。

 

關(guān)于lock鎖可以參考我的blog

           oracle鎖機(jī)制

           http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4696896.aspx

 

           oracle鎖問題的解決

           http://blog.csdn.net/tianlesoftware/archive/2009/10/28/4733630.aspx

 

 

. Latch爭用

 

           如果發(fā)現(xiàn)系統(tǒng)中經(jīng)常由于Lock導(dǎo)致用戶等待,這時(shí)需要考慮系統(tǒng)在邏輯設(shè)計(jì)上是否有問題,比如多用戶對主鍵的刪除或者修改,是否有用戶使用selectfor update這樣的語法,外鍵是否創(chuàng)建索引的因素。這些因素是需要結(jié)合系統(tǒng)的業(yè)務(wù)邏輯性來進(jìn)行數(shù)據(jù)庫對象設(shè)計(jì)的。

 

           如果發(fā)現(xiàn)系統(tǒng)慢是因?yàn)楹芏嗟?span lang="EN-US">Latch爭用,就要考慮系統(tǒng)及數(shù)據(jù)庫自身設(shè)計(jì)上是否存在問題,比如是否使用綁定變量,是否存在熱快,數(shù)據(jù)存儲參數(shù)設(shè)計(jì)是否合理等因素。

 

           導(dǎo)致Latch爭用而等待的原因非常多,內(nèi)存中很多資源都可能存在爭用。最常見的兩類latch爭用如下:

           1)共享池中的Latch爭用。

           2)數(shù)據(jù)緩沖池中的latch爭用。

 

           Oracle內(nèi)存架構(gòu)詳解

           http://blog.csdn.net/tianlesoftware/archive/2010/05/16/5594080.aspx

 

2.1 共享池中的Latch爭用

           共享池中如果存在大量的SQL被反復(fù)分析,就會造成很大的Latch爭用和長時(shí)間的等待,最常見的現(xiàn)象就是沒有綁定變量。

           

           最常見的集中共享池里的Latchlibrary cache??梢酝ㄟ^一下SQL來查詢:

 

SQL> select * from v$latchname where name like 'library cache%';

 

            LATCH# NAME                        HASH

           ---------- -------------------------------------------------- ----------

      217 library cache                       3055961779

      218 library cache lock                   916468430

      219 library cache pin                    2802704141

      220 library cache pin allocation            4107073322

      221 library cache lock allocation           3971284477

      222 library cache load lock                2952162927

      223 library cache hash chains              1130479025

 

 

           在分析系統(tǒng)性能時(shí),如果看到有library cache這樣的Latch爭用,就可以斷定是共享池中出現(xiàn)了問題,這種問題基本是由SQL語句導(dǎo)致的,比如沒有綁定變量或者一些存儲過程被反復(fù)分析。

 

資源的爭用可以通過如下SQL來查看:

SQL> select event,count(*) from v$session_wait group by event;

 

EVENT                                    COUNT(*)

---------------------------------------------------------------- ----------

SQL*Ne tmessage from client                        4

Streams AQ: waiting for messages in the queue          1

ASM background timer                             1

gcs remote message                                                                                                                1

ges remote message                                                                                         1

jobq slave wait                                                                                                                  1

rdbms ipc message                                                                                                             14

smon timer                                                                                                                                         1

pmon timer                                                                                                                                       1

Streams AQ: qmn slave idle wait                                                         1

class slave wait                                                                                                        1

SQL*Net message to client                                                                          1

Streams AQ: waiting for time management or cleanup tasks 1

Streams AQ: qmn coordinator idle wait                                                  1

DIAG idle wait                                                                                                1

 

15 rows selected.

 

 

2.2數(shù)據(jù)緩沖池Latch爭用

           訪問頻率非常高的數(shù)據(jù)塊被稱為熱快(Hot Block),當(dāng)很多用戶一起去訪問某幾個(gè)數(shù)據(jù)塊時(shí),就會導(dǎo)致一些Latch爭用,最常見的latch爭用有:

           1  buffer busy waits

           2  cache buffer chain

這兩個(gè)Latch的爭用分別發(fā)生在訪問數(shù)據(jù)塊的不同時(shí)刻。

           

關(guān)于等待事件的說明,具體參考:

           Oracle常見的33個(gè)等待事件

           http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5807800.aspx

 

Cache buffer chian產(chǎn)生原因:

           當(dāng)一個(gè)會話需要去訪問一個(gè)內(nèi)存塊時(shí),它首先要去一個(gè)像鏈表一樣的結(jié)構(gòu)中去搜索這個(gè)數(shù)據(jù)塊是否在內(nèi)存中,當(dāng)會話訪問這個(gè)鏈表的時(shí)候需要獲得一個(gè)Latch,如果獲取失敗,將會產(chǎn)生Latch cache buffer chain等待,導(dǎo)致這個(gè)等待的原因是訪問相同的數(shù)據(jù)塊的會話太多或者這個(gè)列表太長(如果讀到內(nèi)存中的數(shù)據(jù)太多,需要管理數(shù)據(jù)塊的hash列表就會很長,這樣會話掃描列表的時(shí)間就會增加,持有chache buffer chain latch的時(shí)間就會變長,其他會話獲得這個(gè)Latch的機(jī)會就會降低,等待就會增加)。

 

Buffer busy waits產(chǎn)生原因:

           當(dāng)一個(gè)會話需要訪問一個(gè)數(shù)據(jù)塊,而這個(gè)數(shù)據(jù)塊正在被另一個(gè)用戶從磁盤讀取到內(nèi)存中或者這個(gè)數(shù)據(jù)塊正在被另一個(gè)會話修改時(shí),當(dāng)前的會話就需要等待,就會產(chǎn)生一個(gè)buffer busy waits等待。

 

 

           產(chǎn)生這些Latch爭用的直接原因是太多的會話去訪問相同的數(shù)據(jù)塊導(dǎo)致熱快問題,造成熱快的原因可能是數(shù)據(jù)庫設(shè)置導(dǎo)致或者重復(fù)執(zhí)行的SQL頻繁訪問一些相同的數(shù)據(jù)塊導(dǎo)致。

 

           Latch是簡單的、低層次的序列化技術(shù),用以保護(hù)SGA中的共享數(shù)據(jù)結(jié)構(gòu),比如并發(fā)用戶列表和buffer cache里的blocks信息。一個(gè)服務(wù)器進(jìn)程或后臺進(jìn)程在開始操作或?qū)ふ乙粋€(gè)共享數(shù)據(jù)結(jié)構(gòu)之前必須獲得對應(yīng)的latch,在完成以后釋放latch。不必對latch本身進(jìn)行優(yōu)化,如果latch存在競爭,表明SGA的一部分正在經(jīng)歷不正常的資源使用。

 

有關(guān)這部分的更多內(nèi)容,參考:

           鎖死鎖阻塞Latch等待詳解

           http://blog.csdn.net/tianlesoftware/archive/2010/08/20/5822674.aspx

 

 

 

檢查Latch的相關(guān)SQL

 

3.1查看造成LATCH BUFFER CACHE CHAINS等待事件的熱快

 

SELECTDISTINCTa.owner,a.segment_name

 FROMdba_extentsa,

      (SELECTdbarfil,dbablk

         FROMx$bh

        WHEREhladdrIN(SELECTaddr

                           FROM( SELECTaddr

                                     FROMv$latch_children

                                 ORDERBYsleepsDESC)

                          WHEREROWNUM<20))b

 WHERE    a.RELATIVE_FNO=b.dbarfil

      ANDa.BLOCK_ID<=b.dbablk

      ANDa.block_id+a.blocks>b.dbablk;

 

3.2 查詢當(dāng)前數(shù)據(jù)庫最繁忙的Buffer,TCH(Touch)表示訪問次數(shù)越高,熱點(diǎn)快競爭問題就存在

 

SELECT*

 FROM( SELECTaddr,

                ts#,

                file#,

                dbarfil,

                dbablk,

                tch

           FROMx$bh

       ORDERBYtchDESC)

 WHEREROWNUM<11;

 

3.3 查詢當(dāng)前數(shù)據(jù)庫最繁忙的Buffer,結(jié)合dba_extents查詢得到這些熱點(diǎn)Buffer來自哪些對象

 

SELECTe.owner,e.segment_name,e.segment_type

          FROMdba_extentse,

               (SELECT*

                  FROM(SELECT  addr,ts#,file#,dbarfil,dbablk,tch

                            FROMx$bh

                        ORDERBYtchDESC)

                 WHEREROWNUM<11)b

         WHEREe.relative_fno=b.dbarfil

           ANDe.block_id<=b.dbablk

           ANDe.block_id+e.blocks>b.dbablk;

 

3.4 如果在Top 5中發(fā)現(xiàn)latch free熱點(diǎn)塊事件時(shí),可以從V$latch_children中查詢具體的子Latch信息

 

SELECT*

 FROM(SELECT  addr,child#,gets,misses,sleeps,immediate_gets igets,

                immediate_misses imiss,spin_gets sgets

           FROMv$latch_children

          WHERENAME='cache buffers chains'

       ORDERBYsleepsDESC)

 WHEREROWNUM<11;

 

3.5獲取當(dāng)前持有最熱點(diǎn)數(shù)據(jù)塊的Latchbuffer信息

 

SELECTb.addr,a.ts#,a.dbarfil,a.dbablk,a.tch,b.gets,b.misses,b.sleeps

 FROM(SELECT*

         FROM(SELECT  addr,ts#,file#,dbarfil,dbablk,tch,hladdr

                   FROMx$bh

               ORDERBYtchDESC)

        WHEREROWNUM<11)a,

      (SELECTaddr,gets,misses,sleeps

         FROMv$latch_children

        WHERENAME='cache buffers chains')b

 WHEREa.hladdr=b.addr;

 

3.6利用前面的SQL可以找到這些熱點(diǎn)Buffer的對象信息

 

SELECTdistincte.owner,e.segment_name,e.segment_type

          FROMdba_extentse,

               (SELECT*

                  FROM(SELECT  addr,ts#,file#,dbarfil,dbablk,tch

                            FROMx$bh

                        ORDERBYtchDESC)

                 WHEREROWNUM<11)b

         WHEREe.relative_fno=b.dbarfil

           ANDe.block_id<=b.dbablk

           ANDe.block_id+e.blocks>b.dbablk;

 

3.7結(jié)合SQL視圖可以找到操作這些對象的相關(guān)SQL,然后通過優(yōu)化SQL減少數(shù)據(jù)的訪問,或者優(yōu)化某些容易引起爭用的操作(如connect by等操作)來減少熱點(diǎn)塊競爭

 

 

breakonhash_valueskip1

SELECT/*+ rule */hash_value,sql_text

   FROMv$sqltext

  WHERE(hash_value,address)IN(

           SELECTa.hash_value,a.address

             FROMv$sqltexta,

                  (SELECTDISTINCTa.owner,a.segment_name,a.segment_type

                              FROMdba_extentsa,

                                   (SELECTdbarfil,dbablk

                                      FROM(SELECT  dbarfil,dbablk

                                                FROMx$bh

                                            ORDERBYtchDESC)

                                     WHEREROWNUM<11)b

                             WHEREa.relative_fno=b.dbarfil

                               ANDa.block_id<=b.dbablk

                               ANDa.block_id+a.blocks>b.dbablk)b

            WHEREa.sql_textLIKE'%'|| b.segment_name ||'%'

              ANDb.segment_type='TABLE')

ORDERBYhash_value,address,piece;

關(guān)于如何進(jìn)行Oracle Latch 說明就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI