innodb_max_dirty_pages_pct_lwm 参数定义了一个代表脏页比例的低水位线,当buffer pool里面的脏页比例超过这个低水位线时,能够触发脏页预刷功能,来逐步控制脏页比例。
innodb_max_dirty_pages_pct_lwm 是一个可动态修改的参数,取值范围为0到99.99,默认值为0,当设置为0时,表示禁用低水位预刷脏页功能。
innodb_max_dirty_pages_pct_lwm 值只能小于等于innodb_max_dirty_pages_pct 值,如果设置的值大于innodb_max_dirty_pages_pct值,则会被强制修改为与innodb_max_dirty_pages_pct值相等。
innodb_max_dirty_pages_pct_lwm参数源码解析
源码版本:5.7.19
在源码中,innodb_max_dirty_pages_pct_lwm参数对应的变量是srv_max_dirty_pages_pct_lwm,它是一个全局变量,默认值为0.0,如下:
double srv_max_dirty_pages_pct_lwm = 0.0;
使用srv_max_dirty_pages_pct_lwm变量的代码主要集中在函数af_get_pct_for_dirty(),这个函数逻辑很简单,返回一个整数值,用于控制刷脏页的数量,这个值返回给上层调用函数,结合io_capacity和max_io_capacity参数,计算出要刷的页面数量。af_get_pct_for_dirty()函数的主要代码如下:
static ulint af_get_pct_for_dirty()
{
double dirty_pct = buf_get_modified_ratio_pct();
if (dirty_pct == 0.0) {
return(0);
}
if (srv_max_dirty_pages_pct_lwm == 0) {
if (dirty_pct >= srv_max_buf_pool_modified_pct) {
return(100);
}
} else if (dirty_pct >= srv_max_dirty_pages_pct_lwm) {
return(static_cast<ulint>((dirty_pct * 100) / (srv_max_buf_pool_modified_pct + 1)));
}
return(0);
}
上述代码逻辑并不复杂,简单概述如下:
- 当srv_max_dirty_pages_pct_lwm为0时,是否刷脏页,只与srv_max_buf_pool_modified_pct参数有关,当脏页比例超过这个阈值时,开始按io_capacity能力的100%进行刷脏页。
- 当srv_max_dirty_pages_pct_lwm不为0时,脏页比例超过srv_max_dirty_pages_pct_lwm这个低水位线时,才开始逐步地刷脏页,脏页比例越高,刷脏页的强度越高。