Mysql Master Thread线程工作原理

2021/9/4 2:07:35

本文主要是介绍Mysql Master Thread线程工作原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

InnoDB1.0.x版本之前

Master Thread具有最高的线程优先级别,内部由多个循环组成主循环(loop)后台循环(backgroud)刷新循环(flush)暂停循环(suspend),Master Thread会根据数据库运行的状态在这几个循环中切换。
loop主循环

大多数的操作是在这个循环中进行的,其中有两大部分的操作——每秒钟和每十秒的操作。每秒钟和每十秒的操作是不精确的,在负载很大的情况下可能会有延迟,只能说大概在这个频率下。
每秒一次的操作包括:

    日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)
    事务没有提交,InnoDB仍然每秒会将重做日志缓冲中的内容刷新到重做日志文件,这可以很好的解释大事务提交时间短的原因。
    合并插入缓冲(可能)
    合并插入缓冲(Insert Buffer)并不是每秒都会发生的。InnoDB会判断前一秒的IO次数是否小于5次,小于则进行合并缓冲的操作。
    至多刷新100个InnoDB的缓冲池的脏页到磁盘(可能)
    不是每秒都会发生,InnoDB会判断当前缓冲池中脏页的比例是否超过了配置文件中的参数(innodb_max_dirty_pages_pct),如果 超过了这个法治,InnoDB会认为需要做磁盘同步的操作,将100个脏页写入磁盘中。
    如果当前没有用户活动,则切换到background loop(可能)
    每十秒的操作包括:
    刷新100个脏页到磁盘(可能)
    InnoDB会判断过去10秒钟内磁盘到IO操作是否小于200次,如果是,InnoDB将100个脏页刷新到磁盘。
    合并至多5个插入缓冲(总是)
    InnoDB会合并插入缓冲。
    将日志缓冲刷新到磁盘(总是)
    InnoDB在进行一次将日志缓冲刷新到磁盘的操作,这和每秒一次时发生的操作是一样的。
    删除无用的undo页(总是)
    InnoDB会执行full purge操作,删除无用的Undo页。InnoDB会判断当前事务系统中已被删除的行是否可以删除,如果可以,立即删 除。在执行full purge操作时,每次最多尝试回收20个undo页。
    刷新100个或者10个脏页到磁盘(总是)
    InnoDB会判断缓冲池中脏页的比例,如果有超过70%的脏页,则刷新100页脏页到磁盘,如果小于70%,只需要刷新10%磁盘。

brackground loop后台循环

当没有用户活动或者数据库关闭,就会切换到此循环。循环会执行以下操作:

    删除无用的Undo页(总是)
    合并20个插入缓冲(总是)
    跳回道主循环(总是)
    不断刷新100个页直到符合条件(可能,跳转到flush loop中完成)

flush loop刷新循环

如上所属,不断刷新脏页的循环。如果这个循环没什么事情可做了,则会切换到suspend暂停循环
suspend loop暂停循环

将master Thread线程挂起,等待事件发生。若用户启动了InnoDB存储引擎,却没有使用任何InnoDB存储引擎的表,那么Master Thread总是处于挂起的状态。
InnoDB1.2.x 版本之前

1.0.x存储引擎对IO其实是有限制的,当固态硬盘出现时,这种规定在很大程度上限制了InnoDB存储引擎对磁盘IO的性能,尤其是写入性能。换句话说,不能发挥硬盘的优势。比如1.0.x版本硬编码就要去刷新100个脏页,那么现在磁盘完全可以支持一秒内1000个页进行刷新,导致Master Thread忙不过来。同时,当发生宕机需要恢复时,由于很多书籍还没有刷新回磁盘,会导致恢复时间可能需要很久,尤其是insert buffer。
第一个参数百分比参数(innodb_io_capacity)

    在合并插入缓冲时,合并插入缓冲的数量为innodb_io_capacity值的5%
    在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity。
    另一个参数是innodb_adaptive_flushing(自适应地刷新),也就是说当脏页的比例小于innodb_max_dirty_pages_pct时,也会刷新一定量的脏页。
    另一个参数是inndb_purge_barch_size,该参数可以控制每次full purge回收的Undo页的数量。参数值默认20。

InnoDB1.2.x版本

再次对Master Thread优化,从Master Thread线程分离到一个Page Cleaner Thread,减轻了Master Thread的工作,同时进一步提高了系统的并发性。
————————————————
版权声明:本文为CSDN博主「墨迹程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liujiancheng521/article/details/117397743



这篇关于Mysql Master Thread线程工作原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程