Mysql的后台线程包括Master Thead, IO Thread, Purge Thread及Page Clean Thread四种。下面我们分别讲述这几种类型的后台线程。
一. Master Thread
Master Thread是拥有最高优先级的后台线程。主要负责将缓冲池中的数据异步刷新到磁盘中,保证数据的一致性,包括脏页的刷新,合并插入缓冲,UNDO页的回收等。内部有多个循环组成,分别为主循环(loop),后台循环(background loop),刷新循环(flush loop),暂停循环(suspend loop)。Master Thread会根据运行状态在这几个循环中进行进行切换。Loop被称为主循环,大多数的操作都是在这个循环中被执行,在这个循环中,有两大部分操作:1.每秒钟的操作 2.每十秒钟的操作。loop循环通过thread sleep来实现循环,负载很大的情况下可能会有延迟。
1.每秒执行一次的操作包括:
(1)日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)
(2)合并插入缓冲
合并插入缓冲并不是每次都会发生, innodb存储引擎会判断上一秒发生的IO次数是否小于5次,如果小于5次则认为当前的IO压力很小,可以进行合并插入缓冲的操作。合并插入缓冲的数量为 innodb_io_capacity参数的5%.
(3)刷新缓冲池中的脏页到磁盘(可能)
刷新100个脏页并不是每秒都会发生,InnoDB存储引擎会判断当前缓冲池中脏页的比例是否超过配置文件中innodb_max_dirty_page_pct这个参数(默认75%,1.0版本时默认90%),如果超过阈值,Innodb引擎会做磁盘同步的操作,将脏页写入磁盘。写入磁盘的脏页数量为innodb_io_capacity参数指定的数量。当缓冲池中脏页比例小于innodb_max_dirty_page_pct时,会根据innodb_adaptive_flush参数及buf_flush_get_desired_flush_rate函数来判断需要刷新脏页最合适的数量,该函数通过判断产生重做日志(redo log)的速度来决定最合适的刷新脏页数量。
(4)如果当前没有用户活动,则切换到backgroud loop
2.每十秒执行一次的操作包括
(1)刷新100个脏页到磁盘(可能)
InnoDB存储引擎会判断过去10秒之内磁盘的IO是否小于200次,如果小于200次,则认为当前有足够的磁盘处理能力,因此将100个脏页刷新到磁盘。
(2)合并至多5个插入缓冲(总是)
(3)将日志缓冲刷新到磁盘(总是)
(4)删除无用的Undo页(总是)
InnoDB存储引擎会执行full purge操作,即删除无用的Undo页。
(5)刷新100个或者10%脏页到磁盘(总是)
InnoDB存储引擎会判断缓冲池中脏页的比例,如果有超过70%的脏页,则刷新100个脏页到磁盘。如果脏页比例小于10%,则只需要刷新10%的脏页到磁盘。
3.Background线程执行的操作
当前没有用户活动(数据库空闲时)或者数据库关闭,就会切换到background loop
(1)删除无用的Undo页(总是)
(2)合并20个插入缓冲(总是)
(3)跳回到主循环(总是)
(4)不断刷新100个页,直到符合条件(可能,跳到flush loop中完成)
4.Suspend loop
若flush loop页也没有什么事情可以做了,InnoDB存储引擎会切换到suspend loop,将Master线程挂起,等待事件发生。若用户启用了InnoDB引擎,却没有使用任何InnoDB存储引擎的表,那么 Master Thread始终处于挂起状态。
知识小贴士:作者尽心运营的知识星球社群【请点击:简道源码&&架构分析 加入】(可添加运营同学wx:wx454876882)持续拉新中...,定期的jdk与核心框架源码解析,主流行业解决方案与架构设计资料查阅与下载尽在其中。帮助行业新人和有志于技术的专业人士体系化的学习源码与系统架构,获取业界知名技术峰会和厂商对外公布的主流业务场景的解决方案。同时这个星球也是一个社群,大家可以在社群中结识有识之士,共同探讨,答疑解惑。希望可以通过这个星球帮助大家每日进步一点点,一年持续365天,共勉
本星球 聚焦于Java源码分析,架构解析。低代码,可扩展和高可用架构设计。帮助你更好地学编程,欢迎想进步的同学!仅精品案例的资料整理即物超所值。让我们大家一起每日进步一点点~~,你可以:
1. 阅读星球专属的编程知识和优质文章
2.JAVA知识从点和面,深度挖掘。通过点,形成面。提升自身的技术广度和深度。
3. 加入星球专属交流群,帮你找到学习伙伴、获取每日优质文章推送等
4.业界优秀案例资料学习及下载
5. 和伙伴们一起学习打卡,增加动力,共同进步
6.工作、学习和方法论。如何提升软实力,比如写文章、画架构图、技术产品的营销、社区的运营等等。
7.招聘、面试和晋升。如何提前准备面试,有什么套路?如何提升硬实力,少走弯路?
8.提供简历优化服务哟。本人常年招聘,也就面试了1000+程序员和架构师~~
9.解答你的疑问。
10.每日进步一点点(最重要的一点): 让自己与众不同,每天学习1-2小时源码和架构知识,365天后再回首,1年前的自己可能是个SB吧。用通勤的时间让自己成长,让优秀变成一种习惯。
————————————————
版权声明:本文为优快云博主「大道化简」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/sunhuiliang85/article/details/104743186