1.0.x版本之前
Master Thread由多个循环组成
- 主循环(loop)
- 后台循环(backgroup)
- 刷新循环(flush)
- 暂停循环(suspend loop)
master thread根据mysql的状态在不同循环中切换。
主循环(loop)
mysql绝大多数操作都在这个循环中,操作主要根据频率分为两类:每秒进行的操作和每10秒进行的操作。该时间间隔是不准确的,随着负载增大会出现较大的延迟。
每秒的操作:
- 将日志缓冲刷新到磁盘(总是)
- 合并插入缓冲(可能)
- 刷新至多100个脏页到磁盘(可能)
- 当前没有用户活动,切换到backgroup状态(可能)
刷新日志缓冲到日志重做文件,即使事务没有提交。
前一秒io操作小于5次,则认为数据库空闲,执行插入缓冲合并
判断脏页占比,超过innodb_max_dirty_pages_pct(默认90,即90%),则将脏页写入磁盘。
每10秒进行的操作: - 刷新100个脏页到磁盘(可能)
- 合并至多5个插入缓冲(总是)
- 将日志缓冲写到磁盘(总是)
- 删除无用的undo页(总是)
- 刷新100或10个脏页到磁盘(总是)
如果前10秒磁盘的io操作小于200次,那么mysql认为磁盘io是有空闲的,此时会将至多100个脏页刷新到磁盘并合并插入缓冲。
mysql会执行full purge操作,即删除至多20个无用的undo页。
之后mysql会判断脏页在缓冲池中的占比,若大于70%则再刷新100个,否则只刷新10%到磁盘。
backgroup loop
- 删除无用的页(总是)
- 合并20个插入缓冲(总是)
- 跳回主循环(总是)
- 不断刷新100个页(可能)
1.2.x版本之前
1、增加innodb_io_capacity参数设定磁盘io代替硬编码,从而适应高性能硬盘(固态、raid)
2、合并插入缓冲时,插入innodb_io_capacity的5%.
3、刷新脏页时,每次刷新innodb_io_capacity个
4、innodb_max_dirty_pages_pct(脏页占内存池的占比)默认值由90%改为75%。
5、增加参数innodb_adaptive_flushing(自适应刷新),当大于innodb_max_dirty_pages_pct时自适应刷新脏页数量到磁盘中。
6、增加参数innodb_batch_size用于控制每次合并插入缓冲那个的数量,默认20。
1.2.x之后
增加独立的Page Cleaner Thread线程能够用于刷新脏页,减轻master thread的负担。