本文整理自《MySQL技术内幕 InnoDB存储引擎》ios
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. checkpoint
5,若是当前没有用户活动,切换到background模式 } //每10秒一次操做涉及的行为 TenSecondOperation() { 1,刷新100个Innodb缓冲池中的脏页到磁盘(可能), 判断过去10秒以内IO操做是否小于200次,若是是,刷新100个脏页到磁盘------>硬编码
2,合并最多5个插入缓冲(老是),无条件,老是执行合并最多5个插入缓冲
3,日志缓存刷新到磁盘(老是)
4,删除无用的undo页(老是),每次最多尝试回收20个页---->硬编码
5,刷新100或者10个脏页到磁盘(老是):---->硬编码 脏页比例>70%==>刷新100个脏页到磁盘, 脏页比例<70%==>刷新10个脏页到磁盘
6. checkpoint
}
//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日志缓冲到磁盘,无论是否提交(老是) 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. checkpoint
5,若是当前没有用户活动,切换到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
5. checkpoint
} 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 }
6. checkpoint