深入理解mutex工作機制


0. summary

1. 什么是mutex
2. Oracle 11gR2中包含的mutex
3. mutex的工作方式
.   3.1 影響mutex工作的隱含參數(shù)
.       3.1.1 10g/11.2.0.1模式
.       3.1.2 patch 6904068模式
.   3.2 mutex的spin和mutex_spin_count控制

1. 什么是mutex

可以認為是一種更加輕量級的latch, 兩者的區(qū)別在于:mutex是內(nèi)存結(jié)構(gòu)本身所包含瀑踢,隨著內(nèi)存的分配而分配鹃操、銷毀而銷毀仓坞,latch是一種獨立的內(nèi)存結(jié)構(gòu)颜说」焊冢基于這個特性,mutex保護的內(nèi)存結(jié)構(gòu)更細粒度门粪,并發(fā)性喊积、支持性要好于latch.

與shared latch一樣可使mutex用cas模式申請latch. 因此也可以把mutex當成一種shared latch, 只是其粒度更細,更加輕量級玄妈。mutex采用spin+FIRO策略乾吻,而shared latch采用spin+FIFO策略髓梅。更多詳細關于mutex的原理可以參見:

https://andreynikolaev.wordpress.com/

從10.2.0.2版本開始,oracle的mutex機制逐步替代了傳統(tǒng)的library cache的一些機制绎签。

2. Oracle 11gR2中包含的mutex

#### 10.2.0.5 ####

SYS@panda>select name,level# from v$latch where name like 'library cache%';

NAME                               LEVEL#
-------------------------------------------------- ----------
library cache                           5
library cache lock                      6
library cache load lock                     5
library cache pin allocation                    3
library cache hash chains                   9
library cache lock allocation                   3
library cache pin                       6

#### 11.2.0.4 ####

SYS@bbed>select name,level# from v$latch where name like 'library cache%';

NAME                                     LEVEL#
---------------------------------------------------------------- ----------
library cache load lock                           5

不同版本中枯饿,對于library cache的latch變化較大,特別是從Oracle 10gR2(10.2.0.2)開始诡必,引入了mutex來替代cursor的latch. 在該版本上通過隱含參數(shù)_kks_use_mutex_pin的調(diào)整可以限制是否使用Mutex機制來實現(xiàn)Cursor Pin.

NAME                           VALUE                DESCRIB
------------------------------ -------------------- ------------------------------------------------------------
_kks_use_mutex_pin             TRUE                 Turning on this will make KKS use mutex for cursor pins.

mutex與latch的對應關系如下:

mutex latch mutex wait event
cursor pin library cache pin cursor: pin S奢方、cursor: pin X、cursor: pin S on X
cursor parent library cache lock cursor: mutex X爸舒、cursor: mutex S
cursor stat library cache lock cursor: mutex S
library cache library cache library cache: mutex X蟋字、library cache: mutex S
hash table library cache (child cursor) cursor: mutex X、cursor: mutex S
cursor parent library cache lock (child cursor) cursor: mutex X碳抄、cursor: mutex S

3. mutex的工作方式

  1. 申請mutex.
  2. 如果成功愉老,則持有該mutex
  3. 如果失敗,則進行spin. spin的過程就是在線等待mutex, 不斷發(fā)起mutex gets, 直到獲得mutex或者達到spin_count限制為止剖效。
  4. 依據(jù)工作模式的不同選擇yiled還是sleep.
  5. 若達到sleep限制或者被主動喚醒或者完成yiled, 則重復1)~4)步,直到獲得為止焰盗。

3.1 影響mutex工作的隱含參數(shù)

以下參數(shù)在11.2.0.2以上才有

PANDA@bbed>show parameter mutex

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
_mutex_spin_count            integer     255                ---- 設置mutex spin count, 默認255
_mutex_wait_scheme           integer     2              ---- 控制mutex的工作模式璧尸,默認為2. 可選擇0、1熬拒、2
_mutex_wait_time             integer     1              ---- 設置在工作模式1爷光、2下的sleep時間


PANDA@bbed>show parameter yield

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
_wait_yield_hp_mode          string  yield              ---- 設置mutex yield的優(yōu)先級
_wait_yield_mode             string  yield              ---- 這是yield的工作方式,默認為yield. 可選擇yield和sleep. 表示mutex在失敗后先yield還是sleep
_wait_yield_sleep_freq           integer     100                ---- sleep的次數(shù)澎粟,與_wait_yield_sleep_time_msecs一起構(gòu)成sleep時間
_wait_yield_sleep_time_msecs         integer     1              ---- 每次yield后進入sleep的sleep時間
_wait_yield_yield_freq           integer     20             ---- yield的次數(shù)

_mutex_wait_scheme=1 ---- 在mutex gets失敗后總是簡單yield兩次蛀序,然后進入sleep, sleep的時間由_mutex_wait_time設置。
_mutex_wait_scheme=2 ---- 傳統(tǒng)模式活烙,和模式1的區(qū)別在于徐裸,隨著時間推移,sleep time等待的時間越來越長啸盏。_mutex_wait_time設置了其最長的等待時間重贺。
_mutex_wait_scheme=0 ---- 最為靈活的工作方式,在mutex gets失敗后回懦,依據(jù)_wait_yield_mode選擇進入yield還是進入sleep, yield次數(shù)受到_wait_yield_yield_freq控制气笙。sleep time受_wait_yield_sleep_time_msecs*_wait_yield_sleep_freq的控制∏釉危可以通過參數(shù)控制使scheme 0獲得任意工作方式包括10g工作方式潜圃。

由于mutex采用了傳統(tǒng)的spin+sleep機制而不是latch的spin+post機制,所以sleep time的設置對于mutex性能具有重要地位舟茶,一般來說由于mutex的沖突遠比latch要小谭期,所以合適的yield和更小的sleep選擇是恰當?shù)尿让铡R话闱闆r不需要改動,默認都是1ms.

不同模式的比較可以參考:

https://andreynikolaev.wordpress.com/2012/07/30/mutex-waits-part-iii-contemporary-oracle-wait-schemes-diversity/

3.1.1 10g/11.2.0.1模式

不包含sleep, 只在簡單yield之后進行不斷的mutex spin. 顯然崇堵,在沖突不發(fā)生的情況下會有最好的性能型诚,但是在有沖突的時候可能會消耗很高的CPU資源。

3.1.2 patch 6904068模式

Resolving Issues Where High CPU utilization and 'cursor: pin S' waits are Seen Due to Bug 6904068 (文檔 ID 1476113.1)

This fix is intended for one off patches only and usually uses "_first_spare_parameter" to indicate the number of centiseconds
to wait when pausing for "cursor: pin S" waits. A value of 0 mimicks current behaviour which is to yield between tries.

對10g模式的一種修正鸳劳,增加了sleep部分以降低CPU消耗狰贯,sleep時間收到參數(shù)_first_spare_parameter的控制

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
_first_spare_parameter           integer

在Solaris SPARC 10.2.0.4這個參數(shù)是_second_spare_parameter.

3.2 mutex的spin和mutex_spin_count控制

mutex的spin次數(shù)受mutex_spin_count控制,默認為255. 該參數(shù)可以動態(tài)修改赏廓。

SYS@bbed>alter system set "_mutex_spin_count"=2000;

System altered.

某些時候涵紊,該值可能需要適當增大來獲取更好的性能。設置方法可參考latch的spin count設置方法幔摸。v$mutex_sleep_history視圖包含相關的gets和sleep信息摸柄。

SYS@bbed>select gets,sleeps,mutex_type from v$mutex_sleep_history;

      GETS     SLEEPS MUTEX_TYPE
---------- ---------- --------------------------------
     1      3 Cursor Pin
      6328      1 Library Cache

關于mutex_spin_conut設置對mutex響應性能的影響可參考:

https://andreynikolaev.files.wordpress.com/2012/05/exploring_mutexes_oracle_11_2_retrial_spinlocks.pdf

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市既忆,隨后出現(xiàn)的幾起案子驱负,更是在濱河造成了極大的恐慌,老刑警劉巖患雇,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跃脊,死亡現(xiàn)場離奇詭異,居然都是意外死亡苛吱,警方通過查閱死者的電腦和手機酪术,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翠储,“玉大人绘雁,你說我怎么就攤上這事≡” “怎么了庐舟?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長任斋。 經(jīng)常有香客問我继阻,道長,這世上最難降的妖魔是什么废酷? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任瘟檩,我火速辦了婚禮,結(jié)果婚禮上澈蟆,老公的妹妹穿的比我還像新娘墨辛。我一直安慰自己,他們只是感情好趴俘,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布睹簇。 她就那樣靜靜地躺著奏赘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪太惠。 梳的紋絲不亂的頭發(fā)上磨淌,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天,我揣著相機與錄音凿渊,去河邊找鬼梁只。 笑死,一個胖子當著我的面吹牛埃脏,可吹牛的內(nèi)容都是我干的搪锣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼彩掐,長吁一口氣:“原來是場噩夢啊……” “哼构舟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堵幽,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤狗超,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谐檀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抡谐,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年桐猬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刽肠。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡溃肪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出音五,到底是詐尸還是另有隱情惫撰,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布躺涝,位于F島的核電站厨钻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坚嗜。R本人自食惡果不足惜夯膀,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苍蔬。 院中可真熱鬧诱建,春花似錦、人聲如沸碟绑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至押袍,卻和暖如春诵冒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谊惭。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工汽馋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人午笛。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓惭蟋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親药磺。 傳聞我的和親對象是個殘疾皇子告组,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容