10.5.4 优化 InnoDB 重做日志
以下是为优化重做日志配置的一些指导原则:
-
增加您的重做日志文件大小。当
InnoDB
写入了满的重做日志文件,它必须将缓冲池中的修改内容写入到磁盘中进行一个 检查点。小的重做日志文件会导致许多不必要的磁盘写入。重做日志文件大小由
innodb_redo_log_capacity
决定。InnoDB
尝试维护 32 个相同大小的重做日志文件,每个文件等于innodb_redo_log_capacity
的 1/32。因此,改变innodb_redo_log_capacity
设置会改变重做日志文件的大小。有关修改您的重做日志文件配置的信息,请参阅第 17.6.5 节,“Redo Log”。
-
考虑增加 日志缓冲区 的大小。一个大的日志缓冲区允许大事务运行而不需要在事务 提交 之前写入日志到磁盘。因此,如果您有的事务更新、插入或删除许多行,增加日志缓冲区的大小可以节省磁盘 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
:定义了在等待刷盘redo时,用户线程不再spin的最小CPU使用量。该值以CPU核心的使用百分比表示。例如,默认值为80,即一个CPU核心的80%。在多核处理器系统上,一值为150代表一个CPU核心的100%使用率加上另一个CPU核心的50%使用率。 -
innodb_log_spin_cpu_pct_hwm
:定义了在等待刷盘redo时,用户线程不再spin的最大CPU使用百分比。该值以所有CPU核心总处理能力的百分比表示。默认值为50%。例如,在服务器上有四个CPU核心的情况下,两个CPU核心的100%使用率相当于服务器的50%处理能力。配置选项
innodb_log_spin_cpu_pct_hwm
会尊重处理器亲和性。例如,如果服务器有48个核心,但mysqld进程被固定到仅四个CPU核心上,那么其他44个CPU核心将被忽略。
-