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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM