MySQL後臺線程整理總結

 本文整理自《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
相關文章
相關標籤/搜索