后台线程的主要作用
- 负责刷新内存池中的数据,保证缓冲池中缓存的数据都是最近的数据(较新的热数据)
- 将内存中已加修改的数据刷新磁盘文件
大致可以将线程分为如下四类
I/O thread
我们查看引擎状态:
show engine innodb status
在其中我们可以看到FILE I/O一个板块,其中可以看到10个I/O thread:
其中有insert buffer thread、log thread、read thread、write thread:
- read thread:负责读取操作,将磁盘页从磁盘加载到内存的缓存页中,4个
- write thread:负责写操作,将缓存的脏页刷新到磁盘,4个
- log thread:负责将日志缓冲区中的内容刷新到磁盘,1个
- insert buffer thread:负责将写缓冲区内容(change buffer的DML操作)刷新到磁盘,1个
purge thread
在事务提交之后,其使用的undo日志就不需要了,purge thread会回收已经分配的undo页。
show variables like '%innodb_purge_thread%';
默认4,支持多个purge thread以加快回收undo页速度。
page cleaner thread
作用有两部分,一个是将脏页数据刷新到磁盘,另一个是脏数据刷盘之后,相应的redo log的覆盖。
既可以同步数据,又能达到redo log循环使用的目的。
show variables like '%innodb_page_cleaner%';
默认1,一个线程。
master thread
innodb主线程,作用是负责调度其他线程,优先级最高。
- 脏页的刷新:为了保持数据的一致性,Master Thread会定期将Buffer Pool中的脏页刷新到磁盘。脏页是指被修改过但尚未写入磁盘的数据页。Master Thread会根据脏页的比例和系统的负载情况,动态调整刷新的频率和数量。
- undo页回收
- redo日志刷新:Master Thread会定期将重做日志缓冲中的内容刷新到磁盘,以确保事务的持久性。这种刷新操作是顺序写,因此性能开销相对较小。
- 合并写缓冲区:nnoDB使用插入缓冲来优化非聚集索引的插入操作。Master Thread会定期合并插入缓冲,将缓冲中的数据写入到实际的索引页中,以提高写入性能。
内部有两种操作方式,分别是每隔1秒处理,和每隔10秒处理。
每隔一秒
- 刷新脏页数据到磁盘,当脏页比例达到75%才进行操作
show variables like '%innodb_max_dirty%';
- 合并"写缓冲区(change buffer)"数据:并不是每秒刷新,如果前一秒I/O次数小于5,就认为I/O压力比较小,才会去执行合并写缓冲的操作
- 刷新日志缓冲区到磁盘:即使事务没有提交,innodb也会每秒将重做日志缓冲刷新到重做日志文件中,所以我们大事务提交也不会很慢
每隔十秒
- 刷新脏页数据到磁盘,当脏页比例达到75%才进行操作
- 合并"写缓冲区(change buffer)"数据
- 删除无用的undo页(每隔10秒操作1次)
相关参数
- innodb_flush_log_at_trx_commit:控制日志刷新到磁盘的策略,可以设置为0、1或2,不同的值对应不同的刷新频率和持久性保证。
- innodb_max_dirty_pages_pct:设置Buffer Pool中脏页的最大比例,当脏页比例超过这个值时,Master Thread会更频繁地刷新脏页到磁盘。
- innodb_io_capacity:定义系统的IO能力,用于控制InnoDB的IO操作,可以间接影响Master Thread的IO刷新行为。
参考:
https://blog.csdn.net/qq_26664043/article/details/135821673











网友评论