MySQL(InnoDB剖析):---Master Thread(MySQL后台核心线程)

Master Thread

  • 通过前面介绍InnoDB体系架构我们知道,InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成的,本文就介绍该线程的具体实现以及该线程可能存在的问题

一、InnoDB 1.0.x版本之前的Master Thread

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

主循环(Loop)

  • Loop被称为主循环,因为大多数的操作是在这个循环中,其中有两大部分的操作——每秒钟的操作和每10秒钟的操作
  • 伪代码如下,可以看到
    • loop循环通过thread sleep来实现,这意味着所谓的每秒一次或每10秒一次的操作是不精确的。在负载很大的情况下可能会有延迟只能说大概在这个频率下。当然,InnoDB源代码中还通过了其他方法来尽量保证这个频率

  • 每秒一次的操作如下
    • ①日志缓冲刷新到磁盘,即使这个事务还没有提交(总是):
      • 即使某个事务还没有提交,InnoDB仍然每秒会将重做日志缓冲中的内容刷新到重做日志文件。这一点是必须要知道的,因为这可以很好地解释为什么再大的事务提交(commit)的时间也是很短的
    • ②合并插入缓冲(可能)
      • 合并插入缓冲(Insert Buffer)并不是每秒都会发生的。InnoDB会判断当前一秒内发生的IO次数是否小于5次,如果小于5次,InnoDB认为当前的IO压力很小,可以执行合并插入缓冲的操作
    • ③至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能):
      • 刷新100个脏页也不是每秒都会发生的。InnoDB通过判断当前缓冲池脏页的比例(buf_get_modified_ratio_pct)是否超过了配置文件中innodb_max_dirty_pages_pct这个参数(默认为90,代表90%),如果超过了这个阈值,InnoDB认为需要做磁盘同步操作,将100个脏页写入磁盘
    • 如果当前没有用户活动,则切换到background loop(可能)
  • 根据每秒一次的操作,对主循环的伪代码具体化如下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值