InnoDB
在后台执行某些任务,包括从缓冲池中清除脏页。脏页是那些已被修改但尚未写入磁盘上的数据文件的页。
在MySQL 8.0中,缓冲池刷新是由页面清理线程执行的。控件控制页清除线程的数量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
变量定义从缓冲池刷新页面是否也以相同程度刷新其他脏页。默认设置为0将禁用
innodb_flush_neighbors
.相同范围内的脏页不会被刷新。对于寻道时间不是重要因素的非旋转存储(SSD)设备,建议设置此设置。设置为1将以相同的范围刷新连续的脏页。
设置为2将在相同的范围内刷新脏页。
当表数据存储在传统的硬盘驱动器在存储设备中,与在不同时间刷新单个页面相比,在一次操作中刷新邻居页面可以减少I/O开销(主要用于磁盘寻道操作)。用于存储的表数据固态硬盘,查找时间不是一个重要因素,您可以禁用此设置以分散写操作。
的
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
Threshold将脏页数量保持在适合工作负载的水平。
具有一致工作负载的系统,日志文件大小较大(innodb_log_file_size
),而没有达到75%日志空间利用率的小峰值应该使用较高的innodb_flushing_avg_loops
值保持冲洗尽可能顺畅。对于具有极端负载峰值或不提供大量空间的日志文件的系统,较小的值允许刷新以密切跟踪工作负载更改,并有助于避免达到75%的日志空间利用率。
请注意,如果刷新速度落后,缓冲池的刷新速度可能会超过可用的I/O容量InnoDB
,定义为innodb_io_capacity
设置。的innodb_io_capacity_max
value定义了在这种情况下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
Value是100,也就是100%innodb_io_capacity
设置。若要限制空闲期间的刷新,请定义innodb_idle_flush_pct
值小于100。
在空闲期间限制页面刷新有助于延长固态存储设备的使用寿命。在空闲期间限制页面刷新的副作用可能包括在长空闲时间之后更长的关机时间,以及在服务器发生故障时更长的恢复时间。