mysql master thread_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 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秒操作 :不需要任何前提,设置一个模糊检查点.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值