#### 15.8.3.5配置缓冲池冲洗

[](<>)[](<>)

`InnoDB`在后台执行某些任务，包括刷新缓冲池中的脏页。脏页是指那些已经修改但尚未写入磁盘上数据文件的页面。

在MySQL 8.0中，缓冲池刷新由页面清理器线程执行。页面清理器线程的数量由[`innodb_页面_清洁器`](innodb-parameters.html#sysvar_innodb_page_cleaners)变量，其默认值为4。但是，如果页面清理器线程的数量超过缓冲池实例的数量，[`innodb_页面_清洁器`](innodb-parameters.html#sysvar_innodb_page_cleaners)将自动设置为与相同的值[`innodb_缓冲区_池_实例`](innodb-parameters.html#sysvar_innodb_buffer_pool_instances).

当脏页的百分比达到[`innodb_max_dirty_pages_pct_lwm`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct_lwm)变量默认的低水位线是缓冲池页面的10%。A.[`innodb_max_dirty_pages_pct_lwm`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct_lwm)值为0将禁用此早期刷新行为。

会议的目的[`innodb_max_dirty_pages_pct_lwm`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct_lwm)阈值用于控制缓冲池中脏页的百分比，并防止脏页的数量达到[`innodb_max_dirty_pages_pct`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct)变量，其默认值为90。`InnoDB`如果缓冲池中脏页的百分比达到[`innodb_max_dirty_pages_pct`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct)门槛

配置时[`innodb_max_dirty_pages_pct_lwm`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct_lwm)，该值应始终低于[`innodb_max_dirty_pages_pct`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct)价值

其他变量允许微调缓冲池刷新行为：

-   这个[`innodb_flush_邻居`](innodb-parameters.html#sysvar_innodb_flush_neighbors)变量定义从缓冲池刷新页面是否也会刷新同一范围内的其他脏页。

    -   默认设置为0将禁用[`innodb_flush_邻居`](innodb-parameters.html#sysvar_innodb_flush_neighbors)。相同范围内的脏页不会被刷新。对于寻道时间不是重要因素的非旋转存储（SSD）设备，建议使用此设置。

    -   设置为1会在相同范围内刷新连续的脏页。

    -   设置为2会在相同范围内刷新脏页。

        当表格数据存储在传统的[硬盘驱动器](glossary.html#glos_hdd)在存储设备中，与在不同时间刷新单个页面相比，在一次操作中刷新相邻页面可以减少I/O开销（主要用于磁盘搜索操作）。对于存储在[固态硬盘](glossary.html#glos_ssd)，寻道时间不是一个重要因素，您可以禁用此设置以展开写入操作。

-   这个[`innodb_lru_扫描_深度`](innodb-parameters.html#sysvar_innodb_lru_scan_depth)变量指定每个缓冲池实例在缓冲池LRU列表下方多远处，页面清理器线程扫描以查找要刷新的脏页。这是页面清理线程每秒执行一次的后台操作。

    小于默认值的设置通常适用于大多数工作负载。显著高于必要值的值可能会影响性能。如果在典型工作负载下有空闲I/O容量，只考虑增加值。相反，如果写密集型工作负载使I/O容量饱和，请降低该值，尤其是在缓冲池较大的情况下。

    调谐时[`innodb_lru_扫描_深度`](innodb-parameters.html#sysvar_innodb_lru_scan_depth)，从低值开始，向上配置设置，目标是很少看到零空闲页面。此外，考虑调整[`innodb_lru_扫描_深度`](innodb-parameters.html#sysvar_innodb_lru_scan_depth)更改缓冲池实例数时，因为[`innodb_lru_扫描_深度`](innodb-parameters.html#sysvar_innodb_lru_scan_depth) \* [`innodb_缓冲区_池_实例`](innodb-parameters.html#sysvar_innodb_buffer_pool_instances)定义页面清理器线程每秒执行的工作量。

    这个[`innodb_flush_邻居`](innodb-parameters.html#sysvar_innodb_flush_neighbors)和[`innodb_lru_扫描_深度`](innodb-parameters.html#sysvar_innodb_lru_scan_depth)变量主要用于写密集型工作负载。在DML活动频繁的情况下，如果刷新不够积极，则刷新可能会落后；如果刷新过于积极，则磁盘写入可能会使I/O容量饱和。理想的设置取决于您的工作负载、数据访问模式和存储配置（例如，数据是存储在HDD还是SSD设备上）。

##### 自适应冲洗

`InnoDB`使用自适应刷新算法根据重做日志生成的速度和当前刷新速率动态调整刷新速率。其目的是通过确保刷新活动与当前工作负载保持同步，从而平滑整体性能。自动调整刷新速率有助于避免由于缓冲池刷新导致的I/O活动突发影响可用于普通读写活动的I/O容量时，吞吐量突然下降。

例如，尖锐的检查点（通常与生成大量重做项的写密集型工作负载相关）可能会导致吞吐量的突然变化。当`InnoDB`希望重用日志文件的一部分。在执行此操作之前，必须刷新日志文件该部分中包含重做项的所有脏页。如果日志文件已满，则会出现一个尖锐的检查点，导致吞吐量暂时降低。即使[`innodb_max_dirty_pages_pct`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct)未达到阈值。

自适应刷新算法通过跟踪缓冲池中脏页的数量和重做日志记录的生成速率来帮助避免这种情况。根据这些信息，它决定每秒从缓冲池中清除多少脏页，这允许它管理工作负载的突然变化。

这个[`innodb_自适应_刷新_lwm`](innodb-parameters.html#sysvar_innodb_adaptive_flushing_lwm)变量定义重做日志容量的低水位线。当超过该阈值时，即使[`innodb_自适应_刷新`](innodb-parameters.html#sysvar_innodb_adaptive_flushing)变量已禁用。

内部基准测试表明，该算法不仅可以随时间保持吞吐量，还可以显著提高总体吞吐量。然而，自适应刷新可能会显著影响工作负载的I/O模式，并且可能并不适用于所有情况。当重做日志有被填满的危险时，它提供了最大的好处。如果自适应刷新不适合工作负载的特点，可以禁用它。自适应冲洗由[`innodb_自适应_刷新`](innodb-parameters.html#sysvar_innodb_adaptive_flushing)变量，默认情况下已启用。

[`innodb_法拉盛_平均_循环`](innodb-parameters.html#sysvar_innodb_flushing_avg_loops)定义所需的迭代次数`InnoDB`保留先前计算的刷新状态快照，控制自适应刷新响应前台工作负载更改的速度。高[`innodb_法拉盛_平均_循环`](innodb-parameters.html#sysvar_innodb_flushing_avg_loops)价值意味着`InnoDB`使以前计算的快照保持更长的时间，因此自适应刷新响应更慢。设置高值时，重要的是确保重做日志利用率不达到75%（异步刷新开始时的硬编码限制），并且[`innodb_max_dirty_pages_pct`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct)阈值将脏页数保持在适合工作负载的水平。

具有一致工作负载、较大日志文件大小的系统([`innodb_日志_文件_大小`](innodb-parameters.html#sysvar_innodb_log_file_size))，以及未达到75%日志空间利用率的小峰值应使用高[`innodb_法拉盛_平均_循环`](innodb-parameters.html#sysvar_innodb_flushing_avg_loops)值，以尽可能保持冲洗顺畅。对于具有极端负载峰值或不提供大量空间的日志文件的系统，较小的值允许刷新来密切跟踪工作负载变化，并有助于避免达到75%的日志空间利用率。

请注意，如果刷新落后，缓冲池刷新的速率可能会超过可用的I/O容量`InnoDB`，定义如下：[`innodb_io_容量`](innodb-parameters.html#sysvar_innodb_io_capacity)背景这个[`innodb_io_容量_最大值`](innodb-parameters.html#sysvar_innodb_io_capacity_max)值定义了这种情况下I/O容量的上限，以便I/O活动的峰值不会消耗服务器的整个I/O容量。

这个[`innodb_io_容量`](innodb-parameters.html#sysvar_innodb_io_capacity)该设置适用于所有缓冲池实例。刷新脏页时，I/O容量在缓冲池实例之间平均分配。

##### 在空闲期间限制缓冲区刷新

从MySQL 8.0.18开始，您可以使用[`innodb_空闲_刷新_pct`](innodb-parameters.html#sysvar_innodb_idle_flush_pct)变量，以限制空闲期间缓冲池刷新的速率，空闲期间是不修改数据库页的时间段。这个[`innodb_空闲_刷新_pct`](innodb-parameters.html#sysvar_innodb_idle_flush_pct)值是[`innodb_io_容量`](innodb-parameters.html#sysvar_innodb_io_capacity)设置，它定义每秒可供用户使用的I/O操作数`InnoDB`.默认值[`innodb_空闲_刷新_pct`](innodb-parameters.html#sysvar_innodb_idle_flush_pct)值为100，这是[`innodb_io_容量`](innodb-parameters.html#sysvar_innodb_io_capacity)背景要限制怠速期间的冲洗，请定义[`innodb_空闲_刷新_pct`](innodb-parameters.html#sysvar_innodb_idle_flush_pct)值小于100。

在空闲期间限制页面刷新有助于延长固态存储设备的使用寿命。在空闲期间限制页面刷新的副作用可能包括长时间空闲后更长的关机时间，以及发生服务器故障时更长的恢复时间。
