观《MYSQL技术内内幕 InnoDB存储引擎 第2版》(2.5) —— Master Thread工作方式

Master Thread 是核心的后台线程。

InnoDB 1.0.x 版本之前(MySQL 5.1 之前): 

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

  主循环(loop):大多数操作都在这个循环中,通过 thread sleep 实现每秒钟的操作和每10秒钟的操纵。

    每秒一次的操作:

      1.日志刷新到磁盘(总是)

      2.合并缓冲插入(会对前一秒的 IO 进行查询,小于5次 压力小,进行合并缓冲插入操作)

      3.最多刷新100个 InnoDB 缓冲池中的脏页到磁盘。(判断当前缓冲池中脏页比例(buf_get_modified_ratio_pct)是否超过文件中配置的(innodb_max_dirty_pages_pct,默认90),超过则进行操作)

      4.如果当前没有用户活动,切换到background loop。

    每10秒一次的操作:

      1.刷新100个脏页到磁盘(判断前10秒 IO操作是否少于200次,是则将100个脏页刷新到磁盘)

      2.合并最多5个插入缓冲(总是)

      3.将日志缓冲刷新到磁盘(总是)

      4.删除最多20个无用 undo 页(总是,执行pull perge操作,当 update 或 delete 时,原先的行被标记为删除,为了满足一致性读要求,判断事务系统中被修改的行能删除时,进行删除 )

      5.刷新100个或者10个脏页到磁盘(总是,如果缓冲池中脏页比例超过70%,刷新100个,若小于刷新10个)

  后台循环(background loop):当没有用户活动或数据库关闭后,切换到此线程。

    1.删除无用 undo 页(总是)

    2.合并20个插入缓冲(总是)

    3.跳回主循环(总是)

    4.不断刷新100个页直到符合条件(可能跳转到 刷新循环(flush loop)完成)

  当 刷新循环中 无事,InnoDB 会切换到 暂停循环,将 Master Thread 挂起,等待事件。

InnoDB 1.2.x 版本之前(MySQL 5.1 ~ 5.6):

  磁盘的发展,InnoDB 的一些规定限制了磁盘IO性能。

  引入配置 innodb_io_capacity ,表示磁盘IO吞吐量,默认200。合并插入缓冲时,数量是它的5%;缓冲区刷新脏页时,数量是它。

  修改 innodb_max_dirty_pages_pct,原默认值为90,只有缓冲池中的脏页比例超过90%,才进行刷新。修改默认值为75。

  引入配置 innodb_adaptive_flushing(自适应刷新),影响每秒刷新脏页的数量。不仅判断脏页比例,还会根据 重做日志的速度决定最合适的刷新脏页数量。

  引入配置 innodb_purge_batch_size,控制每次 full purge 回收的 undo 页数量。

InnoDB 1.2.x 版本(MySQL 5.6 及之后):

  从 Master Thread 中分离刷新脏页操作到 Purge Cleaner Thread。  

上一篇:Oracle使用LOOP循环的用法大全


下一篇:RF关键字使用