欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL后台线程整理总结

程序员文章站 2022-06-12 14:15:50
本文整理自《MySQL技术内幕 InnoDB存储引擎》 MySQL通过后台各种线程、内存池、文件交互来实现对外服务的,不同线程实现不同的资源操作,各个线程相互协助,共同来完成数据库的服务。以下简单总结MySQL的一些后台线程以及主要作用,以及innodb引擎的变化升级情况。 整体上看,MySQL的后 ......

 本文整理自《MySQL技术内幕 InnoDB存储引擎》

 

MySQL通过后台各种线程、内存池、文件交互来实现对外服务的,不同线程实现不同的资源操作,各个线程相互协助,共同来完成数据库的服务。
以下简单总结MySQL的一些后台线程以及主要作用,以及innodb引擎的变化升级情况。

整体上看,MySQL的后台线程概括如下,分为master thread,IO thread,purge thread,page cleaner thread

MySQL后台线程整理总结

 

这其中,Master Thread是MySQL的最核心的线程,其中实现了多种功能,同时也在不断地改进与优化。
InnoDB 1.2.X之前版本的Master Thread主要工作内容,
如下是伪代码来描述 Master Thread

MasterThread
{

    //每1秒一次操作涉及的行为
    PerSecondOperation()
    {
        1,刷新redo日志缓冲到磁盘,不管是否提交(总是)
      属于master thread中的checkpoint实现
2,合并插入缓冲(可能),根据一秒之内发生的IO次数,如果小于5,则执行合并插入缓冲的操作
3,最多刷新100个Innodb缓冲池中的脏页到磁盘(可能), if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct>buf_get_modified_ratio_pct)   执行刷新100个脏页到磁盘
     4. checkpoint
5,如果当前没有用户活动,切换到background模式 } //每10秒一次操作涉及的行为 TenSecondOperation() { 1,刷新100个Innodb缓冲池中的脏页到磁盘(可能), 判断过去10秒之内IO操作是否小于200次,如果是,刷新100个脏页到磁盘------>硬编码
2,合并最多5个插入缓冲(总是),无条件,总是执行合并最多5个插入缓冲
3,日志缓存刷新到磁盘(总是)
4,删除无用的undo页(总是),每次最多尝试回收20个页---->硬编码
5,刷新100或者10个脏页到磁盘(总是):---->硬编码 脏页比例>70%==>刷新100个脏页到磁盘, 脏页比例<70%==>刷新10个脏页到磁盘
     6. checkpoint
  } 
  //BackgroundOperation线程
  BackgroundOperation()
  { 1,删除无用的Undo页(总是)
2,合并20个插入缓冲(总是)
3,跳回到主循环(总是)
4,不断刷线100个直到page到磁盘,直到满足(脏页小于参数buf_max_dirty_pages_pct)。 } }

不难发现,InnoDB 1.2.X之前的版本写死了很多参数,
InnoDB 1.2.X之后版本的Master Thread根据实际情况,灵活地增加了一些配置参数,尤其是与IO有关的innodb_io_capacity参数。
innodb_io_capacity表示物理存储的IO能力,在后台线程与物理存储IO交互的时候,由于不同的存储设备有不同的IO处理能力,
innodb_io_capacity就表示物理存储的IO处理能力的参,默认值是200
通过根据实际存储情况对innodb_io_capacity的配置,可以最大化地提高MySQL服务器的处理性能。

MasterThread
{

    1,增加参数innodb_io_capacity,合并插入缓冲=innodb_io_capacity*5%;刷新脏页数量=innodb_io_capacity
    2,buf_max_dirty_pages_pct默认值修改为75%
    3,innodb_purge_batch_size,回收undo页的配置,默认值20


    //每1秒一次操作涉及的行为
    PerSecondOperation()
    {
        1,刷新redo日志缓冲到磁盘,不管是否提交(总是)
           属于master thread类型的checkpoint

        2,合并插入缓冲(可能),根据一秒之内发生的IO次数:
           if(过去1秒钟的ios<5%innodb_io_capacity)
           {    
               执行合并5%innodb_io_capacity个page的插入缓冲的操作
           }

        3,刷新缓冲池中的脏页到磁盘(可能):
           if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct)
                刷新脏页个数:100%*innodb_io_capacity
           if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct)
                刷新脏页个数:10%*innodb_io_capacity
     4. checkpoint
      
        5,如果当前没有用户活动,切换到background模式

    }
    //每10秒一次操作涉及的行为
    TenSecondOperation()
    {
    
        1,刷新缓冲池中的脏页到磁盘(可能):
           if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct)
                刷新脏页个数:100%*innodb_io_capacity
           if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct)
                刷新脏页个数:10%*innodb_io_capacity

        
        2,合并插入缓冲(可能),根据过去一秒之内发生的IO次数:
            if(ios<5%innodb_io_capacity)
            {    
                执行合并5%innodb_io_capacity个page的插入缓冲的操作
            }

        3,日志缓存刷新到磁盘(总是)
        
        4,删除无用的undo页(总是)
           根据参数:innodb_purge_batch_size

     5. checkpoint     
} BackgroundOperation() { 1,删除无用的Undo页(总是)

2,合并innodb_io_capacity个插入缓冲(总是)
3,跳回到主循环(总是)
4,不断刷线innodb_io_capacity个page到磁盘,直到满足(脏页小于参数buf_max_dirty_pages_pct)。 } }

独立的page cleaer thread

PageCleanerThread()
{
    
    1,刷新缓冲池中的脏页到磁盘(可能):
        if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct)
            刷新脏页个数:100%*innodb_io_capacity
        if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct)
            刷新脏页个数:10%*innodb_io_capacity
}

 

6. checkpoint