1. 程式人生 > >MySQL後臺執行緒整理總結

MySQL後臺執行緒整理總結

 本文整理自《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. 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