InnoDB的Master Thread工作原理

  本文主要是通过阅读姜承尧先生的《MySQL技术内幕》,从中了解到master thread的工作原理。我主要写下自己的学习笔记,好记忆不如烂笔头。

  master thread可以分为主循环(loop),background循环,flush循环,suspend循环。可以这么理解,先运行主循环,如果当前数据库空闲,或者调用stop关闭命令时,进入background循环,在background循环最后,如果当前数据库不再空闲,就重新进入主循环,否则进入flush循环。在flush循环最后,如果数据库还是空闲就进入suspend循环,master thread挂起。

  主循环分成两部分,一部分是每一秒钟要做的事情,另一部分是每10秒钟要做的事情。伪代码如下:

  loop:
    for(int i=0;i<10;i++){
     thread_sleep(1);//sleep 1 second
     doing something{
      //每一秒钟要做的
      do log buffer flush to disk;
      if(last_one_second_ios < 5%*innodb_io_capacity){
      do merge at most 5% innodb_io_capacity insert buffer;
     }
     if(buffer_pool_modified_page_ratio_pct > innodb_max_dirty_page_pct){
      do buffer pool flush 100% innodb_io_capacity dirty pages;
     }else if(enable adaptive flush){
      do buffer pool flush desired amount dirty pages;
     }
     if(not user activity){
      goto background loop;
     }
    }
   }
   doging something;{
    //每10秒要做的
    if(last_ten_seconds_ios < innodb_io_capacity){
      do merge 100% innodb_io_capacity dirty pages;
    }
    do log buffer flush to disk;
    do merge at most 5% innodb_io_capacity insert buffer;
    do full purge,at most 20 undo pages;
    if(buffer_pool_modified_page_ratio_pct < 70%){
      do buffer pool flush 100% innodb_io_capacity dirty pages;
    }else{
      do buffer pool flush 10% innodb_io_capacity dirty pages;
    }
    do fuzzy checkpoint;
   }

  background loop循环伪代码如下:

  background loop:
    do full purge,at most 20 undo pages;
    do merge 100% innodb_io_capacity insert buffer;
    if(not idle){
      goto loop;
    }else{
      goto flush loop;
    }

  flush loop循环伪代码如下:

  flush loop:
    do buffer pool flush 100% innodb_io_capacity dirty pages;
    if(buffer_pool_modified_page_ratio_pct > innodb_max_dirty_page_pct){
      goto flush loop;
    }
    goto suspend loop;

  suspendloop循环伪代码如下:

  suspend loop:
    suspend thread();
    waiting event;
    goto loop;

  通过整理不难发现,整个master thread主要操作的对象只有,log buffer,insert buffer,dirty pages,undo pages,checkpoint。可以根据这些操作对象来分类主要有如下:

  log buffer:

    只在主循环中操作log buffer。而且,不管是在每一秒,还是每10秒,不需要任何前提,都会flush log buffer.这个最好理解。

  insert buffer:

    每一秒操作:如果一秒内磁盘IO < 5% innodb_io_capacity,就至多合并5% innodb_io_capacity的insert buffer.否则就不操作。

    每10秒操作:不需要任何前提,至多合并5% innodb_io_capacity的insert buffer。

    background loop:至多合并100% innodb_io_capacity的insert buffer。

  dirty pages:

    每一秒操作:如果缓冲池脏页比例 > innodb_max_dirty_pages_pct,就刷新100%innodb_io_capacity的脏页到磁盘。如果不满足条件,但是满足adaptive flush条件,仍会刷新一定的脏页到磁盘

    每10秒操作:如果最近10秒内,磁盘IO < innodb_io_capacity,就刷新100%innodb_io_capacity的脏页到磁盘。之后,如果缓冲池脏页比例 > 70% ,再次刷新100%innodb_io_capacity的脏页到磁盘,否则刷新10%innodb_io_capacity。

    flush loop:只要缓冲池脏页比例 > innodb_max_dirty_pages_pct,就刷新100%innodb_io_capacity的脏页到磁盘,直到脏页比例小于innodb_max_dirty_pages_pct设置。

  undo pages:

    每10秒操作 :不需要任何前提,至多删除20个undo 页.

    background loop : 不需要任何前提,至多删除20个undo 页.

  checkpoint :

    每10秒操作 :不需要任何前提,设置一个模糊检查点.

  

  

  

  

 

posted @ 2011-12-02 14:45  雪刚  阅读(848)  评论(0编辑  收藏  举报