Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

17.8.3.5 缓冲池刷新配置

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

在 MySQL 8.3 中,缓冲池刷新由页清洁器线程执行。页清洁器线程的数量由 innodb_page_cleaners 变量控制,默认值为 4。但是,如果页清洁器线程的数量超过缓冲池实例的数量,innodb_page_cleaners 将自动设置为与 innodb_buffer_pool_instances 相同的值。

缓冲池刷新是在脏页百分比达到低水位值时触发的,该值由 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_max_dirty_pages_pct_lwm 时,值应始终小于 innodb_max_dirty_pages_pct 值。

其他变量允许对缓冲池刷新行为进行微调:

  • 变量 innodb_flush_neighbors 定义了是否在刷新缓冲池页面时也刷新同一 extent 中的其他脏页。

    • 默认设置为 0,禁用 innodb_flush_neighbors。同一 extent 中的脏页不会被刷新。这是推荐的设置,对于非旋转存储(SSD)设备,seek 时间不是一个重要因素。

    • 设置为 1 刷新同一 extent 中的相邻脏页。

    • 设置为 2 刷新同一 extent 中的脏页。

    当表数据存储在传统的 HDD 存储设备上时,在同一操作中刷新邻近页可以减少 I/O 开销(主要是磁盘 seek 操作)。对于存储在 SSD 上的表数据,seek 时间不是一个重要因素,可以禁用该设置以分散写操作。

  • 变量 innodb_lru_scan_depth 指定了每个缓冲池实例中,页清洁器线程扫描脏页的深度,以便刷新脏页。这是一个后台操作,每秒执行一次。

    较小的设置通常适合大多数工作负载。较高的值可能会影响性能。只有在有闲置 I/O 容量的情况下,才考虑增加该值。相反,如果写入密集型工作负载饱和了 I/O 容量,特别是在大缓冲池的情况下,减少该值。

    调整 innodb_lru_scan_depth 时,从低值开始,并逐步增加,以避免出现零空闲页的情况。此外,还需要考虑调整 innodb_lru_scan_depth 时,缓冲池实例的数量,因为 innodb_lru_scan_depth * innodb_buffer_pool_instances 定义了每秒执行的工作量。

变量 innodb_flush_neighborsinnodb_lru_scan_depth 主要用于写入密集型工作负载。在大量 DML 活动的情况下,如果刷新不够积极,或者磁盘写入可能会饱和 I/O 容量,如果刷新太积极。理想的设置取决于您的工作负载、数据访问模式和存储配置(例如,数据是否存储在 HDD 或 SSD 设备上)。

自适应刷新

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

尖锐检查点,通常与写入密集型工作负载相关,可能会导致吞吐量的突然变化,例如。当 InnoDB 想要重用日志文件的一部分时,所有脏页都必须被刷新。如果日志文件变满,尖锐检查点就会发生,导致暂时性的吞吐量下降。这种情况可能会发生,即使 innodb_max_dirty_pages_pct 阈值未达到。

自适应刷新算法通过跟踪缓冲池中的脏页数量和 redo 日志记录生成率来避免这种情况。基于这些信息,它决定每秒从缓冲池中刷新多少脏页,以便管理工作负载的突然变化。

变量 innodb_adaptive_flushing_lwm 定义了 redo 日志容量的低水位标记。当该阈值被跨越时,自适应刷新将被启用,即使 innodb_adaptive_flushing 变量被禁用。

内部基准测试表明,该算法不仅可以维持吞吐量,还可以显著提高总体吞吐量。然而,自适应刷新可能会对工作负载的 I/O 模式产生显著影响,并且不适合所有情况。如果自适应刷新不适合您的工作负载特征,可以禁用它。自适应刷新由 innodb_adaptive_flushing 变量控制,默认情况下启用。

innodb_flushing_avg_loops 定义了 InnoDB 保持之前计算的刷新状态快照的迭代次数,控制自适应刷新对前台工作负载变化的响应速度。高 innodb_flushing_avg_loops 值意味着 InnoDB 保持之前计算的快照更长时间,因此自适应刷新响应更慢。在设置高值时,需要确保 redo 日志利用率不超过 75%(硬编码的限制),并且 innodb_max_dirty_pages_pct 阈值保持脏页数量在适合工作负载的水平。

具有稳定工作负载的大型日志文件大小 (innodb_log_file_size) 和小型尖峰的系统应该使用高 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容量被平均分配给缓冲池实例。

限制空闲期间的缓冲刷新率

innodb_idle_flush_pct变量限制了空闲期间缓冲池刷新的速率,即数据库页面未被修改的时间段。其值被解释为innodb_io_capacity(定义每秒可用的I/O操作数)的百分比。默认值为100,即innodb_io_capacity的100%。要限制空闲期间的刷新,设置innodb_idle_flush_pct小于100。

限制空闲期间的页刷新可以帮助延长固态存储设备的使用寿命。限制空闲期间的页刷新可能会导致shutdown时间延长,或者在服务器故障后恢复时间延长。