1. 程式人生 > >MySQL後臺線程的清理工作

MySQL後臺線程的清理工作

nbsp style 線程 pan oltp reads com 磁盤 post

後臺清理工作:臟頁刷盤、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後臺線程的清理工作