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((dirty_pct * 100) / (srv_max_buf_pool_modified_pct + 1))); } return(0); }