作者:刘仁鹏
参考资料:《MySQL技术内幕:InnoDB存储引擎》
1.四种后台线程
1.Master Thread
- 负责 将缓冲池中的数据异步刷新到磁盘 ,保证数据的一致性。
包括合并插入缓冲、重做日志缓冲写入磁盘、脏页的刷新(在PageCleanerThread中做)、UNDO页的回收(在PurgeThread中做)等。 - Master Thread内部由多个循环组成:主循环(loop)、后台循环(background loop)、刷新循环(flush loop)、暂停循环(suspend loop)
- Master Thread会根据数据库运行的状态在上述循环中进行切换
- 下文中合并插入缓冲和脏页刷新操作中“一定数量”的计算依据来自于innodb_io_capacity参数,该参数由用户设定,表示磁盘IO吞吐量
1.主循环
- 主循环中包含两大部分操作:innodb is not idle时的操作(老版本每秒的操作)和innodb is idle时的操作(老版本每10秒的操作)
1.innodb is not idle时的操作
- 重做日志缓冲写入磁盘,即使该事务未提交(总是)
- 这就是为什么再大的事务,提交时间也很短的原因
- 合并插入缓冲(可能)
- InnoDB会根据当前IO次数判断IO压力大小,若IO压力小,才会合并插入缓冲
- 将一定数量的脏页刷回磁盘(可能)
- 根据产生重做日志的速度,和innodb_max_dirty_pages_pct参数所设阈值,决定是否进行该操作,以及操作的脏页数量
- 若没有用户活动,切到后台循环(可能)
2.innodb is idle时的操作
- 将重做日志缓冲写入磁盘(总是)
- 合并一定数量的插入缓冲(总是)
- 将一定数量的脏页刷回磁盘(总是)
- 删除一定数量无用Undo页(总是)
- 删除数量受innodb_purge_batch_size参数值影响
2.后台循环
- 删除无用Undo页(总是)
- 合并一定数量插入缓冲(总是)
- 若有用户活动,跳回主循环,否则,跳入刷新循环(总是)
3.刷新循环
- 将一定数量的脏页刷回磁盘(总是)
- 跳入暂停循环(总是)
4.暂停循环
- 将Master Thread挂起
- 若有事件发生,跳入主循环(总是)
2.IO Thread
- InnoDB使用了大量 AIO 来处理IO请求以提高性能,IO Thread的主要工作是 处理这些IO请求的回调 。
- write thread
- read thread
- insert buffer thread
- log thread
3.Purge Thread
- 事务被提交后,其所使用的 undolog 可能不再需要,因此需要PurgeThread来 回收已经使用并分配的undo页 。
4.Page Cleaner Thread
- 脏页的刷新。