MySQL latch爭用深入分析

G8bao7發表於2020-09-10

轉載: http://www.cnblogs.com/geaozhang/


關於MySQL latch爭用深入分析與判斷

1、 latch鎖是什麼鎖

2、 latch鎖是如何保護list

3、 latch爭用的現象和過程

4、 latch什麼時候會產生嚴重的爭用

5、 如何監控latch爭用情況

6、 如何確認latch爭用型別

7、 如何降低latch爭用

一、latch鎖是什麼鎖

1、定義

  latch鎖是記憶體鎖,是一個小型的 在記憶體中保護list的記憶體鎖結構

2、特點

  1、不排隊

  2、spin,一個執行緒想獲得一個鎖,但是該鎖已被另一執行緒持有,進行spin(空轉隨機時間)佔用cpu間接性的等待鎖的釋放,然後獲取去進行相關操作。

  3、os waits: sleep,spin多次仍然spin

  4、cpu繁忙,latch爭用

  Q: 什麼是鎖?

A:

  1、用來保護共享資源,支援併發

  2、鎖會影響併發

  3、latch鎖、lock鎖

 

、latch鎖是如何保護list

1、“保護”過程分析

  1、訪問頁先需要訪問鏈

  2、修改list不等於修改頁

  3、什麼時候修改list

    1、物理讀,將資料頁掛到list上

    2、記憶體讀、修改資料頁,修改鏈

  4、鎖,其實就是一個記憶體空間,有結構有資料的記憶體資料塊

    s:R共享鎖

    x:W排它鎖

  5、鎖的相容性

    1、但凡有x鎖,排它,就不相容。

    2、 latch鎖排它就會造成latch爭用

注:mutex互斥鎖:針對併發量不是很大的資源。

2、原理圖分析

 

 

三、latch爭用的現象和過程

1、latch爭用現象

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

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

2、latch爭用過程

  1、鏈上有一個鏈的保護機制latch,小記憶體結構;

  2、這時候有讀的執行緒A上來要讀取鏈,這個時候這個管理就變成r(讀鎖),當在鏈上找到資料頁的時候(讀),一找到就釋放讀鎖;

  3、B上來也要讀取,這個時候一看是r,讀鎖是可以共享的,它也對鏈進行訪問讀取;

  4、C上來要修改鏈中的兩個塊的內容,一看是r,r和w是互斥的,不能同時進行,要麼

    1、主動要求退出cpu;

    2、空佔著cpu資源(執行一段空程式碼,loop,隔一段時間看看A和B有沒有使用完(spin),但是在這個過程中因為C沒有排隊等待,所以可能在等待的過程中又有其他的執行緒上來霸佔鏈(不排隊的壞處),如果執行多次仍這樣,可能就sleep,退出cpu了,sleep,產生os waits)。

  5、為什麼空佔(害怕os看它閒著把它強行拖出去)

  6、等(因為它知道A和B佔用資源時間比較短,就是遍歷一條鏈的時間非常短)

 

、latch什麼時候會產生嚴重的爭用

1、異常SQL:往往意味著latch爭用

  大量的物理讀:修改鏈

  大量的記憶體讀:遇到修改鏈的衝突

2、記憶體訪問頻繁(不停找),其實也是異常SQL造成的。

3、list太長

   鏈上掛10000個塊,被持有的機率太大……

mysql> show variables like 'i%instances';+------------------------------+-------+| Variable_name                | Value |+------------------------------+-------+| innodb_buffer_pool_instances | 1     |+------------------------------+-------+1 row in set (0.00 sec)

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

 

、如何監控latch爭用情況

1、對於MySQL 5.7

mysql> show engine innodb status\G
……
SEMAPHORES----------OS WAIT ARRAY INFO: reservation count 23OS WAIT ARRAY INFO: signal count 14RW-shared spins 0, rounds 73, OS waits 5RW-excl spins 0, rounds 1114, OS waits 5RW-sx spins 0, rounds 0, OS waits 0Spin rounds per wait: 73.00 RW-shared, 1114.00 RW-excl, 0.00 RW-sx

  rounds:表示spin一次空轉多少圈,也就是返回來詢問的次數

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

  1、如果OS waits值比較高,說明出現latch爭用,異常SQL

  2、獲取latch的代價: 73.00 RW-shared, 1114.00 RW-excl

2、對於MySQL 5.6

mysql> show engine innodb status\G
……
SEMAPHORES----------OS WAIT ARRAY INFO: reservation count 29758OS WAIT ARRAY INFO: signal count 29148Mutex spin waits 1054508, rounds 427812, OS waits 2104RW-shared spins 26703, rounds 800527, OS waits 26673RW-excl spins 68, rounds 27115, OS waits 888Spin rounds per wait: 0.41 mutex, 29.98 RW-shared, 398.75 RW-excl

  Mutex spin waits:可以理解成misses,空轉cpu

  Mutex是互斥鎖、 RW-shared是共享鎖、 RW-excl是排它鎖

 

、確認latch爭用型別

mysql> show engine innodb mutex;+--------+-----------------------------+----------+| Type   | Name                        | Status   |+--------+-----------------------------+----------+| InnoDB | rwlock: dict0dict.cc:2687   | waits=1  || InnoDB | rwlock: dict0dict.cc:1184   | waits=13 || InnoDB | rwlock: log0log.cc:844      | waits=35 || InnoDB | sum rwlock: buf0buf.cc:1457 | waits=4  |+--------+-----------------------------+----------+4 rows in set (0.16 sec)

  利用show engine innodb mutex;來解決latch和mutex問題。

[root@localhost ~]# find / -name dict0dict.cc/usr/src/debug/percona-xtrabackup-2.4.4/storage/innobase/dict/dict0dict.cc/usr/local/src/mysql-5.7.14/storage/innobase/dict/dict0dict.cc[root@localhost ~]# cat /usr/local/src/mysql-5.7.14/storage/innobase/dict/dict0dict.cc    #檢視原始碼資訊,看其latch爭用型別具體描述

 

、如何降低latch爭用

1、最佳化SQL,降低對記憶體讀的數量,效果比較明顯。

2、增加innodb_buffer_pool_instances的數量。 對於具有大記憶體的64位系統,可以將緩衝池拆分成多個例項(預設8個),把需要緩衝的資料hash到不同的緩衝池中,這樣可以並行的記憶體讀寫,以最大限度地減少併發操作中記憶體結構的爭用。

@author:http://www.cnblogs.com/geaozhang/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-2718635/,如需轉載,請註明出處,否則將追究法律責任。

相關文章