17.8.7 InnoDB I/O容量配置
InnoDB 主线程和其他线程在后台执行各种任务,大多数是I/O相关的任务,如从缓冲池中刷新脏页和将更改 buffer 写入适当的次要索引。InnoDB
尝试以不影响服务器正常工作的方式执行这些任务。它尝试估算可用的I/O带宽,并根据可用容量调整活动。
innodb_io_capacity
变量定义了对 InnoDB 的总I/O容量。它应该设置为系统每秒可以执行的I/O操作数(IOPS)。当innodb_io_capacity
设置时,InnoDB 根据设置值估算背景任务的I/O带宽。
您可以将innodb_io_capacity
设置为100或更高。默认值是10000
。通常,高速硬盘、RAID 配置和固态驱动器(SSD)受益于较高的值,而低端存储设备,如7200 RPM硬盘,则不太需要。
理想情况下,保持设置的值尽量低,但不要太低,以免背景活动落后。如果值太高,数据将从缓冲池和更改缓存中移除太快,从而无法提供明显的缓存 benefit。对于忙碌系统,可以将值设置得更高,以帮助服务器处理与高行变化率相关的背景维护工作。通常,您可以根据用于InnoDB
I/ O 的磁盘数量来增加值。例如,在使用多个磁盘或SSDs的系统上,您可以增加值。
虽然您可以指定一个高值,如100万,但在实际应用中,这样的大值对性能影响很小。通常,超过20000的值不推荐,除非您确定较低的值不足以满足您的工作负载。请参阅innodb_io_capacity_max
选项,该选项在flushing落后时自动增加该值。
在调整innodb_io_capacity
时,考虑写入工作负载。具有大规模写入工作负载的系统可能会从更高的设置中受益。较低的设置可能足以满足具有小规模写入工作负载的系统。
innodb_io_capacity
设置不是每个缓冲池实例的设置。可用的I/O容量将等分地分布于缓冲池实例中,以便flushing活动。
您可以在 MySQL 选项文件 (my.cnf
或 my.ini
) 中设置innodb_io_capacity
值,也可以在运行时使用SET GLOBAL
语句,需要具有设置全局系统变量的权限。请参阅第7.1.9.1节,“系统变量权限”。
默认情况下启用的innodb_flush_sync
变量会在检查点期间忽略innodb_io_capacity
设置,以确保在 I/O 活动的高峰期保持 I/O 速率。要遵守innodb_io_capacity
和innodb_io_capacity_max
设置,请禁用innodb_flush_sync
。
您可以在 MySQL 选项文件 (my.cnf
或 my.ini
) 中设置innodb_flush_sync
值,也可以在运行时使用SET GLOBAL
语句,该语句需要具有设置全局系统变量的权限。请参阅第7.1.9.1节,“系统变量权限”。
如果flush活动落后,InnoDB
可以Flush更加积极地,具有更高的I/O操作每秒(IOPS)速率(定义于innodb_io_capacity
变量)。innodb_io_capacity_max
变量定义了在这种情况下InnoDB
背景任务执行的最大IOPS数量。
如果您在启动时指定innodb_io_capacity
设置,但没有指定innodb_io_capacity_max
值,innodb_io_capacity_max
将默认为innodb_io_capacity
的两倍。
在配置innodb_io_capacity_max
时,通常将其设置为innodb_io_capacity
的两倍作为起点。与innodb_io_capacity
设置一样,尽量将设置保持在实际可行的最低值,但不能太低,以免InnoDB
无法满足IOPS的扩展率超过innodb_io_capacity
设置。
在调优innodb_io_capacity_max
时,需要考虑写入工作负载。具有大规模写入工作负载的系统可能会受益于更高的设置。对于具有小规模写入工作负载的系统,较低的设置可能已经足够。
innodb_io_capacity_max
不能设置为小于innodb_io_capacity
值的任何值。
使用innodb_io_capacity_max
设置为DEFAULT
的SET
语句(SET GLOBAL innodb_io_capacity_max=DEFAULT
)将设置innodb_io_capacity_max
为默认值。从MySQL 8.4开始,这将设置为默认值,而不是最大值。在 MySQL 8.3之前,这将设置为最大值。
innodb_io_capacity_max
限制适用于所有缓冲池实例。它不是每个缓冲池实例的设置。