大綱
1.InnoDB的執行緒模型
2.IO Thread
3.Purge Thread
4.Page Cleaner Thread
5.Master Thread
1.InnoDB的執行緒模型
InnoDB儲存引擎是多執行緒的模型,因此其後臺有多個不同的後臺執行緒,負責處理不同的任務。
後臺執行緒的作用一:負責重新整理記憶體池中的資料,保證緩衝池中的記憶體快取是最新的資料。
後臺執行緒的作用二:將已修改的資料頁重新整理到磁碟檔案,保證發生異常時能恢復到正常狀態。
2.IO Thread
IO Thread主要用於:讀取資料頁 + 寫入髒頁 + 寫入日誌緩衝 + 寫入寫緩衝。InnoDB使用了大量的AIO(Async IO)來做讀寫處理,可以極大提高效能。在InnoDB之前的版本只有4個IO Thread:分別是Read、Write、Insert Buffer和Log Thread。後來版本將Read Thread和Write Thread分別增大到了4個,一共有10個。
mysql> show engine innodb status;
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Read Thread負責讀操作,將資料從磁碟載入到快取,4個。Write Thread負責寫操作,將快取髒頁重新整理到磁碟,4個。Log Thread負責將日誌緩衝區內容重新整理到磁碟,1個。Insert Buffer Thread負責將寫緩衝內容重新整理到磁碟,1個。
3.Purge Thread
事務提交後,其使用的undo日誌將不再需要了,因此需要Purge Thread回收已經分配的undo頁。InnoDB支援多個Purge Thread,以便能加快回收undo頁,釋放記憶體。
mysql> show variables like '%innodb_purge_threads%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_purge_threads | 4 |
+----------------------+-------+
1 row in set (0.01 sec)
4.Page Cleaner Thread
Page Cleaner Thread的作用是:刷髒頁 + 清理redo log日誌檔案。也就是將髒資料重新整理到磁碟,髒資料刷盤後相應的redo log就可以被覆蓋了。既可以同步資料,又能讓redo log達到迴圈使用的目的。
其中Page Cleaner Thread會呼叫Write Thread執行緒進行處理。
mysql> show variables like '%innodb_page_cleaners%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_page_cleaners | 1 |
+----------------------+-------+
5.Master Thread
(1)Master Thread的具體工作
(2)Master Thread的定時處理
Master Thread是InnoDB的主執行緒,負責排程其他各執行緒,優先順序最高。作用是:定時刷髒頁 + 回收undo log + 寫入redo log + 合併寫緩衝。
(1)Master Thread的具體工作
一.呼叫Page Cleaner Thread進行髒頁的重新整理
二.呼叫Purge Thread進行undo log的回收
三.呼叫Log Thread進行redo log的重新整理
四.呼叫Insert Buffer Thread進行合併寫緩衝
(2)Master Thread的定時處理
Master Thread內部有兩個定時處理,分別是每隔1秒和10秒的定時處理。
一.每隔1秒的操作
操作1:每秒重新整理髒頁資料到磁碟,但需要髒頁比例達到75%才操作
innodb_io_capacity用來表示IO的吞吐量,預設200。對於重新整理到磁碟頁的數量,會按照innodb_io_capacity的百分比來控制。從緩衝池重新整理髒頁時,重新整理髒頁的數量為innodb_io_capcity。
mysql> show variables like 'innodb_io_capacity';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| innodb_io_capacity | 200 |
+--------------------+-------+
1 row in set (0.00 sec)
如果緩衝池中髒頁比例大於innodb_max_dirty_pages_pct(預設75%):重新整理髒頁到磁碟的數量是innodb_io_capacity的值。
mysql> show variables like 'innodb_max_dirty_pages_pct';
+----------------------------+-----------+
| Variable_name | Value |
+----------------------------+-----------+
| innodb_max_dirty_pages_pct | 75.000000 |
+----------------------------+-----------+
操作2:每秒合併寫緩衝區的資料
其實並不是每秒都會合並寫緩衝區資料的。如果前一秒的IO次數小於5,則認為IO壓力小,可執行合併插入緩衝操作。
操作3:每秒重新整理日誌緩衝區到磁碟
即使事務沒有提交,也會每秒將重做日誌緩衝重新整理到重做日誌檔案中。因此可以理解為什麼再大再長的事務提交,時間也是很短的。
二.每隔10秒的操作
操作1:每10秒重新整理髒頁資料到磁碟
從緩衝池重新整理髒頁時,髒頁的數量為innodb_io_capcity。
操作2:每10秒合併寫緩衝區
合併插入緩衝是innodb_io_capacity的5%。
操作3:每10秒重新整理日誌緩衝區
操作4:每10秒刪除無用的undo頁