MySQL底層概述—3.InnoDB執行緒模型

东阳马生架构發表於2024-11-29

大綱

1.InnoDB的執行緒模型

2.IO Thread

3.Purge Thread

4.Page Cleaner Thread

5.Master Thread

1.InnoDB的執行緒模型

InnoDB儲存引擎是多執行緒的模型,因此其後臺有多個不同的後臺執行緒,負責處理不同的任務。

後臺執行緒的作用一:負責重新整理記憶體池中的資料,保證緩衝池中的記憶體快取是最新的資料。

後臺執行緒的作用二:將已修改的資料頁重新整理到磁碟檔案,保證發生異常時能恢復到正常狀態。

MySQL底層概述—3.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頁

相關文章