本文整理自《MySQL技術內幕 InnoDB存儲引擎》ios
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. checkpoint
5,若是當前沒有用戶活動,切換到background模式 } //每10秒一次操做涉及的行爲 TenSecondOperation() { 1,刷新100個Innodb緩衝池中的髒頁到磁盤(可能), 判斷過去10秒以內IO操做是否小於200次,若是是,刷新100個髒頁到磁盤------>硬編碼
2,合併最多5個插入緩衝(老是),無條件,老是執行合併最多5個插入緩衝
3,日誌緩存刷新到磁盤(老是)
4,刪除無用的undo頁(老是),每次最多嘗試回收20個頁---->硬編碼
5,刷新100或者10個髒頁到磁盤(老是):---->硬編碼 髒頁比例>70%==>刷新100個髒頁到磁盤, 髒頁比例<70%==>刷新10個髒頁到磁盤
6. checkpoint
}
//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日誌緩衝到磁盤,無論是否提交(老是) 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. checkpoint
5,若是當前沒有用戶活動,切換到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
5. checkpoint
} 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 }
6. checkpoint