MySQL后台线程整理总结
2024-09-22 15:44:58
本文整理自《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
最新文章
- Java并发编程之阻塞队列
- 从零开始用gulp
- 10个很棒的学习Android 开发的网站(转)
- mysql中的sql总结
- windowsphone8.0 iso 下载地址
- Objc基础学习记录5
- Java 类成员的初始化顺序
- Repeater 动态增加删除一行
- common常用方法和部分算法
- 算法:60.第k个排列
- 理解Liang-Barsky裁剪算法的算法原理
- A1090. Highest Price in Supply Chain
- 客户端服务端web问题
- bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器
- DELPHI之崩溃地址排错代码查看 转
- Asp.net WebAPI Ioc
- fdisk -l 参数详解
- 554C - Kyoya and Colored Balls
- 微信小程序 发送模版消息
- OpenCV学习(31) 基于defects的简单手势