InnoDB存储引擎——Master Thread工作方式

Master Thread是InnoDB存储引擎的核心线程,负责数据一致性,包括脏页刷新、插入缓冲合并、UNDO页回收等。文章详细介绍了1.0.x和1.2.x版本前后的Master Thread工作方式,包括不同版本中的循环逻辑、参数调整以及如何适应不同的IO能力,以提高性能和并发性。
摘要由CSDN通过智能技术生成

Master Thread是InnoDB存储引擎非常核心的一个后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO页的回收等。

InnoDB 1.0.x版本之前的Master Thread

Master Thread具有最高的线程优先级别。内部由多个循环组成:主循环(loop)、后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop)。Master Thread会根据数据库运行的状态在loop、backgroup loop、flush loop和suspend loop中进行切换。

loop是主循环,大多数的操作都在这个循环中,主要有两大部分的操作——每秒钟的操作和每10秒钟的操作。伪代码如下:

void master_thread()
{
    loop:
    for(int i = 0; i < 10; ++i){
        do thing once per second;
        sleep 1 second if necessary;
    }
    do things once per ten seconds;
    goto loop;
}

每秒一次的操作包括:
1)日志缓冲刷新到磁盘,即使这个事务还没有提交(总是);
2)合并插入缓冲(可能);
3)至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能);
4)如果当前没有用户活动,则切换到background loop(可能);

即使某个事务还没有提交,InnoDB存储引擎仍然每秒会将重做日志缓冲中的内容刷新到重做日志文件。这也解释了为什么再大的事务提交的时间也是很短的。

合并插入缓冲并不是每秒都会发生的。InnoDB存储引擎会判断当前一秒内发生的IO次数是否小于5次,如果小于5次,InnoDB存储引擎认为当前的IO压力很小,可以执行合并插入缓冲的操作;

刷新100个脏页也不是每秒都会发生的,InnoDB存储引擎通过判断当前缓冲池中脏页的比例(buf_get_modified_ratio_pct)是否超过了配置文件中
innodb_max_dirty_pages_pct这个参数(默认是90,代表90%),如果超过了这个值,InnoDB存储引擎则认为需要做磁盘同步的操作,将100个脏页写入磁盘中。

综上所述,伪代码可以进一步具体化。

void master_thread()
{
    loop:
    for(int i = 0; i < 10; ++i){
        thread_sleep(1);
        do log buffer flush to disk;
        if(last_one_second_ios < 5)
            do merge at most 5 insert buffer;
        if(buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct)
            do buffer pool flush 100 dirty page;
        if(no user activity)
            goto backgroud loop;
    }
    do things once per ten seconds;
    backgroud loop;
    do something;
    goto loop;
}

每10秒的操作主要是下面几个方面:
1)刷新100个脏页到磁盘(可能)
2)合并至多5个插入缓冲(总是)
3)将日志缓冲刷新到磁盘(总是)
4)删除无用的Undo页(总是)
5)刷新100个或者10个脏页到磁盘(总是)

在以上过程中,InnoDB存储引擎会先判断过去10秒之内磁盘的IO操作是否小于200次,如果是,InnoDB存储引擎认为当前有足够的磁盘IO能力,因此将100个脏页刷新到磁盘。

接着ÿ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值