Oracle Latch與latch的沖突表現(xiàn)
Oracle Rdbms在實(shí)際操作中運(yùn)用到各種類型的相關(guān)的鎖定機(jī)制,Oracle latch就是其經(jīng)常使用的一種,以下的文章主要是介紹latch(閂)的概念,以及理解latch的實(shí)現(xiàn)方法并說明引起latch沖突的原因。
什么是Oracle latch
Latch是用于保護(hù)SGA區(qū)中共享數(shù)據(jù)結(jié)構(gòu)的一種串行化鎖定機(jī)制。Latch的實(shí)現(xiàn)是與操作系統(tǒng)相關(guān)的,尤其和一個進(jìn)程是否需要等待一個latch、需要等待多長時間有關(guān)。
Latch 是一種能夠極快地被獲取和釋放的鎖,它通常用于保護(hù)描述buffer cache中block的數(shù)據(jù)結(jié)構(gòu)。與每個latch相聯(lián)系的還有一個清除過程,當(dāng)持有l(wèi)atch的進(jìn)程成為死進(jìn)程時,該清除過程就會被調(diào)用。Latch 還具有相關(guān)級別,用于防止死鎖,一旦一個進(jìn)程在某個級別上得到一個Oracle latch,它就不可能再獲得等同或低于該級別的latch。
Latch與Enqueue(隊列)
Enqueue 是Oracle使用的另一種鎖定機(jī)制,它更加復(fù)雜,允許幾個并發(fā)進(jìn)程不同程度地共享某些資源。任何可被并發(fā)使用的對象均可使用enqueue加以保護(hù)。一 個典型的例子是表的鎖定,我們允許在一個表上有不同級別的共享。與latch不同之處在于,enqueue是使用操作系統(tǒng)特定的鎖定機(jī)制,一個 enqueue允許用戶在鎖上存貯一個標(biāo)記,來表明請求鎖的模式。
操作系統(tǒng)lock manager跟蹤所有被鎖定的資源,如果某個進(jìn)程不能獲取它所請求的那種鎖,操作系統(tǒng)就把請求進(jìn)程置于一個等待隊列中,該隊列按FIFO原則調(diào)度,而在 latches中是沒有象enqueue中排序的等待隊列,latch等待進(jìn)程要么使用定時器來喚醒和重試,要么spin(只用于多處理器情況下)。
何時需要latch
當(dāng)一個進(jìn)程準(zhǔn)備訪問SGA中的數(shù)據(jù)結(jié)構(gòu)時,它就需要獲得一個lOracle atch。當(dāng)進(jìn)程獲得latch后,它將一直持有該latch直到它不再使用此數(shù)據(jù)結(jié)構(gòu),這時latch才會被釋放??赏ㄟ^latch名稱來區(qū)分它所保護(hù)的不同數(shù)據(jù)結(jié)構(gòu)。
Oracle 使用元指令對latch進(jìn)行操作, 當(dāng)所需的latch已被其他進(jìn)程持有時,執(zhí)行指令進(jìn)程將停止執(zhí)行部分指令,直到該latch被釋放為止。從根本上講,latch防止并發(fā)訪問共享數(shù)據(jù)結(jié) 構(gòu),由于設(shè)置和釋放latch的指令是不可分割的,操作系統(tǒng)就可以保證只有一個進(jìn)程獲得latch,又由于這只是單條指令,所以執(zhí)行速度很快。
latch 被持有的時間是很短,而且提供了當(dāng)持有者不正常中斷時的清除機(jī)制,該清除工作是由Oracle后臺進(jìn)程PMON來完成的。
什么導(dǎo)致latch沖突
Latch 保護(hù)SGA中的數(shù)據(jù)結(jié)構(gòu)被多個用戶同時訪問,如果一個進(jìn)程不能立即得到所需latch,它就必須等待,這就導(dǎo)致了CPU的額外負(fù)擔(dān)和系統(tǒng)的速度降低。額外 的CPU使用是進(jìn)程‘spining’導(dǎo)致的,‘spining’是指進(jìn)程定時地重復(fù)嘗試獲取Oracle latch,在連續(xù)兩次之間,進(jìn)程處于休眠狀態(tài),在得到 latch之前,spining過程將重復(fù)進(jìn)行下去。
如何標(biāo)識內(nèi)部latch的沖突
Server manager monitor是一個相當(dāng)有用的來監(jiān)視latch等待、請求和沖突的工具。也可查詢相關(guān)的數(shù)據(jù)字典表:v$latch, v$latchholder, v$latchname。
v$latch 表的每一行包括了對不同類型latch的統(tǒng)計,每一列反映了不同類型的latch請求的活動情況。不同類型的latch請求之間的區(qū)別在于,當(dāng)latch 不可立即獲得時,請求進(jìn)程是否繼續(xù)進(jìn)行。按此分類,latch請求的類型可分為兩類:willing-to-wait和immediate。
Willing-to-wait : 是指如果所請求的latch不能立即得到,請求進(jìn)程將等待一很短的時間后再次發(fā)出請求。進(jìn)程一直重復(fù)此過程直到得到latch。
Immediate:是指如果所請求的latch不能立即得到,請求進(jìn)程就不再等待,而是繼續(xù)執(zhí)行下去。
在v$latch中的以下字段反映了Willing-to-wait請求:
GETS---成功地以Willing-to-wait請求類型請求一個Oracle latch的次數(shù)。
MISSES---初始以Willing-to-wait請求類型請求一個latch不成功的次數(shù)。
SLEEPS---初始以Willing-to-wait請求類型請求一個latch不成功后,進(jìn)程等待獲取latch的次數(shù)。
在v$latch中的以下字段反映了Immediate類請求:
IMMEDIATE_GETS---以Immediate請求類型成功地獲得一個latch的次數(shù)。
IMMEDIATE_MISSES---以Immediate請求類型請求一個Oracle latch不成功的次數(shù)。
【編輯推薦】