MySQL后台线程整理总结

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

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

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

这其中,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,如果当前没有用户活动,切换到background模式
    }

    //每10秒一次操作涉及的行为
    TenSecondOperation()
    {
        1,刷新100个Innodb缓冲池中的脏页到磁盘(可能),
           判断过去10秒之内IO操作是否小于200次,如果是,刷新100个脏页到磁盘------>硬编码
        2,合并最多5个插入缓冲(总是),无条件,总是执行合并最多5个插入缓冲
        3,日志缓存刷新到磁盘(总是)
        4,删除无用的undo页(总是),每次最多尝试回收20个页---->硬编码
        5,刷新100或者10个脏页到磁盘(总是):---->硬编码
            脏页比例>70%==>刷新100个脏页到磁盘,
            脏页比例<70%==>刷新10个脏页到磁盘
    }

    //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,如果当前没有用户活动,切换到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
    }

    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
}

原文地址:https://www.cnblogs.com/wy123/p/9203254.html

时间: 2024-08-02 04:11:14

MySQL后台线程整理总结的相关文章

MySQL后台线程的清理工作

后台清理工作:脏页刷盘.undo回收 1.page cleaner thread:刷新脏页 2.purge thread:清空undo页.清理"deleted"page 一.innodb_page_cleaners page cleaner线程从buffer pool中刷脏页的线程数量. 1.5.7新特性 1.5.6版本以前,脏页的清理工作交由master线程的: 2.Page cleaner thread是5.6.2引入的一个新线程(单线程),从master线程中卸下buffer p

MySQL InnoDB后台线程threads详解

master thread 核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新.合并插入缓冲.undo页的回收等.Master thread在主循环中,分两大部分操作,每秒钟的操作和每10秒钟的操作:每秒一次的操作包括:1.日志缓冲刷新到磁盘,即使这个事务还没有提交(总是),这点解释了为什么再大的事务commit时都很快:2.合并插入缓冲(可能),合并插入并不是每秒都发生,InnoDB会判断当前一秒内发生的IO次数是否小于5,如果是,则系统认为当前的IO压力

InnoDB存储引擎——后台线程

1.InnoDB存储引擎概述 InnoDB存储引擎是第一个完整支持ACID事务的MySql存储引擎,其特点是行锁设计.支持MVCC.支持外键.提供一致性非锁定读,同时被设计用来最有效地利用以及使用CPU和内存. 2.InnoDB体系结构 上图是InnoDB存储引擎的体系结构,可以看到InnoDB存储引擎有很多内存块,这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构: 缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存. 重做日志

java 守护线程整理

java中finally语句不走的可能存在system.exit(0)与守护线程 线程sleep采用TimeUnit类 设定线程的名字thread.getcurrentThread().setName() 设定守护线程thread.getcurrentThread().setDaemon(true) http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275268.html 守护线程在没有用户线程可服务时自动离开,在 Java中比较特殊的线程

后台线程,优先级,sleep,yield

1.后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可获取的部分.当所有非后台线程结束时,程序也就 终止了,同时会杀死进程中所有后台线程.main()是一个非后台线程 设置后台线程:必须在启动线程之前调用setDaemon(true) 2.通过setPriority修改优先级,注意,优先级较低的线程仅仅是执行的频率较低 3.yield让步,例如,当你的工作已经做完,可以让其他的线程使用cpu,通过调用yield()方法.当调用此方法时,也只是在建议具有相同

后台线程(守护线程)

有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务,这种线程被称为“后台线程”(Daemon Thread),又称为“守护线程”. 典型的后台线程是定时器”Timer"线程,他负责将固定的时间间隔发送给其他的线程. 后台线程经常用于任务结束时的善后处理.另外,后台线程的优先级要比其他的线程优先级低. 和后台线程相比,一般的线程称为“用户线程”.如果一个应用中只有后台线程在运行,JVM将退出该应用程序. 可以通过setDaemon(boolean d)来将一个普通的线程设置为后台线程.用

java 线程返回值,优先级,后台线程 示例代码

ava 线程返回值,休眠,优先级,后台线程  示例代码 package org.rui.thread.basic; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execu

C#前台线程与后台线程的区别和联系 (转)

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出:而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束. .net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止.主线程就是一个前台线程.而后台线程不管

winform 后台线程更新UI

//后台线程更新TextBox private void SetTextBox(TextBox txt, string value) { Action act = () => { txt.Text = value; }; if (txt.InvokeRequired) { txt.Invoke(act); } else { act(); } } private void TestThread() { int i = 0; while (true) { Thread.Sleep(1000); i+