请考虑以下优化重做日志记录的准则
增加重做日志文件的大小。当
InnoDB
已将重做日志文件写满时,它必须在 检查点 将缓冲池中已修改的内容写入磁盘。小的重做日志文件会导致许多不必要的磁盘写入。重做日志文件的大小由
innodb_redo_log_capacity
决定。InnoDB
尝试维护 32 个大小相同的重做日志文件,每个文件等于 1/32 *innodb_redo_log_capacity
。因此,更改innodb_redo_log_capacity
设置会更改重做日志文件的大小。有关修改重做日志文件配置的信息,请参阅 第 17.6.5 节“重做日志”。
考虑增加 日志缓冲区 的大小。大型日志缓冲区允许大型 事务 在事务 提交 之前无需将日志写入磁盘即可运行。因此,如果您有更新、插入或删除多行的 事务,则增大日志缓冲区可以节省磁盘 I/O。日志缓冲区大小使用
innodb_log_buffer_size
配置选项进行配置,该选项可以动态配置。配置
innodb_log_write_ahead_size
配置选项以避免““读后写”。此选项定义重做日志的预写块大小。设置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 提供了专用的日志写入器线程,用于将重做日志记录从日志缓冲区写入系统缓冲区,并将系统缓冲区刷新到重做日志文件。您可以使用
innodb_log_writer_threads
变量启用或禁用日志写入器线程。专用日志写入器线程可以提高高并发系统的性能,但对于低并发系统,禁用专用日志写入器线程可以提供更好的性能。优化用户线程等待刷新重做时的自旋延迟使用。自旋延迟有助于减少延迟。在并发量较低的时期,减少延迟可能不是优先事项,并且在这些时期避免使用自旋延迟可以降低能耗。在高并发期间,您可能希望避免在自旋延迟上花费处理能力,以便将其用于其他工作。以下系统变量允许设置高水位线和低水位线值,以定义自旋延迟的使用边界。
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 核心的服务器上,两个 CPU 核心使用率为 100% 表示组合 CPU 处理能力的 50%。innodb_log_spin_cpu_pct_hwm
配置选项考虑了处理器关联性。例如,如果服务器有 48 个核心,但 mysqld 进程仅固定到四个 CPU 核心,则会忽略其他 44 个 CPU 核心。