MySQL後臺線程的清理工作
後臺清理工作:臟頁刷盤、undo回收
1、page cleaner thread:刷新臟頁
2、purge thread:清空undo頁、清理“deleted”page
一、innodb_page_cleaners
page cleaner線程從buffer pool中刷臟頁的線程數量。
1、5.7新特性
1、5.6版本以前,臟頁的清理工作交由master線程的;
2、Page cleaner thread是5.6.2引入的一個新線程(單線程),從master線程中卸下buffer pool刷臟頁的工作獨立出來的線程(默認是啟一個線程);
3、5.7開始支持多線程刷臟頁;
2、發起臟頁的寫請求
清理因為觸發需要臟頁回收的臟頁(臟很久了、冷臟頁……)
註意:真正幹活的,將dirty page寫入磁盤的是innodb_write_io_threads
3、如何調整這個參數
mysql> show variables like ‘i%cleaners‘;
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_page_cleaners | 1 |
+----------------------+-------+
1 row in set (0.05 sec)
1、配置文件my.cnf中添加innodb_page_cleaners=num值
2、默認是1;最大可以是64,也就是會有64個page cleaner線程並發工作清理臟頁
4、如何判斷是否要修改增加innodb_page_cleaners
mysql> show global status like ‘%wait_free‘; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | Innodb_buffer_pool_wait_free| 0 | +------------------------------+-------+ 1 row in set (0.01 sec)
Innodb_buffer_pool_wait_free:標誌著臟頁有沒有成為系統的性能瓶頸;如果值很大,則需要增加innodb_page_cleaners值,同時增加寫線程。
1、通常,對於buffer pool的寫發生在後臺,當innodb需要讀或創建一個數據頁,但是沒有幹凈的可用頁,innodb就會為等待的操作能完成先將一些臟頁刷入磁盤。
2、Innodb_buffer_pool_wait_free就是這等待操作的實例數。如果innodb_buffer_pool_size的大小設置適當,這個值就會很小,甚至為0。
二、innodb_purge_threads
purge線程,後臺線程,致力於innodb清理,資源回收操作。
1、清理操作
1、清理undo頁
undo記錄修改前的數據用於回滾,已提交的時候,不再回滾,即可清理該undo信息。
2、清理page裏面的有“deleted”標簽的數據行
1、當我們delete數據行時,是對數據頁中要刪除的數據行做標記“deleted”,事務提交(速度快);
2、後臺線程purge線程對數據頁中有“deleted”標簽的數據行進行真正的刪除。
2、調整依據
1、系統存在大量的delete、對主鍵的update
mysql> show global status like ‘%rows%d%ted‘;
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| Innodb_rows_deleted | 0 |
| Innodb_rows_updated | 5 |
+---------------------+-------+
2 rows in set (0.01 sec)
2、mysql> show engine innodb status \G
Trx id counter 1159171 #事務計數 Purge done for trx‘s n:o < 1157813 #事務清空位置 #1159171-1157813表示有待清空的事務量 undo n:o < 0 #當前清理事務undo位置 state: running but idle #啟動但是閑置 History list length 1029 #當前undo數據頁的總量1029*16K
3、調整:innodb_purge_threads默認值是1,OLTP系統一般會修改為4
mysql> show variables like ‘%purge_t%‘;
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_purge_threads | 4 |
+----------------------+-------+
1 row in set (0.01 sec)
MySQL後臺線程的清理工作