MySQL后台线程详解

news2024/10/7 11:32:09

前言

MySQL的服务实现通过后台多个线程、内存池、文件交互来实现对外服务的,不同线程实现不同的资源操作,各个线程相互协助,共同来完成数据库的服务。本章简单总结MySQL的一些后台线程以及主要作用。 本章收录在MySQL性能优化+原理+实战专栏,更多优质内容点击此处查看。

在这里插入图片描述InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。主要分为:Master ThreadIO ThreadPurge ThreadPage Cleaner Thread

目录

  • 一、Master Thread
  • 二、IO Thread
  • 三、Purge Thread
  • 四、Page Cleaner Thread

一、Master Thread

Master Thread具备最高的线程优先级。其内部有

  • 主循环(loop)
  • 后台循环(backgroup loop)
  • 刷新循环(flush loop)
  • 暂停循环(suspend loop)

多个循环(loop)组成。Master Thread会根据数据库的状态在这些循环之间切换。Loop被称为主循环,因为大多数的操作都是在这个循环中,其中有两大部分的操作:每秒钟的操作每10秒的操作

每秒钟的操作包含以下内容:

  • 重做日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)
  • 合并插入缓冲(可能)
  • 至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)
  • 如果当前没有用户活动,这切换到BackGround loop(可能)

我们简单的解读一下“每秒中的操作”:

即使某个事务还没有提交,InnoDB存储引擎仍然每秒会将重做日志缓冲中的内容刷新到重做日志文件。这可以很好的解释为什么再大的事务提交的时间也是很短的。

合并插入缓冲并不是每秒都会发生的。InnoDB存储引擎会判断当前一秒内发生的IO次数是否小于5次,如果小于5次,InnoDB认为当前IO的压力很小,可以执行合并插入缓冲的操作。

刷新100个脏页也不是每秒都会发生的。InnoDB通过判断当前缓冲池中脏页的比例(buf_get_modified_ratio_pct)是否超过了配置文件中的最大脏页的百分数innodb_max_dirty_pages_pct这个动态参数,如果超过了这个阈值,InnoDB认为需要做磁盘同步的操作,将100个脏页写入磁盘中,这个参数不建议调整。

mysql> show variables like '%innodb_max_dirty_pages_pct%';
+--------------------------------+-----------+
| Variable_name                  | Value     |
+--------------------------------+-----------+
| innodb_max_dirty_pages_pct     | 90.000000 |
| innodb_max_dirty_pages_pct_lwm | 10.000000 |
+--------------------------------+-----------+
2 rows in set (0.01 sec)

每10秒的操作包含以下内容:

  • 刷新100个脏页到磁盘(可能的情况下)
  • 合并至多5个插入缓冲(总是)
  • 删除无用的undo页(总是)
  • 刷新100个或者10个脏页到磁盘(总是)

我们来解读一下“每十秒操作”的整个过程:

首先InnoDB会先判断过去十秒之内磁盘的IO操作是否小于200次,如果是,InnoDB认为当前有足够的磁盘IO操作能力,因此将100个脏页刷新到磁盘。

接着,InnoDB会合并插入缓冲。不同于“每秒一次操作”时可能发生的合并插入缓冲操作,这次的合并插入缓冲一定会发生。之后,InnoDB会再进行一次重做日志缓冲刷新到磁盘的操作。

接着InnoDB会进行一步执行full purge的操作,即删除无用undo页。但是在删除前会判断是否有查询操作需要读取之前版本的undo信息,如果没有,这可以删除,但每次最大回收20个undo页。

然后,InnoDB会判断缓冲池中脏页的比例(buf_get_modified_ratio_pct),如果有超过70%的脏页,则刷新100个脏页到磁盘,如果脏页比例小于70%,则只需刷新10个脏页到磁盘。

若当前没有用户活动(数据库空闲时)或者数据库关闭,就会切换到background loop执行以下下操作:

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

若flush loop中也没有什么事情可以做了,InnoDB会切换到suspend_loop,将Master Thread 挂起,等待事件发生。若用户启用了InnoDB引擎,但是没有创建InnoDB的表,那么Master Thread总是处于挂起状态。

简单总结一下这四种循环的切换过程:

首先会进入主循环,执行每一秒操作和每十秒操作,其中先循环执行每一秒操作的逻辑,当计算器大于等于10时,就进入每十秒操作的逻辑,然后在跳回到“每一秒操作”的逻辑,一直这样循环下去,直到没有用户活动或数据库关闭,会跳到background loop的执行逻辑。

接着background loop的逻辑执行完毕,如果有用户活动,这跳入主循环;如果没有用户活动,则跳到flush loop循环。

接着flush loop的逻辑执行完毕,会跳入suspend_loop(暂停循环)。

最后暂停循环中会将Master Thread挂起,等待事件唤醒。 有新的事件发生时,MasterThread被唤醒,重复1~4的步骤。

以上的逻辑是InnoDB1.0.x版本之前中Master Thread的执行逻辑,在后来的1.0.x和1.1.x版本中对Master Thread的功能做了一些优化,来提升Master Thread的执行效率,进行提升InnoDB的性能,主要优化内容如下:

从之前的版本中我们可以看出,无论何时,InnoDB最大只会刷新100个脏页,合并20个插入缓冲,这是硬编码的。但是随着固态硬盘的出现大大提升了磁盘的写入性能,如果每次刷新脏页和合并插入缓冲的数量不变的话,就会造成磁盘写性能的浪费。特别是对于写入密集的应用程序,每秒可能会产生大于100个的脏页,如果是产生大于20个插入缓冲的情况,Master Thread似乎会“忙不过来”,或者说它总是做得很慢。同时,当发生宕机需要恢复时,由于很多数据还没有刷新回磁盘,会导致恢复的时间可能需要很久,尤其是对于insert buffer来说。

因此从InnoDB1.0.x开始,提供了动态变量innodb_io_capacity,来表示磁盘IO的吞吐量,默认为200。执行规则如下:

  • 在合并插入缓冲时,合并插入缓冲的数量为innodb_io_capacity值为5%;
  • 在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity.
mysql> show variables like '%innodb_io_capacity%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_io_capacity     | 200   |
| innodb_io_capacity_max | 2000  |
+------------------------+-------+
2 rows in set (0.00 sec)

当用户采用SSD或其它提高IO性能的措施后,可调整innodb_io_capacity直到符合磁盘IO的吞吐量(IPOS),但是不建议超过20000。
set persist innodb_io_capacity=300

Innod1.0.x版本还有增加了一个参数是innodb_adaptive_flushing(自适应刷新。默认开启),该值影响每秒刷新脏页的数量。具体规则:InnoDB会通过判断产生重做日志(redo log)的速度来决定最合适的刷新脏页数量。因此,当脏页的比例小于innodb_max_dirty_pages_pct时,也会刷新一定量的脏页。

还有一个改变是:在InnoDB1.0.x版本开始引入innodb_purge_batch_size(默认值300),用于控制每次full purge操作时回收Undo页的数量。并且从InnoDB1.1版本开始,purge操作独立到单独的线程(purge Thread)中进行,以此来减轻Master Thread的工作。

在InnoDB1.2.x版本中又进行了优化,主要优化内容如下:
这个版本中最大的优化就是:对于刷新脏页的操作,从Master Thread线程分离到一个单独的Page Cleaner Thread,从而减轻了Master Thread的工作,同时进一步提高了系统的并发性。

二、IO Thread

在InnoDB中大量使用了AIO(Async IO)异步IO来处理写请求,这样可以极大的提高数据库的性能。而IO Thread的工作主要是负责这些IO请求的回调处理。在InnoDB1.0版本之前共有4个IO Thread,分别是write、read、inser buffer和log IO Thread。从InnoDB1.0.x版本开始,read thread和write thread分别增大到了4个,分别使用innodb_read_io_threadsinnodb_write_io_threads参数进行设置,并且读线程ID总是小于写线程。

mysql> show variables like '%io_threads%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| innodb_read_io_threads  | 4     |
| innodb_write_io_threads | 4     |
+-------------------------+-------+
2 rows in set (0.01 sec)

异步IO是InnoDB很重要的一个特性,也是提升性能的一个重要功能。与AIO对应的是Sync IO,即每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。但是如果用户发出的是一条索引扫描的查询,那么这条SQL查询语句可能需要扫描多个索引页,也就是需要进行多次的IO操作。在每扫描一个页并等待其完成后再进行下一次的扫描,这是没有必要的。用户可以发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,这就是AIO。

AIO的另一个优势是可以进行IO Merge操作,也就是将多个IO合并为1个IO,这样可以调高IOPS的性能。

三、Purge Thread

Purge Thread是InnoDB1.1版本开始新加入的线程,专门用于处理回收不再需要的undo页的工作,以此来减轻Master Thread的工作,从而提高CPU的使用率以及提升存储引擎的性能。在Mysql配置文件中,通过Innodb_purge_threads参数来设置线程数。但是在InnoDB1.1版本中,即使设置了此参数大于1,在InnoDB启动时也会将其设为1。在InnoDB1.2版本开始,InnoDB支持多个Purge Thread,默认4个这样做的目的是为了加快undo页的回收。同时由于Purge Thread需要离散地读取undo页,这样也能更进一步利用磁盘的随机读取性能。

mysql> show variables like '%Innodb_purge_threads%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_purge_threads | 4     |
+----------------------+-------+
1 row in set (0.00 sec)

四、Page Cleaner Thread

Page Cleaner Thread是INnoDB1.2版本开始引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。其目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB的性能
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/476212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js常见混淆加密技术

下面,我将通过一个案例来演示如何使用JavaScript混淆加密技术来保护你的网站。 假设你有一个网站,其中包含一个登录页面,该页面的JavaScript代码如下所示: function login(username, password) {if (username "admin"…

Doris(21):Doris的函数—日期函数

1 CONVERT_TZ(DATETIME dt, VARCHAR from_tz, VARCHAR to_tz) 转换datetime值dt,从 from_tz 由给定转到 to_tz 时区给出的时区,并返回的结果值。 如果参数无效该函数返回NULL。 select convert_tz(2019-08-01 13:21:03, Asia/Shanghai, America/Los_Angeles); select co…

大数据-玩转数据-初识FLINK

一、初识Flink Flink采用一只松鼠的彩色图案作为logo Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算 二、Flink的重要特点 1、事件驱动…

mysql与redis区别

一、.redis和mysql的区别总结 (1)类型上 从类型上来说,mysql是关系型数据库,redis是缓存数据库 (2)作用上 mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢 redis用于存储使…

一篇你看得懂的SNP

单核苷酸多态性,(Single Nucleotide Polymorphism,简称SNP)指的是由单个核苷酸—A,T,C或G的改变而引起的DNA序列的改变,造成包括人类在内的物种之间染色体基因组的多样性。是指在基因组上单个核苷酸的变异,…

朴素贝叶斯分类器with案例:基于SMS Spam Collection数据集的广告邮件分类

目录 贝叶斯分类器何为朴素案例:基于SMS Spam Collection数据集的广告邮件分类SMS数据集词向量表示Laplacian平滑训练过程分类过程 完整代码 贝叶斯分类器 首先要理解贝叶斯决策的理论依据,引用西瓜书上的原话:对于分类任务,在所…

(基础算法)高精度加法,高精度减法

高精度加法 什么叫做高精度加法呢?包括接下来的高精度减法,高精度乘法与除法都是同一个道理。正常来讲的话加减乘除,四则运算的数字都是整数,也就是需要在int的范围之内,但当这个操作数变得非常"大"的时候&…

《面试1v1》java反射

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你好,请问你对 Java 反射有了解吗? 候选人: 是的,我了解一些。 面试官: 那你能简单…

离散数学集合论

集合论 主要内容 集合基本概念 属于、包含幂集、空集文氏图等 集合的基本运算 并、交、补、差等 集合恒等式 集合运算的算律,恒等式的证明方法 集合的基本概念 集合的定义 集合没有明确的数学定义 理解:由离散个体构成的整体称为集合&#xff0c…

【五一创作】【Midjourney】Midjourney 连续性人物创作 ② ( 获取大图和 Seed 随机种子 | 通过 seed 随机种子生成类似图像 )

文章目录 一、获取大图和 Seed 随机种子二、通过 seed 种子生成类似图像 一、获取大图和 Seed 随机种子 注意 : 一定是使用 U 按钮 , 在生成的大图的基础上 , 添加 信封 表情 , 才能获取该大图的 Seed 种子编码 ; 在上一篇博客生成图像的基础上 , 点击 U3 获取第三张图的大图 ;…

电子数据取证之宝塔面板

一、宝塔面板介绍 1、官网bt.com,是提升运维效率的服务器管理软件,支持一键WAMP/LAMP/LNMP等100多项服务器管理功能;是跨平台的软件,同时支持Windows和Linux。开源永久免费。提高工作效率,对小白比较友好。 2、怎么看服…

【网络socket编程----预备知识和UDP服务器模拟实现】

文章目录 一、预备知识1.1 理解IP地址和端口号1.2 认识TCP协议和UDP协议1.3 网络字节序1.4 socket编程接口和sockaddr结构 二、封装 UdpSocket 一、预备知识 1.1 理解IP地址和端口号 众所周知,每台主机都有一个IP地址。而主机和主机之间通信,也需要依赖…

对比学习论文阅读:CoCLR算法笔记

标题:Self-supervised Co-training for Video Representation Learning 会议:NIPS2020 论文地址:https://dl.acm.org/doi/abs/10.5555/3495724.3496201 官方代码:https://www.robots.ox.ac.uk/~vgg/research/CoCLR/ 作者单位&…

软考算法-排序篇-上

数据排序 一:故事背景二:直接插入排序2.1 概念2.2 画图表示2.3 代码实现2.4 总结提升 三:希尔排序3.1 概念3.2 画图表示3.3 代码实现3.4 总结提升 四:直接选择排序4.1 概念4.2 画图表示4.3 代码实现4.4 总结提升 五:堆…

组播PIM协议

PIM(Protocol Independent Multicast)称为协议无关组播(组播分发树)。这里的协议无关指的是与单播路由协议无关,即PIM不需要维护专门的单播路由信息。作为组播路由解决方案,它直接利用单播路由表的路由信息…

LeetCode:142. 环形链表 II

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题解目录 一、🌱[142. 环形链表 II](https://leetcode.cn/problems/linked-l…

瑞吉外卖:后台系统登录功能

文章目录 需求分析代码开发创建实体类导入返回结果类Rcontroller、service与mapperlogin.html 需求分析 点击登录按钮后,浏览器以POST方式向employee/login提交username和password,服务器经过处理后向浏览器返回某种格式的数据,其中包含&…

Java SE(十一)之异常处理(Exception)

文章目录 异常概述1.什么是异常?2.为什么要异常? 异常体系及分类1.运行时异常2.编译时异常 异常处理1.JVM默认处理方案2.try…catch…3.throw & throws(1)抛出异常throw(2)声明异常throws(3…

Android Studio制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。

背景: 本文的内容是针对单片机蓝牙模块(HC-42)开发的手机App。在这之前,我想先声明一点,手机与手机间的蓝牙连接方式”与“手机与HC间的蓝牙连接方式”是不一样的。原因就是手机搭配的是“经典蓝牙”模块,…

HTML【前端基础】

目录 1.HTML 结构 1.1 HTML 标签 1.2 HTML 文件基本结构 1.3 标签层次结构 1.4 快速生成代码框架 2.HTML 常见标签 2.1 注释标签 2.2 标题标签: h1-h6 2.3 段落标签:p 2.4 换行标签: br 2.5 格式化标签 2.6 图片标签: img 2.7 超链接标签: a 2.8 表格…