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()
{
,刷新redo日志缓冲到磁盘,不管是否提交(总是)
属于master thread中的checkpoint实现
,合并插入缓冲(可能),根据一秒之内发生的IO次数,如果小于5,则执行合并插入缓冲的操作
,最多刷新100个Innodb缓冲池中的脏页到磁盘(可能),
if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct>buf_get_modified_ratio_pct)
执行刷新100个脏页到磁盘
4. checkpoint
,如果当前没有用户活动,切换到background模式
} //每10秒一次操作涉及的行为
TenSecondOperation()
{
,刷新100个Innodb缓冲池中的脏页到磁盘(可能),
判断过去10秒之内IO操作是否小于200次,如果是,刷新100个脏页到磁盘------>硬编码
,合并最多5个插入缓冲(总是),无条件,总是执行合并最多5个插入缓冲
,日志缓存刷新到磁盘(总是)
,删除无用的undo页(总是),每次最多尝试回收20个页---->硬编码
,刷新100或者10个脏页到磁盘(总是):---->硬编码
脏页比例>%==>刷新100个脏页到磁盘,
脏页比例<%==>刷新10个脏页到磁盘
6. checkpoint
}
//BackgroundOperation线程
BackgroundOperation()
{ ,删除无用的Undo页(总是)
,合并20个插入缓冲(总是)
,跳回到主循环(总是)
,不断刷线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
{ ,增加参数innodb_io_capacity,合并插入缓冲=innodb_io_capacity*%;刷新脏页数量=innodb_io_capacity
,buf_max_dirty_pages_pct默认值修改为75%
,innodb_purge_batch_size,回收undo页的配置,默认值20 //每1秒一次操作涉及的行为
PerSecondOperation()
{
,刷新redo日志缓冲到磁盘,不管是否提交(总是) ,合并插入缓冲(可能),根据一秒之内发生的IO次数:
if(过去1秒钟的ios<%innodb_io_capacity)
{
执行合并5%innodb_io_capacity个page的插入缓冲的操作
} ,刷新缓冲池中的脏页到磁盘(可能):
if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct)
刷新脏页个数:%*innodb_io_capacity
if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct)
刷新脏页个数:%*innodb_io_capacity
4. checkpoint
5,如果当前没有用户活动,切换到background模式 }
//每10秒一次操作涉及的行为
TenSecondOperation()
{ ,刷新缓冲池中的脏页到磁盘(可能):
if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct)
刷新脏页个数:%*innodb_io_capacity
if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct)
刷新脏页个数:%*innodb_io_capacity ,合并插入缓冲(可能),根据过去一秒之内发生的IO次数:
if(ios<%innodb_io_capacity)
{
执行合并5%innodb_io_capacity个page的插入缓冲的操作
} ,日志缓存刷新到磁盘(总是) ,删除无用的undo页(总是)
根据参数:innodb_purge_batch_size 5. checkpoint
} BackgroundOperation()
{
,删除无用的Undo页(总是)
,合并innodb_io_capacity个插入缓冲(总是)
,跳回到主循环(总是)
,不断刷线innodb_io_capacity个page到磁盘,直到满足(脏页小于参数buf_max_dirty_pages_pct)。
} }
1.2.x版本中, 将刷新脏页的操作从master thread 分离到一个单独的 page cleaner thread 进程中. 进一步提高了系统的并发性,独立的page cleaer thread
PageCleanerThread()
{ ,刷新缓冲池中的脏页到磁盘(可能):
if(buf_get_modified_ratio_pct>buf_max_dirty_pages_pct)
刷新脏页个数:%*innodb_io_capacity
if(buf_get_modified_ratio_pct<buf_max_dirty_pages_pct)
刷新脏页个数:%*innodb_io_capacity
}
6. checkpoint
MySQL后台线程整理总结的更多相关文章
- mysql后台线程详解
1.mysql后台线程 mysql后台线程主要用于维持服务器的正常运行和完成用户提交的任务,主要包括:master thread,read thread,write thread,redo log t ...
- MySQL后台线程的清理工作
后台清理工作:脏页刷盘.undo回收 1.page cleaner thread:刷新脏页 2.purge thread:清空undo页.清理“deleted”page 一.innodb_page_c ...
- 常见mysql后台线程
1.IO THREAD MySQL有很多后台线程 其中包括了负责IO的相关线程IO THREAD 1. 参数innodb_write_io_threads 写线程 默认四个,负责数据块的写入 2 ...
- MySQL学习笔记-数据库后台线程
数据库后台线程 默认情况下讲述的InnoDB存储引擎,以后不再重复声明.后台线程有7个--4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程.IO thread的 ...
- InnoDB体系架构(一)后台线程
InnoDB体系架构——后台线程 上一篇已经了解了MySQL数据库的体系结构 这一篇除了介绍InnoDB存储引擎的体系架构外,同时进一步了解InnoDB的后台线程. InnoDB存储引擎是多线程的模型 ...
- MySQL - Show Processlist 整理
MySQL - Show Processlist 整理 原文来源:MySQL 5.5 Reference Manual 部分翻译取自:<MySQL_5.1中文参考手册> 转载请注明原文 ...
- [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构
[源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 目录 [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 0x00 摘要 0x01 ...
- mysql面试题整理
1 myisam 和 innodb 引擎的区别 innodb 支持事务,外键,myisam 不支持 innodb 支持 mvcc ,myisam 不支持 innodb 支持表锁.行锁,myisam 仅 ...
- C#夯实基础之多线程二:主线程、前台线程与后台线程
我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...
随机推荐
- Btrace介绍
一.Btrace简介 BTrace可以动态的向目标应用程序的字节码注入追踪代码 用到的技术JavaComplierApi,JVMTI,Agent,Instrumentation+ASM 二.Btrac ...
- java web中分层MVC的意义
在web编程中,由于高内聚.低耦合的特点,需要将多个类实现多层,大致有以下几层:①entity,实体类,如user,role等,这些类里边包含了私有属性和公共的get.set方法这和数据库中的表相对应 ...
- Routemanage类方法详解
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Ref ...
- 使用LFSR搭建误差补偿系统
使用LFSR搭建误差补偿系统 首先弄明白什么是LFSR 线性反馈移位寄存器(LFSR)是内测试电路中最基本的标准模块结构,既用作伪随机测试码产生器,也作为压缩测试结果数据的特征分析器. 一个n阶的LF ...
- c# excel如何导入到sqlserver数据库
最近在做这个如何把excel导入到数据库中,经过多方查找,终于找到一个适合的,并且经过自己的完善可以正常使用(忘记原作者博客的链接地址了,敬请见谅) 首先是窗体的创建,文本框显示文件的路径,按钮执行操 ...
- 去中心化存储项目终极指南 | Filecoin, Storj 和 PPIO 项目异同
Filecoin,Storj 以及 PPIO 这三个存储公链的设计思路是不一样的,没有优劣之分,写这篇文章也并不是为了争论各项目的好坏对错.去中心化存储是一个长期商业赛道,不同团队在同一个赛道上往不同 ...
- Google瓦片地图URL
http://mt2.google.cn/vt/lyrs=y&scale=2&hl=zh-CN&gl=cn&x=6891&y=3040&z=13 //含 ...
- 《深度探索C++对象模型》读书笔记(二)
第三章:Data语意学 这一章主要讲了类中的数据在内存中是如何分配的,包括(多重)继承和多态. 让我们首先从一段代码开始: class X{}; class Y :virtual public X{} ...
- html5编写软件哪个好?八款html5编写软件推荐
随着各大浏览器对HTML5技术支持的不断完善,未来HTML5必将改变我们创建Web应用程序的方式.而很多html5的初学者都想找一款好用的编写软件,这里主机吧就给大家推荐七款好用的html5编写软件. ...
- CSS3之实现光润效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...