后台线程

  1. Master Thread: 非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。包括脏页的刷新、刷盘redo、合并插入缓冲和undo页的回收等
  2. IO Thread: InnoDB中大量使用了异步IO,IO Thread主要负责这些IO请求的回调处理。分有write、read、insert buffer和log Thread
  3. Purge Thread:InnoDB 1.1加入,回收undo页,减轻Master Thread负担
  4. Page Cleaner Thread:InnoDB 1.2.x版本中加入,刷新脏页,减轻Master Thread负担

InnoDB 1.0.x 版本之前的Master Thread:

由多个循环(loop)组成:主循环(loop)、后台循环(background loop)、刷新循环(flush loop)、暂停循环(suspend loop)

  • 主循环(loop):

每秒的操作:日志缓冲刷新到磁盘(总是,即使这个事务还没提交)

合并插入缓冲(如果前一秒内的IO次数小于5次才执行这个操作)

至多刷新100个脏页到磁盘(脏页比例超过innodb_max_dirty_pages_pct(默认90,代表90%)的话执行这个操作)

切换到background loop循环(如果当前没有用户活动的话)

每十秒的操作:刷新100个脏页到磁盘(如果过去十秒内的IO次数少于200次的话)

合并至多5个插入缓冲(总是)

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

删除无用的undo(总是,最多尝试回收20个)

刷新100个或者10个脏页到磁盘(总是,如果脏页比例超过70%,刷100个,否则刷10个)

  • 后台循环(background loop):

删除无用的undo(总是)

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

切换到flush loop循环(如果当前空闲的话)

跳回到主循环(如果当前不空闲的话)

  • 刷新循环(flush loop):

不断刷新100个脏页直到脏页比例小于innodb_max_dirty_pages_pct

切换到suspend loop循环

  • 暂停循环(suspend loop):

将Master Thread挂起,等待事件发生,有事件发生切换到loop主循环

InnoDB1.2.x版本之前的Master Thread:

  1. InnoDB1.0.x之前的Master Thread做了许多硬编码,把参数写死了,InnoDB1.0.x开始提供了参数innodb_io_capacity,默认值200
    • 在合并插入缓冲时,合并的数量为innodb_io_capacity的5%
    • 刷新脏页时,刷新脏页的数量为innodb_io_capacity
  2. innodb_max_dirty_pages_pct默认值从90调为75
  3. 新增参数innodb_adaptive_flushing(自适应地刷新,默认为on,打开),通过redo log的产生速度决定最合适的刷新脏页数量,当脏页比例小于innodb_max_dirty_pages_pct时也会刷新一定量的脏页
  4. 新增参数innodb_purge_batch_size,默认值20,每次回收undo页的数量由该值决定
  5. 当数据库压力大时,Master Thread的主循环并不总是等待一秒,会加快速度

InnoDB1.2.x版本的Master Thread:

刷新脏页的操作分离到单独的Page Cleaner Thread线程