標籤:不同 mod 處理 資料庫 協助 多參數 size 不同的 ast
本文整理自《MySQL技術內幕 InnoDB儲存引擎》
MySQL通過後台各種線程、記憶體池、檔案互動來實現對外服務的,不同線程實現不同的資源操作,各個線程相互協助,共同來完成資料庫的服務。
以下簡單總結MySQL的一些後台線程以及主要作用,以及innodb引擎的變化升級情況。
整體上看,MySQL的後台線程概括如下,分為master thread,IO thread,purge thread,page cleaner thread
這其中,Master Thread是MySQL的最核心的線程,其中實現了多種功能,同時也在不斷地改進與最佳化。
InnoDB 1.2.X之前版本的Master Thread主要工作內容,
如下是虛擬碼來描述 Master Thread
MasterThread{ //每1秒一次操作涉及的行為 PerSecondOperation() { 1,重新整理redo日誌緩衝到磁碟,不管是否提交(總是)
屬於master thread中的checkpoint實現
2,合并插入緩衝(可能),根據一秒之內發生的IO次數,如果小於5,則執行合并插入緩衝的操作
3,最多重新整理100個Innodb緩衝池中的髒頁到磁碟(可能), if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct>buf_get_modified_ratio_pct) 執行重新整理100個髒頁到磁碟
4,如果當前沒有使用者活動,切換到background模式 } //每10秒一次操作涉及的行為 TenSecondOperation() { 1,重新整理100個Innodb緩衝池中的髒頁到磁碟(可能), 判斷過去10秒之內IO操作是否小於200次,如果是,重新整理100個髒頁到磁碟------>寫入程式碼
2,合并最多5個插入緩衝(總是),無條件,總是執行合并最多5個插入緩衝
3,日誌緩衝重新整理到磁碟(總是)
4,刪除無用的undo頁(總是),每次最多嘗試回收20個頁---->寫入程式碼
5,重新整理100或者10個髒頁到磁碟(總是):---->寫入程式碼 髒頁比例>70%==>重新整理100個髒頁到磁碟, 髒頁比例<70%==>重新整理10個髒頁到磁碟 } //BackgroundOperation線程 BackgroundOperation() { 1,刪除無用的Undo頁(總是)
2,合并20個插入緩衝(總是)
3,跳回到主迴圈(總是)
4,不斷刷線100個直到page到磁碟,直到滿足(髒頁小於參數buf_max_dirty_pages_pct)。 }}
不難發現,InnoDB 1.2.X之前的版本寫死了很多參數,
InnoDB 1.2.X之後版本的Master Thread根據實際情況,靈活地增加了一些配置參數,尤其是與IO有關的innodb_io_capacity參數。
innodb_io_capacity表示實體儲存體的IO能力,在後台線程與實體儲存體IO互動的時候,由於不同的存放裝置有不同的IO處理能力,
innodb_io_capacity就表示實體儲存體的IO處理能力的參,預設值是200
通過根據實際儲存情況對innodb_io_capacity的配置,可以最大化地提高MySQL伺服器的處理效能。
MasterThread{ 1,增加參數innodb_io_capacity,合并插入緩衝=innodb_io_capacity*5%;重新整理髒頁數量=innodb_io_capacity 2,buf_max_dirty_pages_pct預設值修改為75% 3,innodb_purge_batch_size,回收undo頁的配置,預設值20 //每1秒一次操作涉及的行為 PerSecondOperation() { 1,重新整理redo日誌緩衝到磁碟,不管是否提交(總是) 屬於master thread類型的checkpoint 2,合并插入緩衝(可能),根據一秒之內發生的IO次數: if(過去1秒鐘的ios<5%innodb_io_capacity) { 執行合并5%innodb_io_capacity個page的插入緩衝的操作 } 3,重新整理緩衝池中的髒頁到磁碟(可能): if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct) 重新整理髒頁個數:100%*innodb_io_capacity if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct) 重新整理髒頁個數:10%*innodb_io_capacity 4,如果當前沒有使用者活動,切換到background模式 } //每10秒一次操作涉及的行為 TenSecondOperation() { 1,重新整理緩衝池中的髒頁到磁碟(可能): if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct) 重新整理髒頁個數:100%*innodb_io_capacity if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct) 重新整理髒頁個數:10%*innodb_io_capacity 2,合并插入緩衝(可能),根據過去一秒之內發生的IO次數: if(ios<5%innodb_io_capacity) { 執行合并5%innodb_io_capacity個page的插入緩衝的操作 } 3,日誌緩衝重新整理到磁碟(總是) 4,刪除無用的undo頁(總是) 根據參數:innodb_purge_batch_size } BackgroundOperation() { 1,刪除無用的Undo頁(總是)
2,合并innodb_io_capacity個插入緩衝(總是)
3,跳回到主迴圈(總是)
4,不斷刷線innodb_io_capacity個page到磁碟,直到滿足(髒頁小於參數buf_max_dirty_pages_pct)。 }}
獨立的page cleaer thread
PageCleanerThread(){ 1,重新整理緩衝池中的髒頁到磁碟(可能): if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct) 重新整理髒頁個數:100%*innodb_io_capacity if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct) 重新整理髒頁個數:10%*innodb_io_capacity}
MySQL後台線程整理總結