InnoDB中Master Thread工作方式

void master_thread(){

                      goto loop;

                      loop:

                      for(int i=0;i<10;i++){

                              thread_sleep(1)//sleep 1 second

                              do log buffer flush to disk  #重做日志缓冲刷新到重做日记文件

                              if(last_one_second_ios<5%innodb_io_capacity)    #一秒内的IO次数小于innodb_io_capacity值的5%

                              do merge 5%innodb_io_capacity insert buffer    #合并5%插入缓冲

                              if(buf_get_modified_ratio_pct>innodb_max_dirty_pages_pct)    #缓冲池中脏页比例超过设定的innodb_max_dirty_pages_pct

                              do buffer pool flush 100%innodb_io_capacity dirty page      #从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity

                              else if enable adaptive flush      #如果开启innodb_adaptive_flushing自适应刷新

                              do buffer pool flush desired amount dirty page    #刷新缓冲区所需数量的脏页,由desired amount dirty page决定

                              if(no user activity)    #没有用户活动(数据库空闲)

                              goto backgroud loop      #切换到background loop循环

                              }

                              if(last_ten_second_ios

                              do buffer pool flush 100%innodb_io_capacity dirty page    #从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity

                              do merge 5%innodb_io_capacity insert buffer    #合并5%插入缓冲

                              do log buffer flush to disk    #重做日志缓冲刷新到重做日记文件

                              do full purge    #删除无用的Undo页

                              if(buf_get_modified_ratio_pct>70%)    #缓冲池中脏页比例大于70%

                              do buffer pool flush 100%innodb_io_capacity dirty page    #从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity

                              else

                              do buffer pool flush 10%innodb_io_capacity dirty page    #从缓冲区刷新脏页时,刷新脏页的数量为10%innodb_io_capacity

                              goto loop  #跳回主循环

                              background loop:  #跳转到background loop循环

                              do full purge    #删除无用的Undo页

                              do merge 100%innodb_io_capacity insert buffer  ##合并100%插入缓冲

                              if not idle:      #无用户活动

                              goto loop:    #跳回主循环

                              else:

                              goto flush loop    #跳到flush loop

                              flush loop:

                              do buffer pool flush 100%innodb_io_capacity dirty page  #从缓冲区刷新脏页时,刷新脏页的数量为10%innodb_io_capacity

                              if(buf_get_modified_ratio_pct>innodb_max_dirty_pages_pct)    #缓冲池中脏页比例超过设定的innodb_max_dirty_pages_pct

                              go to flush loop 

                              goto suspend loop  #切换到suspend loop

                              suspend loop:

                              suspend_thread()    #进程挂起

                              waiting event      #等待事件

                              goto loop;

                              }


以上伪代码摘自《MySQL技术内幕:InnoDB存储引擎(第2版)》 — 姜承尧

新版本的InnoDB对于刷新脏页的操作,从Master Thread线程分离到一个单独的Page Cleaner Thread,从而减轻了Master Thread的工作,同时进一步提高了系统的并发性。其余工作原理不变。

你可能感兴趣的:(InnoDB中Master Thread工作方式)