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 或更大。默认值为 10000
。通常,更快的硬盘驱动器、RAID 配置和固态驱动器 (SSD) 比低端存储设备(例如高达 7200 RPM 的硬盘驱动器)更能从更高的值中受益。
理想情况下,请尽可能低地保持设置,但不要低到后台活动落后的程度。如果该值太高,则数据会从缓冲池和更改缓冲区中删除得太快,以至于缓存无法提供显着的优势。对于能够处理更高 I/O 速率的繁忙系统,您可以设置更高的值来帮助服务器处理与高行更改率相关的后台维护工作。通常,您可以根据用于 InnoDB
I/O 的驱动器数量来增加该值。例如,您可以在使用多个磁盘或 SSD 的系统上增加该值。
尽管您可以指定较高的值(例如一百万),但在实践中,如此大的值几乎没有好处。通常,除非您确定较低的值不足以满足您的工作负载,否则不建议使用高于 20000 的值。另请参阅 innodb_io_capacity_max
选项,该选项在刷新落后时自动增加此值。
调整 innodb_io_capacity
时请考虑写入工作负载。写入工作负载较大的系统可能会从更高的设置中受益。对于写入工作负载较小的系统,较低的设置可能就足够了。
innodb_io_capacity
设置不是每个缓冲池实例的设置。可用的 I/O 容量在缓冲池实例之间平均分配,用于刷新活动。
您可以在 MySQL 选项文件(my.cnf
或 my.ini
)中设置 innodb_io_capacity
值,或在运行时使用 SET GLOBAL
语句修改它,这需要足够的权限才能设置全局系统变量。请参阅 第 7.1.9.1 节“系统变量权限”。
默认情况下启用的 innodb_flush_sync
变量会导致在 检查点 发生的 I/O 活动突发期间忽略 innodb_io_capacity
设置。要遵循 innodb_io_capacity
和 innodb_io_capacity_max
设置定义的 I/O 速率,请禁用 innodb_flush_sync
。
您可以在 MySQL 选项文件(my.cnf
或 my.ini
)中设置 innodb_flush_sync
的值,或者在运行时使用 SET GLOBAL
语句修改它,这需要有足够的权限来设置全局系统变量。参见 第 7.1.9.1 节,“系统变量权限”。
如果刷新活动落后,InnoDB
可以更积极地刷新,其每秒 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
值的值。
使用 SET
语句(SET GLOBAL innodb_io_capacity_max=DEFAULT
)将 innodb_io_capacity_max
设置为 DEFAULT
会将 innodb_io_capacity_max
设置为默认值。在 MySQL 8.4 之前,这会将其设置为最大值而不是默认值。
innodb_io_capacity_max
限制适用于所有缓冲池实例。它不是每个缓冲池实例的设置。