標籤:reads 啟動 回收 表示 style 資源 mil ima 效能
後台清理工作:髒頁刷盤、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、發起髒頁的寫請求
清理因為觸發需要髒頁回收的髒頁(髒很久了、冷髒頁……)
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後台線程的清理工作