14.8.8 配置 InnoDB I/O 容量

InnoDB主线程和其他线程在后台执行各种任务,其中大多数与 I/O 相关,例如从缓冲池中刷新脏页,并将更改从更改缓冲区写入适当的二级索引。 InnoDB尝试以不会对服务器的正常工作产生不利影响的方式执行这些任务。它尝试估计可用的 I/O 带宽并调整其活动以利用可用容量。

innodb_io_capacity变量定义InnoDB可用的总体 I/O 容量。应该将其设置为大约系统每秒可以执行的 I/O 操作数(IOPS)。设置innodb_io_capacity时,InnoDB根据设置的值估计可用于后台任务的 I/O 带宽。

您可以将innodb_io_capacity设置为 100 或更大的值。默认值为200。通常,大约 100 的值适用于 Consumer 级别的存储设备,例如最高 7200 RPM 的硬盘驱动器。更快的硬盘,RAID 配置和固态驱动器(SSD)受益于更高的价值。

理想情况下,将设置保持在尽可能低的水平,但又不要过低,以免后台活动落后。如果该值太高,则会从缓冲池中删除数据,并且过快地更改缓冲区以进行缓存会带来很大的好处。对于具有较高 I/O 速率的繁忙系统,您可以设置较高的值以帮助服务器处理与高行更改率相关的后台维护工作。通常,您可以根据用于InnoDB I/O 的驱动器数量来增加该值。例如,您可以在使用多个磁盘或 SSD 的系统上增加该值。

对于低端 SSD,默认设置 200 通常就足够了。对于高端的,总线连接的 SSD,请考虑更高的设置,例如 1000.对于具有单个 5400 RPM 或 7200 RPM 驱动器的系统,您可以将该值降低到 100,这 table 示可执行约 100 IOPS 的较老磁盘驱动器可用的每秒 I/O 操作(IOPS)的估计比例。

尽管您可以指定一个较高的值,例如一百万,但实际上,这样的大值几乎没有好处。通常,建议不要使用大于 20000 的值,除非您确定较低的值不足以满足您的工作量。

调整innodb_io_capacity时考虑写入工作量。具有较大写入工作量的系统可能会受益于更高的设置。对于写入工作量较小的系统,较低的设置可能就足够了。

innodb_io_capacity设置不是每个缓冲池实例设置。可用 I/O 容量在缓冲池实例之间平均分配以进行刷新活动。

您可以在 MySQL 选项文件(my.cnfmy.ini)中设置innodb_io_capacity值,也可以在运行时使用SET GLOBAL语句对其进行修改,该语句需要足够的权限才能设置全局系统变量。参见第 5.1.8.1 节“系统变量特权”

忽略检查点的 I/O 容量

默认情况下启用的innodb_flush_sync变量使checkpoints发生 I/O 活动突发时忽略innodb_io_capacity设置。要遵守innodb_io_capacity设置定义的 I/O 速率,请禁用innodb_flush_sync

您可以在 MySQL 选项文件(my.cnfmy.ini)中设置innodb_flush_sync值,也可以在运行时使用SET GLOBAL语句对其进行修改,该语句需要足够的权限才能设置全局系统变量。参见第 5.1.8.1 节“系统变量特权”

配置最大 I/O 容量

如果刷新活动滞后,则InnoDB可以以比innodb_io_capacity变量所定义的更高的每秒 I/O 操作(IOPS)速率更积极地进行刷新。 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 或多个常规磁盘驱动器的工作负载。对于不使用 SSD 或多个磁盘驱动器的工作负载,设置为 2000 可能太高,并且可能允许过多的刷新。对于单个常规磁盘驱动器,建议设置在 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设置为DEFAULT会将innodb_io_capacity_max设置为最大值。

innodb_io_capacity_max限制适用于所有缓冲池实例。它不是每个缓冲池实例设置。