The InnoDB
主线程和其他线程在后台执行各种任务,大多数是I/O相关的,例如从缓冲池中刷新脏页和将更改从更改缓冲区写入适当的次要索引。InnoDB
尝试以不影响服务器正常工作的方式执行这些任务。它尝试估算可用的I/O带宽并调整活动以充分利用可用的容量。
The innodb_io_capacity
变量定义了 InnoDB
可用的总I/O容量。它应该设置为系统每秒可以执行的I/O操作数(IOPS)。当 innodb_io_capacity
被设置时,InnoDB
根据设置的值估算背景任务的I/O带宽。
您可以将 innodb_io_capacity
设置为100或更高的值。默认值是 200
。通常,对于消费级存储设备,如7200 RPM的硬盘,值约为100。更快的硬盘、RAID配置和固态硬盘(SSDs)可以从更高的值中受益。
理想情况下,保持设置尽可能低,但不要太低,以免背景活动落后。如果值太高,缓冲池和更改缓冲区中的数据将被太快地删除,以至于缓存无法提供明显的益处。对于能够处理高I/O率的繁忙系统,您可以设置更高的值,以帮助服务器处理高行更改率相关的背景维护工作。通常,您可以根据 InnoDB
I/O使用的磁盘数量增加值。例如,在使用多个磁盘或SSDs的系统上,您可以增加值。
默认设置的200通常足以满足低端SSD的需求。对于高端、总线连接的SSD,考虑设置更高的值,例如1000。对于具有单个5400 RPM或7200 RPM驱动器的系统,您可能需要将值降低到100,这代表了旧一代磁盘驱动器每秒可以执行的I/O操作数(IOPS),约为100 IOPS。
尽管您可以指定高达一百万的值,但是在实践中这些大值几乎没有益处。通常,不建议将值设置得太高,除非您确定较低的值不足以满足您的工作负载。
在调整 innodb_io_capacity
时,考虑写入工作负载。具有大写入工作负载的系统可能会从更高的设置中受益。对于具有小写入工作负载的系统,较低的设置可能足够。
The innodb_io_capacity
设置不是每个缓冲池实例的设置。可用的I/O容量将被平均分配到缓冲池实例中,以便刷新活动。
您可以在MySQL选项文件(my.cnf
或 my.ini
)中设置 innodb_io_capacity
值,或者使用 SET GLOBAL
语句在运行时修改它,这需要足够的权限来设置全局系统变量。见 Section 7.1.9.1, “System Variable Privileges”。
The innodb_flush_sync
变量,默认情况下启用,会导致 innodb_io_capacity
设置在检查点期间被忽略。要遵守 innodb_io_capacity
设置的I/O率,禁用 innodb_flush_sync
。
您可以在 MySQL 选项文件 (my.cnf
或 my.ini
) 中设置 innodb_flush_sync
值,或者使用 SET GLOBAL
语句在运行时修改它,这需要足够的权限来设置全局系统变量。请参阅 第 7.1.9.1 节,“系统变量权限”。
如果刷新活动落后,InnoDB
可以以更高的 IOPS 率(每秒 I/O 操作数)刷新,高于 innodb_io_capacity
变量定义的值。innodb_io_capacity_max
变量定义了在这种情况下 InnoDB
后台任务执行的最大 IOPS 数。
如果您在启动时指定了 innodb_io_capacity
设置,但没有指定 innodb_io_capacity_max
的值,则 innodb_io_capacity_max
将默认为 innodb_io_capacity
的两倍或 2000,取较大值。
在配置 innodb_io_capacity_max
时,通常将 innodb_io_capacity
的两倍作为起点。默认值 2000 是为使用 SSD 或多个磁盘驱动器的工作负载设计的。对于单个磁盘驱动器,建议设置为 200 到 400 之间的值。对于高端、总线连接的 SSD,考虑设置为 2500。与 innodb_io_capacity
设置一样,尽量将设置保持在尽可能低的水平,但不能太低,以便 InnoDB
无法足够地扩展 IOPS 率超过 innodb_io_capacity
设置。
在调整 innodb_io_capacity_max
时,请考虑写入工作负载。具有大量写入工作负载的系统可能需要更高的设置。对于写入工作负载较小的系统,较低的设置可能足够。
innodb_io_capacity_max
不能设置为低于 innodb_io_capacity
的值。
使用 SET
语句 (SET GLOBAL innodb_io_capacity_max=DEFAULT
) 将 innodb_io_capacity_max
设置为最大值。
innodb_io_capacity_max
限制适用于所有缓冲池实例。这不是每个缓冲池实例的设置。