MySQL中的latch(閂鎖)詳解——易產生的問題以及原因分析

來源:互聯網
上載者:User

標籤:資訊   cal   mit   family   解決   sea   效果   error   ror   

Latch

什麼是latch:

  鎖是資料庫系統區別與檔案系統的一個關鍵特性。鎖機制用於管理對共用資源的並發訪問。Innodb儲存引擎在行層級上對錶資料上鎖,這固然不錯。但是Innodb也會在多個地方使用鎖,從而允許多種不同資源提供並發訪問。例如,操作緩衝池匯總的LRU列表,刪除、添加、移動LRU列表中的元素,為了保證一致性,必須有鎖的介入,這就是latch鎖。

latch與lock的區別

  latch一般稱為閂鎖(輕量層級的鎖),因為其要求鎖定的時間必須非常短。若持續的時間長,則應用的效能會非常差。在Innodb儲存引擎中,latch又可以分為mutex(互斥量)和RW-Lock(讀寫鎖)。

而lock對象是事務,用來鎖定的是資料庫中的對象,如表、行、頁。並且一般lock的對象僅在事務commit或rollback後進行釋放(不同交易隔離等級釋放的時間可能不同)。此外,lock,正如在大多數資料庫中一樣,是有死結機制的。

同過show engine innodb mutex 進行查看latch

 

name列顯示的是latch的資訊以及源碼所在的位置(行數)。

latch的分類

分為:mutex:互斥量;有時候有些資源需要共用和並發,但是又不是分頻繁,所以向作業系統申請一個mutex,mutex都是排他的。

     RW-LATCH : 讀寫鎖

latch的理解:

一個例子:

當我們在執行select 時,資料是緩衝在buffer pool中的,多個線程並發訪問或者修改這個資料必然需要一個並發控制機制,這個就是latch

資料庫要訪問的資料必須先存在緩衝中,而緩衝一般比磁碟空間要小,資料緩衝使用hash表來記錄資料頁是否在記憶體中。在MySQL中對應的RW-Latch在errlog中說的很清楚,該RW-Latch是在buf0sea.cc的658行建立的RW-Latch。

 

看errorlog 的壓測樣本:

 

根據日誌我們可以分析到線程140140355766016要對記錄加一個x鎖,但是等待線程0x4c407b8線程的RW-Latch的釋放。

 

latch爭用過程

1)a 以x訪問鏈表

2)b 排隊等待x解鎖  佔了cpu,但是cpu發現你在等待,所以cpu將b踢出

3)鎖鏈的時間,就是找資料的時間。

4)b知道很a快所以,b不去排隊,這是後去spin 也就是空轉cpu,然後再去看一下記憶體資料結構,a是否已解鎖

5)b轉了一圈後,在bspin的時間段的時間中,c進來了,連續多次的spin後, 產生了os waits

6)作業系統將b從cpu中踢出

latch鎖特點:

  • 1.不排隊
  • 2.spin
  • 3.os waits
  • 4.cpu繁忙

mutex:

      記憶體結構 很小 資料庫從作業系統申請到的,不佔用buffer pool,完全排他

 mutex鎖的持有過程: 

  a線程持有想mutex記憶體資料結構中寫一個1

    b線程看到記憶體資料結構有數字, 那麼就去spin

確認latch爭用類型:

(這就是在源碼中的173語句)由errorlog 得到的

 

latch爭用的過程

鏈表上有一個鏈的保護機制latch,小記憶體結構,這時候有讀的線程a上來要讀取鏈,這個時候這個管理就變成r,讀鎖,當在鏈上找到資料的時候(讀),一找到就釋放讀鎖,b上來也要讀取,這時候一看是r,讀鎖是可以共用的,她也是對鏈進行訪問讀取的,c上來要修改鏈中的兩個塊的內容,一看是r,r和w是互斥的,不能夠同時進行,要麼

1、主動要求退出cpu

2、空佔著cpu資源(執行一段空代碼,loop,隔一段時間看看a和b有沒有使用完(spin),但是在這個過程中因為c沒有排隊等待,所以可能在等待的過程中又有其他的線程上來霸佔鏈,如果執行多次仍這樣,可能就sleep,退出cpu了)為什麼空占(害怕作業系統看她閑的把他強行拖走),等(因為他知道a和b佔用了資源時間比較短,就是遍曆一條鏈的時間非常短)。

latch爭用的現象:

1、latch爭用會表現為cpu繁忙

2、latch爭用沒有排隊,等一段隨機的時間再回來看一看

監控指標

----------

SEMAPHORES

----------

OS WAIT ARRAY INFO: reservation count 2

OS WAIT ARRAY INFO: signal count 2

RW-shared spins 0, rounds 4, OS waits 2

RW-excl spins 0, rounds 0, OS waits 0

RW-sx spins 0, rounds 0, OS waits 0

Spin rounds per wait: 4.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx

rounds的意思是每次詢問旋轉的參數

os waits:表示sleep,當突然增長比較快的時候,說明latch爭用比較嚴重

rw-shared spin 的次數

rw-excl  spin的次數

latch爭用發生的原因

1、記憶體訪問太頻繁(不停地找)

2、list鏈太長(鏈上掛10000個快,被持有的幾率太大)

所以有時候會增加instance的數量,把大pool切成小的pool,讓list鏈變的短一些

如何降低latch爭用:

如果出現latch爭用比較嚴重

1.最佳化sql,降低對記憶體讀的數量——效果比較明顯

2.增加instances的數量

如何準確發現解決latch

1.show engine Innodb mutex

2.查看什麼類型的latch

3.定位sql

MySQL中的latch(閂鎖)詳解——易產生的問題以及原因分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.