配置缓冲池刷新
InnoDB
在后台执行某些任务,包括从缓冲池中清除脏页。脏页是指已被修改但尚未写入磁盘上数据文件的页。
在MySQL 8.0中,缓冲池刷新是由页面清理程序线程执行的。页面清洁程序线程的数量由innodb_page_cleaners
变量控制,该变量的默认值为4。
当脏页的百分比达到innodb_max_dirty_pages_pct_lwm
变量定义的低水位标记值时,将启动缓冲池刷新。默认的低水位线是缓冲池页面的10%。一innodb_max_dirty_pages_pct_lwm
0禁用早期潮红行为的价值。
innodb_max_dirty_pages_pct_lwm
阈值的目的是控制缓冲池中脏页的百分比,并防止脏页数量达到innodb_max_dirty_pages_pct
变量所定义的阈值,该阈值的默认值为90。InnoDB
如果百分比百分比较高,则主动刷新缓冲池页面缓冲池中的脏页数达到innodb_max_dirty_pages_pct
阈值。
其他变量允许对缓冲池刷新行为进行微调:
该
innodb_flush_neighbors
变量定义从缓冲池刷新页面是否也以相同程度刷新其他脏页面。- 设置为0将禁用
innodb_flush_neighbors
。同样程度的脏页也不会刷新。 - 默认设置1会以相同程度刷新连续的脏页。
- 设置为2将以相同程度刷新脏页。
当表数据存储在传统的 HDD存储设备上时,与在不同时间刷新单个页面相比,在一次操作中刷新相邻页面减少了I / O开销(主要用于磁盘查找操作)。对于存储在SSD上的表数据,查找时间不是重要因素,您可以禁用此设置以分散写操作。
- 设置为0将禁用
该
innodb_lru_scan_depth
变量针对每个缓冲池实例指定页面清洁程序线程扫描以查找要刷新的脏页面的缓冲池LRU列表的下行距离。这是页面清洁器线程每秒执行一次的后台操作。小于默认值的设置通常适用于大多数工作负载。明显高于必要值的值可能会影响性能。仅在典型工作负载下具有备用I / O容量时,才考虑增加该值。相反,如果写密集型工作负载使您的I / O容量饱和,请减小该值,尤其是在大型缓冲池的情况下。
调整时
innodb_lru_scan_depth
,请从较低的值开始,然后向上配置设置,以极少看到零可用页面为目标。另外,innodb_lru_scan_depth
在更改缓冲池实例数时,请考虑进行调整,因为innodb_lru_scan_depth
*innodb_buffer_pool_instances
定义了每秒页面清洁器线程执行的工作量。
在innodb_flush_neighbors
和innodb_lru_scan_depth
变量主要用于写入密集型工作负载。在繁琐的DML活动中,如果刷新不够积极,刷新可能会落在后面;如果刷新过于激进,则磁盘写操作可能会使I / O容量饱和。理想的设置取决于您的工作量,数据访问模式和存储配置(例如,数据存储在HDD还是SSD设备上)。
自适应冲洗
InnoDB
根据重做日志生成的速度和当前的刷新率,使用自适应刷新算法来动态调整刷新率。目的是通过确保刷新活动与当前工作负载保持同步来使总体性能平稳。自动调整刷新率有助于避免吞吐量突然下降,当由于缓冲池刷新而导致的I / O活动突发影响普通读取和写入活动可用的I / O容量时,吞吐量可能会突然下降。
例如,尖锐的检查点通常与产生大量重做条目的写密集型工作负载相关联,可能会导致吞吐量的突然变化。InnoDB
要重用部分日志文件时,将出现一个尖锐的检查点。这样做之前,必须清除日志文件该部分中所有具有重做条目的脏页。如果日志文件已满,则会出现尖锐的检查点,从而导致吞吐量暂时降低。即使innodb_max_dirty_pages_pct
未达到阈值,也会发生这种情况。
自适应刷新算法通过跟踪缓冲池中的脏页数和生成重做日志记录的速率来帮助避免此类情况。根据此信息,它决定每秒从缓冲池刷新多少脏页,从而允许它管理工作负载的突然变化。
该innodb_adaptive_flushing_lwm
变量定义重做日志容量的低水位线。超过该阈值时,即使innodb_adaptive_flushing
禁用了变量,也会启用自适应刷新。
内部基准测试表明,该算法不仅可以保持一段时间内的吞吐量,而且还可以显着提高总体吞吐量。但是,自适应刷新会显着影响工作负载的I / O模式,可能并不适合所有情况。当重做日志有填满的危险时,它提供最大的好处。如果自适应刷新不适合您的工作负载特征,则可以禁用它。由innodb_adaptive_flushing
变量控制的自适应刷新,默认情况下已启用。
innodb_flushing_avg_loops
定义InnoDB
保留先前计算的刷新状态快照的迭代次数,控制自适应刷新对前台工作负载变化的响应速度。较高的innodb_flushing_avg_loops
值表示InnoDB
保留先前计算的快照的时间更长,因此自适应刷新的响应速度更慢。设置高值时,重要的是确保重做日志利用率不达到75%(异步刷新开始的硬编码限制),并且该innodb_max_dirty_pages_pct
阈值将脏页数保持在适合工作负载的水平。
具有一致的工作负载,较大的日志文件大小(innodb_log_file_size
)和较小的峰值(未达到日志空间利用率的75%)的系统应使用较高的innodb_flushing_avg_loops
值来保持刷新尽可能平滑。对于负载高峰或日志文件不能提供大量空间的系统,较小的值允许刷新以紧密跟踪工作负载变化,并有助于避免达到75%的日志空间利用率。
请注意,如果刷新落后,则缓冲池刷新的速率可能会超过设置InnoDB
所定义的I / O容量innodb_io_capacity
。该innodb_io_capacity_max
值定义了这种情况下I / O容量的上限,因此I / O活动的高峰不会消耗服务器的整个I / O容量。
该innodb_io_capacity
设置适用于所有缓冲池实例。刷新脏页后,I / O容量将在缓冲池实例之间平均分配。
在空闲期间限制缓冲区刷新
从MySQL 8.0.18开始,您可以使用该innodb_idle_flush_pct
变量来限制空闲时间段内缓冲池刷新的速率,这些时间段是未修改数据库页面的时间段。该innodb_idle_flush_pct
值是innodb_io_capacity
设置的百分比,该设置定义了每秒可用的I / O操作数InnoDB
。默认innodb_idle_flush_pct
值为100,是innodb_io_capacity
设置的100%。要限制空闲期间的冲洗,请定义一个innodb_idle_flush_pct
小于100 的值。
限制空闲期间的页面刷新可以帮助延长固态存储设备的寿命。在空闲时间段限制页面刷新的副作用可能包括较长的空闲时间段后较长的关闭时间,以及在发生服务器故障时较长的恢复时间段。