Mysql體系結構詳解——後臺執行緒(待更新)
本文只是一個初稿,還有很多不確定的地方。晚上在看看官方文件看看。
InnoDB儲存引擎是多執行緒的模型,因此其後臺有多個不同的後臺執行緒,負責處理不同的任務。
1.Master Thread
Master Thread是一個非常核心的後臺執行緒,主要負責將緩衝池中的資料非同步重新整理到磁碟,保證資料的一致性,包括髒頁的重新整理、合併插入緩衝(INSERT BUFFER)、UNDO頁的回收等。2.5節會詳細地介紹各個版本中Master Thread的工作方式。
master thread的執行緒優先級別最高。其內部由幾個迴圈(loop)組成:主迴圈(loop)、後臺迴圈(backgroundloop)、重新整理迴圈(flush loop)、暫停迴圈(suspend loop)。master thread會根據資料庫執行的狀態在loop、background loop、 flush loop和suspend loop中進行切換。loop稱為主迴圈,因為大多數的操作都在這個迴圈中,其中有兩大部分操作:每秒鐘的操作和每10秒的操作.
Loop為主迴圈,如果沒有使用者活動,就切換到backgroundloop中,然後跳轉會loop,如果還需要flush重新整理,那就轉到flush loop,如果在flush loop中也空閒,那就切換到suspend loop中,將master thread掛起等待事件的發生。
每秒一次的操作包括:
™ 日誌緩衝重新整理到磁碟,即使這個事務還沒有提交(總是)。
™ 合併插入緩衝(可能)。
™ 至多重新整理100個InnoDB的緩衝池中的髒頁到磁碟(可能)。
™ 如果當前沒有使用者活動,切換到background loop(可能)。
接著來看每10秒的操作,包括如下內容:
™ 重新整理100個髒頁到磁碟(可能)。
™ 合併至多5個插入緩衝(總是)。
™ 將日誌緩衝重新整理到磁碟(總是)。
™ 刪除無用的Undo頁(總是)。
™ 重新整理100個或者10%髒頁到磁碟(總是)。
™ 產生一個檢查點(總是)。
Background loop會執行以下操作
™ 刪除無用的Undo頁(總是)。
™ 合併20個插入緩衝(總是)。
™ 跳回到主迴圈(總是)。
™ 不斷重新整理100個頁,直到符合條件(可能,跳轉到flush loop中完成)。
2.IO Thread
在InnoDB儲存引擎中大量使用了AIO(Async IO)來處理寫IO請求,這樣可以極大提高資料庫的效能。而IO Thread的工作主要是負責這些IO請求的回撥(call back)處理。InnoDB 1.0版本之前共有4個IO Thread,分別是write、read、insert buffer和log IO thread。在Linux平臺下,IO Thread的數量不能進行調整,但是在Windows平臺下可以通過引數innodb_file_io_threads來增大IO Thread。從InnoDB 1.0.x版本開始,read thread和write thread分別增大到了4個,並且不再使用innodb_file_io_threads引數,而是分別使用innodb_read_io_threads和innodb_write_io_threads引數進行設定,如:
mysql>SHOW VARIABLES LIKE 'innodb_version'\G;
*************************** 1. row ***************************
Variable_name: innodb_version
Value: 1.0.6
1 row in set (0.00 sec)
mysql>SHOW VARIABLES LIKE 'innodb_%io_threads'\G;
*************************** 1. row ***************************
Variable_name: innodb_read_io_threads
Value: 4
*************************** 2. row ***************************
Variable_name: innodb_write_io_threads
Value: 4
2 rows in set (0.00 sec)
可以通過命令SHOW ENGINE INNODB STATUS來觀察InnoDB中的IO Thread:
mysql>SHOW ENGINE INNODB STATUS\G;
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
=====================================
100719 21:55:26 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 36 seconds
……
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
……
----------------------------
END OF INNODB MONITOR OUTPUT
============================
1 row in set (0.01 sec)
可以看到IO Thread 0為insert buffer thread。IO Thread 1為log thread。之後就是根據引數innodb_read_io_threads及innodb_write_io_threads來設定的讀寫執行緒,並且讀執行緒的ID總是小於寫執行緒。
3.Purge Thread
事務被提交後,其所使用的undolog可能不再需要,因此需要PurgeThread來回收已經使用並分配的undo頁。在InnoDB 1.1版本之前,purge操作僅在InnoDB儲存引擎的Master Thread中完成。而從InnoDB 1.1版本開始,purge操作可以獨立到單獨的執行緒中進行,以此來減輕Master Thread的工作,從而提高CPU的使用率以及提升儲存引擎的效能。使用者可以在MySQL資料庫的配置檔案中新增如下命令來啟用獨立的Purge Thread:
[mysqld]
innodb_purge_threads=1
在InnoDB 1.1版本中,即使將innodb_purge_threads設為大於1,InnoDB儲存引擎啟動時也會將其設為1,並在錯誤檔案中出現如下類似的提示:
120529 22:54:16 [Warning] option 'innodb-purge-threads': unsigned value 4 adjusted to 1
從InnoDB 1.2版本開始,InnoDB支援多個Purge Thread,這樣做的目的是為了進一步加快undo頁的回收。同時由於Purge Thread需要離散地讀取undo頁,這樣也能更進一步利用磁碟的隨機讀取效能。如使用者可以設定4個Purge Thread:
mysql> SELECT VERSION()\G;
*************************** 1. row ***************************
VERSION(): 5.6.6
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'innodb_purge_threads'\G;
*************************** 1. row ***************************
Variable_name: innodb_purge_threads
Value: 4
1 row in set (0.00 sec)
4.Page Cleaner Thread
Page Cleaner Thread是在InnoDB 1.2.x版本中引入的。其作用是將之前版本中髒頁的重新整理操作都放入到單獨的執行緒中來完成。而其目的是為了減輕原Master Thread的工作及對於使用者查詢執行緒的阻塞,進一步提高InnoDB儲存引擎的效能。
5.鎖監控執行緒
6.錯誤監控執行緒