Buffer Pool Adaptive Flush

在MySQL的帮助文档中Tuning InnoDB Buffer Pool Flushing提到, innodb_adaptive_flushing_lwm,innodb_max_dirty_pages_pct_lwminnodb_io_capacity_max, 和innodb_flushing_avg_loops. 公式决定了Adaptive Flush刷入的page数。

For systems with constant heavy workloads, or workloads that fluctuate widely, several configuration options let you fine-tune the flushing behavior for InnoDB tables: innodb_adaptive_flushing_lwm,innodb_max_dirty_pages_pct_lwminnodb_io_capacity_max, and innodb_flushing_avg_loops. These options feed into the formula used by the innodb_adaptive_flushing option.

Innodb_adaptive_flush_lwm:自适应flush机制的低水位。
innodb_max_dirty_page_pct_lwm:脏页的低水位,用来控制buffer pool脏页比率。
innodb_io_capacity_max:redo log最大容量,如果不设置是innodb_io_capacity的两倍。
innodb_flushing_avg_loops:n次循环后,重新计算平均刷新的dirty
page和LSN。

要刷新多少page和lsn主要代码在af_get_pct_for_dirty,af_get_pct_for_lsn中

主要控制adaptive flush的代码位于buf0flu.cc的af_get_pct_for_lsn中:

1.先判断redo log的容量是否到了innodb_adaptive_flushing_lwm低水位阀值。
2.是否配置了adaptive flush或者age超过了异步刷新的阀值。
3.lsn_age_factor=age占异步刷新阀值的比例。
4.要被刷新的比率=innodb_io_capacity_max/innodb_io_capacity*lsn_age_factor*
sqrt(innodb_io_capacity)/7.5

static
ulint
af_get_pct_for_lsn(
/*===============*/
lsn_t age) /*!< in: current age of LSN. */
{
lsn_t max_async_age;
lsn_t lsn_age_factor;
lsn_t af_lwm=(srv_adaptive_flushing_lwm
*log_get_capacity())/; if(age<af_lwm){
/* No adaptive flushing. */
return();
} max_async_age=log_get_max_modified_age_async(); if(age<max_async_age&&!srv_adaptive_flushing){
/* We have still not reached the max_async point and
the user has disabled adaptive flushing. */
return();
} /* If we are here then we know that either:
1) User has enabled adaptive flushing
2) User may have disabled adaptive flushing but we have reached
max_async_age. */
lsn_age_factor=(age*)/max_async_age; ut_ad(srv_max_io_capacity>=srv_io_capacity);
return(static_cast<ulint>(
((srv_max_io_capacity/srv_io_capacity)
*(lsn_age_factor*sqrt((double)lsn_age_factor)))
/7.5));
}

和要刷新多少脏页有关的函数是af_get_pct_for_dirty:
1.如果有脏页,并且innodb_max_dirty_pages_pct=0立马刷新。
2.如果没有设置innodb_max_dirty_pages_pct_lwm,并且脏页比率超过innodb_max_dirty_pages_pct,立马刷新。
3.设置了innodb_max_dirty_pages_pct_lwm并且脏页比率比低水位大,af_get_pct_for_dirty
=脏页比率/(innodb_max_dirty_pages_pct+1)

static
ulint
af_get_pct_for_dirty()
/*==================*/
{
ulintdirty_pct=buf_get_modified_ratio_pct(); if(dirty_pct>&&srv_max_buf_pool_modified_pct==){
return();
} ut_a(srv_max_dirty_pages_pct_lwm
<=srv_max_buf_pool_modified_pct); if(srv_max_dirty_pages_pct_lwm==){
/* The user has not set the option to preflush dirty
pages as we approach the high water mark. */
if(dirty_pct>srv_max_buf_pool_modified_pct){
/* We have crossed the high water mark of dirty
pages In this case we start flushing at 100% of
innodb_io_capacity. */
return();
}
}elseif(dirty_pct>srv_max_dirty_pages_pct_lwm){
/* We should start flushing pages gradually. */
return((dirty_pct*)
/(srv_max_buf_pool_modified_pct+));
} return();
}

要刷新的page=PCT_IO(max(af_get_pct_for_dirty,af_get_pct_for_lsn))+avg_page(由innodb_flushing_avg_loops到期计算得到)。

要刷新到的LSN= oldest_lsn+((这次要刷新的page/上次已经刷新的page)+1)*avg_lsn(由innodb_flushing_avg_loops到期计算得到)

帮助文档还提到innodb_flushing_avg_loops越大,也意味着adaptive flush越慢,但是从代码看,innodb_flushing_avg_loops会影响所有的flush不单单是adaptive。当写入变大,innodb_flushing_avg_loops不变或者变大,是有可能导致flush跟不上。

static
ulint
page_cleaner_flush_pages_if_needed(void)
/*====================================*/
{
staticlsn_t lsn_avg_rate=;
staticlsn_t prev_lsn=;
staticlsn_t last_lsn=;
staticulint sum_pages=;
staticulint last_pages=;
staticulint prev_pages=;
staticulint avg_page_rate=;
staticulint n_iterations=;
……
cur_lsn=log_get_lsn(); if(prev_lsn==){
/* First time around. */
prev_lsn=cur_lsn;
return();
} if(prev_lsn==cur_lsn){
return();
} /* We update our variables every srv_flushing_avg_loops
iterations to smooth out transition in workload. */
if(++n_iterations>=srv_flushing_avg_loops){ avg_page_rate=((sum_pages/srv_flushing_avg_loops)
+avg_page_rate)/; /* How much LSN we have generated since last call. */
lsn_rate=(cur_lsn-prev_lsn)/srv_flushing_avg_loops; lsn_avg_rate=(lsn_avg_rate+lsn_rate)/; prev_lsn=cur_lsn; n_iterations=; sum_pages=;
} oldest_lsn=buf_pool_get_oldest_modification(); ut_ad(oldest_lsn<=log_get_lsn()); age=cur_lsn>oldest_lsn?cur_lsn-oldest_lsn:; pct_for_dirty=af_get_pct_for_dirty();
pct_for_lsn=af_get_pct_for_lsn(age); pct_total=ut_max(pct_for_dirty,pct_for_lsn); /* Cap the maximum IO capacity that we are going to use by
max_io_capacity. */
n_pages=(PCT_IO(pct_total)+avg_page_rate)/; if(n_pages>srv_max_io_capacity){
n_pages=srv_max_io_capacity;
} if(last_pages&&cur_lsn-last_lsn>lsn_avg_rate/){
age_factor=static_cast<int>(prev_pages/last_pages);
}
……
prev_pages=n_pages;
n_pages=page_cleaner_do_flush_batch(
n_pages,oldest_lsn+lsn_avg_rate*(age_factor+)); last_lsn=cur_lsn;
last_pages=n_pages+; …… if(n_pages){
……
sum_pages+=n_pages;
} return(n_pages);
}

参考文档:

[1] http://dev.mysql.com/doc/refman/5.6/en/innodb-lru-background-flushing.html
14.12.1.6 Tuning InnoDB Buffer Pool Flushing
[2] http://hedengcheng.com/?p=88 InnoDB原生Checkpoint策略及各版本优化详解
[3] http://mysqllover.com/?p=620 Innodb:如何计算异步/同步刷脏及checkpoint的临界范围

[MySQL] Buffer Pool Adaptive Flush的更多相关文章

  1. 【MySQL】mysql buffer pool结构分析

    转自:http://blog.csdn.net/wyzxg/article/details/7700394 MySQL官网配置说明地址:http://dev.mysql.com/doc/refman/ ...

  2. MySQL buffer pool中的三种链

    三种page.三种list.LRU控制调优 一.innodb buffer pool中的三种页 1.free page:从未用过的页 2.clean page:干净的页,数据页的数据和磁盘一致 3.d ...

  3. 关于MySQL buffer pool的预读机制

    预读机制 两种预读算法 1.线性预读 2.随机预读 对预读的监控 一.预读机制 InnoDB在I/O的优化上有个比较重要的特性为预读,预读请求是一个i/o请求,它会异步地在缓冲池中预先回迁多个页面,预 ...

  4. MySQL · 引擎特性 · InnoDB Buffer Pool

    前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...

  5. innodb buffer pool flush机制

    参考印风的博客: FLUSH操作的类型,总的来说,有三种刷新类型   BUF_FLUSH_LRU:表示从Buffer Pool的LRU上扫描并刷新 BUF_FLUSH_LIST:表示从Buffer P ...

  6. innodb buffer pool

    add page to flush list buffer pool中的page,有三种状态: l  free:      当前page未被使用 l  clean:    当前page被使用,对应于数 ...

  7. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  8. 【转载】MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数个内存块加上一组控制结构体对象组成.内存块的个数取决于buffer pool inst ...

  9. [转]MySQL innodb buffer pool

    最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...

随机推荐

  1. DOM 节点的克隆与删除

    无奈的开头 关于DOM节点操作,如果仅仅是根据标准API来操作,那是最简单不过的了.但是现实中却哪有这么容易的问题让我们解决,其实不仅仅是节点的克隆与删除,节点的添加也是如此,而且添加节点需要考虑的情 ...

  2. 第三方侧滑菜单SlidingMenu在android studio中的使用

    南尘:每天进步一点点! 前面讲了官方的侧滑菜单DrawerLayout的使用,其实早在官方没有推出这个之前,就有很多第三方的jar包如SlidingMenu等,感谢开源的力量. SlidingMenu ...

  3. 给ubuntu中的软件设置desktop快捷方式(以android studio为例)

    ubuntu的快捷方式都在/usr/share/applications/路径下有很多*.desktop(eclipse的快捷方式也可以类似设置) 下面就建立我们的studio sudo gedit ...

  4. jQuery-1.9.1源码分析系列(九) CSS操作

    jquery.fn.css获取当前jQuery所匹配的元素中第一个元素的属性值[$(…).css(cssName),注意这个cssName可以是数组]或给当前jQuery所匹配的每个元素设置样式值[$ ...

  5. 【原创】kafka admin源代码分析

    admin包定义了命令行的一些实现 一.AdminOperationException.scala 一个异常类,表示执行admin命令时候抛出的异常 二.AdminUtils.scala admin一 ...

  6. 设计模式(一)单例模式(Singleton Pattern)

    一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...

  7. 第 31 章 项目实战-PC 端固定布局[4]

    学习要点: 1.热门旅游区 2.标题介绍区 3.旅游项目区 主讲教师:李炎恢 本章主要开始使用学习用 HTML5 和 CSS3 来构建 Web 页面,第一个项目采用 PC 端固定布局来实现. 一.热门 ...

  8. SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题

    原因分析 首先我们来看下Spring mvc 中文件上传的配置 <bean id="multipartResolver" class="org.springfram ...

  9. java web学习总结(二) -------------------TOMCAT使用帮助(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  10. 【grunt整合版】30分钟学会使用grunt打包前端代码

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...