關於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 23 OS WAIT ARRAY INFO: signal count 14 RW-shared spins 0, rounds 73, OS waits 5 RW-excl spins 0, rounds 1114, OS waits 5 RW-sx spins 0, rounds 0, OS waits 0 Spin 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 29758 OS WAIT ARRAY INFO: signal count 29148 Mutex spin waits 1054508, rounds 427812, OS waits 2104 RW-shared spins 26703, rounds 800527, OS waits 26673 RW-excl spins 68, rounds 27115, OS waits 888 Spin 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到不同的緩沖池中,這樣可以並行的內存讀寫,以最大限度地減少並發操作中內存結構的爭用。
關於MySQL latch爭用深入分析與判斷