MySQL参数解析innodb_max_dirty_pages_pct_lwm

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这个低水位线时,才开始逐步地刷脏页,脏页比例越高,刷脏页的强度越高。

发表评论