请考虑以下redo日志优化指南:
-
增加redo日志文件的大小。当
InnoDB
写满redo日志文件时,它必须将缓冲池的修改内容写入磁盘,以便 检查点。小的redo日志文件会导致许多不必要的磁盘写入。redo日志文件的大小由
innodb_redo_log_capacity
确定。InnoDB
尝试维护 32 个redo日志文件,每个文件的大小为innodb_redo_log_capacity
的 1/32。因此,修改innodb_redo_log_capacity
设置将更改redo日志文件的大小。有关修改redo日志文件配置的信息,请参阅 第 17.6.5 节,“Redo Log”。
-
考虑增加 日志缓冲区 的大小。大型日志缓冲区使大型 事务 可以在提交前不需要将日志写入磁盘,从而节省磁盘 I/O。日志缓冲区的大小可以使用
innodb_log_buffer_size
配置选项进行配置,该选项可以在 MySQL 8.3 中动态配置。 -
配置
innodb_log_write_ahead_size
配置选项,以避免 “读取-写入”。该选项定义 redo 日志的写入块大小。将innodb_log_write_ahead_size
设置为操作系统或文件系统缓存块大小。有效的
innodb_log_write_ahead_size
值是InnoDB
日志文件块大小(2n)的倍数。最小值是InnoDB
日志文件块大小(512)。写入不发生时指定最小值。最大值等于innodb_page_size
值。如果您指定的innodb_log_write_ahead_size
值大于innodb_page_size
值,则innodb_log_write_ahead_size
设置将被截断为innodb_page_size
值。将
innodb_log_write_ahead_size
值设置得太低,相对于操作系统或文件系统缓存块大小,会导致读取-写入。将值设置得太高可能会对fsync
性能产生轻微影响,因为多个块将被同时写入。 -
MySQL 提供了专门的日志写入线程,以便从日志缓冲区写入 redo 日志记录到系统缓冲区,并将系统缓冲区刷新到 redo 日志文件中。您可以使用
innodb_log_writer_threads
变量启用或禁用日志写入线程。专门的日志写入线程可以在高并发系统上提高性能,但对于低并发系统,禁用专门的日志写入线程可能提供更好的性能。 -
优化用户线程等待刷新 redo 的自旋延迟。自旋延迟有助于减少延迟。在低并发期间,减少延迟可能不是优先考虑的目标,因此在这些期间避免使用自旋延迟可能会减少能耗。在高并发期间,您可能不想浪费处理能力来执行自旋延迟,以便将其用于其他工作。以下系统变量允许设置高水位和低水位值,以定义自旋延迟的使用边界。
-
innodb_log_wait_for_flush_spin_hwm
:定义了日志刷新的最大平均等待时间,超过这个时间,用户线程将不再旋转等待已刷新的重做日志。默认值为400微秒。 -
innodb_log_spin_cpu_abs_lwm
:定义了用户线程旋转等待已刷新重做日志时的最小CPU使用率。该值以CPU核心使用率的总和表示。例如,默认值80表示单个CPU核心的80%。在具有多核心处理器的系统上,值150表示一个CPU核心的100%使用率加上第二个CPU核心的50%使用率。 -
innodb_log_spin_cpu_pct_hwm
:定义了用户线程旋转等待已刷新重做日志时的最大CPU使用率。该值以所有CPU核心的总处理能力的百分比表示。默认值为50%。例如,两个CPU核心的100%使用率相当于四个CPU核心服务器上总处理能力的50%。配置选项
innodb_log_spin_cpu_pct_hwm
尊重处理器亲和力。例如,如果服务器有48个核心,但mysqld进程仅固定在四个CPU核心上,那么其他44个CPU核心将被忽略。
-