后台线程
- Master Thread: 非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。包括脏页的刷新、刷盘redo、合并插入缓冲和undo页的回收等
- IO Thread: InnoDB中大量使用了异步IO,IO Thread主要负责这些IO请求的回调处理。分有write、read、insert buffer和log Thread
- Purge Thread:InnoDB 1.1加入,回收undo页,减轻Master Thread负担
- 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:
- InnoDB1.0.x之前的Master Thread做了许多硬编码,把参数写死了,InnoDB1.0.x开始提供了参数innodb_io_capacity,默认值200
- 在合并插入缓冲时,合并的数量为innodb_io_capacity的5%
- 刷新脏页时,刷新脏页的数量为innodb_io_capacity
- innodb_max_dirty_pages_pct默认值从90调为75
- 新增参数innodb_adaptive_flushing(自适应地刷新,默认为on,打开),通过redo log的产生速度决定最合适的刷新脏页数量,当脏页比例小于innodb_max_dirty_pages_pct时也会刷新一定量的脏页
- 新增参数innodb_purge_batch_size,默认值20,每次回收undo页的数量由该值决定
- 当数据库压力大时,Master Thread的主循环并不总是等待一秒,会加快速度
InnoDB1.2.x版本的Master Thread:
刷新脏页的操作分离到单独的Page Cleaner Thread线程