innodb master thread 工作原理
参考 innodb参数汇总 InnoDB的Master Thread工作原理
innodb_max_dirty_pages_pct 默认值
show variables like 'innodb_max_dirty_pages_pct';
%。加快了脏页刷新频率减少恢复时间,也可保证磁盘IO负载。
查看:show variables like 'innodb_io_capacity';
无论何时,InnoDB存储引擎最多都只会刷新100个脏页到磁盘,合并20个插入缓冲。如果是在密集写的应用程序中,每秒中可能会产生大于100个的脏页,或是产生大于20个插入缓冲,此时master thread似乎会“忙不过来”,或者说它总是做得很慢。即使磁盘能在1秒内处理多于100个页的写入和20个插入缓冲的合并,由于hard coding,master thread也只会选择刷新100个脏页和合并20个插入缓冲。同时,当发生宕机需要恢复时,由于很多数据还没有刷新回磁盘,所以可能会导致恢复需要很快的时间,尤其是对于insert buffer。
这个问题最初是由Google的工程师Mark Callaghan提出的,之后InnoDB对其进行了修正并发布了补丁。InnoDB存储引擎的开发团队参考了Google的patch,提供了类似的方法来修正该问题。因此InnoDB Plugin开始提供了一个参数,用来表示磁盘IO的吞吐量,参数为innodb_io_capacity,默认值为200。对于刷新到磁盘的数量,会按照innodb_io_capacity的百分比来刷新相对数量的页。规则如下:
在合并插入缓冲时,合并插入缓冲的数量为innodb_io_capacity数值的5%。
在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity。
1 是默认值。表示不需要完成full purge和merge insert buffer操作,但是在缓冲池中的一些数据脏页会刷新到磁盘。
2 表示不完成full purge和merge insert buffer操作,也不将缓冲池中的数据脏页写回到磁盘,而是将日志写入到日志文 件。MySQL下次启动时,会执行恢复操作。
master thread可以分为主循环(loop),background循环,flush循环,suspend循环。可以这么理解,先运行主循环,如果当前数据库空闲,或者调用stop关闭命令时,进入background循环,在background循环最后,如果当前数据库不再空闲,就重新进入主循环,否则进入flush循环。在flush循环最后,如果数据库还是空闲就进入suspend循环,master thread挂起。
主循环分成两部分,一部分是每一秒钟要做的事情,另一部分是每10秒钟要做的事情。伪代码如下:
loop:
for(int i=0;i<10;i++){
thread_sleep(1);//sleep 1 second
doing something{
//每一秒钟要做的
do log buffer flush to disk;
if(last_one_second_ios < 5%*innodb_io_capacity){
do merge at most 5% innodb_io_capacity insert buffer;
}
if(buffer_pool_modified_page_ratio_pct > innodb_max_dirty_page_pct){
do buffer pool flush 100% innodb_io_capacity dirty pages;
}else if(enable adaptive flush){
do buffer pool flush desired amount dirty pages;
}
if(not user activity){
goto background loop;
}
}
}
doging something;{
//每10秒要做的
if(last_ten_seconds_ios < innodb_io_capacity){
do merge 100% innodb_io_capacity dirty pages;
}
do log buffer flush to disk;
do merge at most 5% innodb_io_capacity insert buffer;
do full purge,at most 20 undo pages;
if(buffer_pool_modified_page_ratio_pct < 70%){
do buffer pool flush 100% innodb_io_capacity dirty pages;
}else{
do buffer pool flush 10% innodb_io_capacity dirty pages;
}
do fuzzy checkpoint;
}
background loop循环伪代码如下:
background loop:
do full purge,at most 20 undo pages;
do merge 100% innodb_io_capacity insert buffer;
if(not idle){
goto loop;
}else{
goto flush loop;
}
flush loop循环伪代码如下:
flush loop:
do buffer pool flush 100% innodb_io_capacity dirty pages;
if(buffer_pool_modified_page_ratio_pct > innodb_max_dirty_page_pct){
goto flush loop;
}
goto suspend loop;
suspendloop循环伪代码如下:
suspend loop:
suspend thread();
waiting event;
goto loop;
通过整理不难发现,整个master thread主要操作的对象只有,log buffer,insert buffer,dirty pages,undo pages,checkpoint。可以根据这些操作对象来分类主要有如下:
log buffer:
只在主循环中操作log buffer。而且,不管是在每一秒,还是每10秒,不需要任何前提,都会flush log buffer.这个最好理解。
insert buffer:
每一秒操作:如果一秒内磁盘IO < 5% innodb_io_capacity,就至多合并5% innodb_io_capacity的insert buffer.否则就不操作。
每10秒操作:不需要任何前提,至多合并5% innodb_io_capacity的insert buffer。
background loop:至多合并100% innodb_io_capacity的insert buffer。
dirty pages:
每一秒操作:如果缓冲池脏页比例 > innodb_max_dirty_pages_pct,就刷新100%innodb_io_capacity的脏页到磁盘。如果不满足条件,但是满足adaptive flush条件,仍会刷新一定的脏页到磁盘
每10秒操作:如果最近10秒内,磁盘IO < innodb_io_capacity,就刷新100%innodb_io_capacity的脏页到磁盘。之后,如果缓冲池脏页比例 > 70% ,再次刷新100%innodb_io_capacity的脏页到磁盘,否则刷新10%innodb_io_capacity。
flush loop:只要缓冲池脏页比例 > innodb_max_dirty_pages_pct,就刷新100%innodb_io_capacity的脏页到磁盘,直到脏页比例小于innodb_max_dirty_pages_pct设置。
undo pages:
每10秒操作 :不需要任何前提,至多删除20个undo 页.
background loop : 不需要任何前提,至多删除20个undo 页.
checkpoint :
每10秒操作 :不需要任何前提,设置一个模糊检查点.
innodb master thread 工作原理的更多相关文章
- InnoDB master thread工作原理
我们简单交流下InnoDB master thread学习,有兴趣的朋友可以参考<<MySQL技术内蒙--InnoDB存储引擎第二版>> void master_thread( ...
- InnoDB体系架构(四)Master Thread工作方式
Master Thread工作方式 在前面的文章:InnoDB体系架构——后台线程 说到:InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成.这篇具体介绍该线程的具 ...
- 14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率:
14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率: 主线程 在InnoDB 是一个线程 执行各种任务在后台. ...
- 14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate
14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate 主的master thread ...
- [小结]InnoDB体系结构及工作原理
参阅:<innodb存储引擎内幕>原创文章,会不定时更新,转发请标明出处:http://www.cnblogs.com/janehoo/p/7717041.html 一.概述: innod ...
- InnoDB master thread学习
很久很久没有写博客了,工作比较忙,也没什么时间学习了,恰逢国庆放假,安心的学习一下,其实只是把之前学习过的知识再温习了一下而已.InnoDB 有众多的线程,其中非常核心的就是master thread ...
- InnoDB Master Thread I/O Rate详解
一.innodb 在刷盘时要面对的问题: 1.对于innodb 的master thread 这个线程来说,它会在后台执行许多的任务,这些任务大多数都是与IO操作相关的, 比如“刷新脏页到磁盘”.“合 ...
- Nginx源码分析:3张图看懂启动及进程工作原理
编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享.转载请注明来自高可用架构公众号「ArchNotes」. 导读:很多工程师及架构师都希望了解及掌握高性能服务器 ...
- msyql master thread
------------------------------------------------------ 2015-02-10----------------------------------- ...
随机推荐
- 利用javascript调用摄像头,可以配合socket开发监控系统
<html> <head> <meta http-equiv="content-type" content="text/html; char ...
- linux笔记1
在root下创建用户 1.useradd abc //添加一个新用户 2. cat /etc/passwd //查看新用户是否存在 3.passwd abc 输入密码 (123456) ...
- HttpClient使用笔记
使用版本为4.5.1 常用API: 1.获取网页内容:InputStream in = response.getEntity().getContent() 2.获取状态码:response.getSt ...
- 直接下载完整chrome浏览器的方法
目前通过下吗的链接可以获得独立的安装包. http://www.google.com/chrome/eula.html?standalone=1&hl=zh-CN
- CorelDRAW 插件的安装和使用
CorelDRAW 是一款在中国非常受欢迎的图形软件,开放的界面和编程技术,能够对它进行二次开发制作插件,插件大抵有三种gms.cpg.exe格式,下面介绍一下这三种插件的安装和使用方法. 一.gms ...
- unity3d应用内分享(微信、微博等)的实现
问题:如何在unity3d的游戏中实现分享功能,如图 思路: 1.分享功能的实现方式有多种,较方便快捷的一种是直接调用android的API来调出系统的分享界面 2.unity3d里面调用androi ...
- Unity3d中所有特殊的文件夹
1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor 和 /Editor 是一样的,无论多少个叫Editor的 ...
- Get the item a SharePoint workflow task is associated with
This is handy. SharePoint helpfully populates the meta data with the GUID of the list and the ID of ...
- 微信支付-b
微信支付 APP端开发步骤(传送门):https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 1.首先下载最新的微信支付的SDK包 ...
- 使用maven配置基本Mybatis
Mybatis 也称为是ibatis,主要体现在普通.底层SQL查询.存储过程.高级映射的持久化框架! 优点: 1.消除了几乎所 ...