10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

8.5.8优化InnoDB磁盘I/O

如果您遵循数据库设计和SQL操作调优技术的最佳实践,但由于磁盘I/O活动频繁,数据库仍然很慢,那么可以考虑这些磁盘I/O优化。如果Unix工具或Windows任务管理器显示您的工作负载的CPU使用率小于70%,您的工作负载可能是磁盘绑定的。

  • 增加缓冲池大小

    对象中缓存表数据时InnoDB它可以通过查询重复访问,而不需要任何磁盘I/O。方法指定缓冲池的大小通过innodb_buffer_pool_size选择。这个内存区域非常重要,因此通常建议通过innodb_buffer_pool_size配置为系统内存的50%到75%。更多信息请参见,第8.12.3.1节MySQL如何使用内存

  • 调整冲洗方式

    在某些版本的GNU/Linux和Unix中,用Unix . exe将文件刷新到磁盘fsync ()电话(InnoDB默认使用)和类似的方法速度慢得惊人。如果数据库写性能是一个问题,则使用innodb_flush_method参数设置为O_DSYNC

  • 配置fsync阈值

    默认情况下,当InnoDB创建一个新的数据文件,例如一个新的日志文件或表空间文件,该文件在刷新到磁盘之前完全写入操作系统缓存,这可能会导致一次发生大量的磁盘写活动。若要强制从操作系统缓存中定期刷新较小的数据,可以使用innodb_fsync_threshold变量定义阈值(以字节为单位)。当达到字节阈值时,操作系统缓存的内容将被刷新到磁盘。默认值0强制执行默认行为,即只有在文件完全写入缓存后才将数据刷新到磁盘。

    在多个MySQL实例使用相同存储设备的情况下,指定一个阈值强制更小的周期性刷新可能是有益的。例如,创建一个新的MySQL实例及其关联的数据文件可能会导致磁盘写活动的大量激增,从而影响使用相同存储设备的其他MySQL实例的性能。配置阈值有助于避免写入活动中的这种激增。

  • 在Linux上使用带有本机AIO的noop或deadline I/O调度器

    InnoDB使用Linux上的异步I/O子系统(本机AIO)对数据文件页执行预读和写请求。控件控制此行为innodb_use_native_aio配置选项,默认启用。对于本机AIO, I/O调度器的类型对I/O性能的影响更大。一般建议使用noop和deadline I/O调度器。进行基准测试,以确定哪个I/O调度器为您的工作负载和环境提供了最佳的结果。有关更多信息,请参见第15.8.6节“在Linux上使用异步I/O”

  • 在Solaris 10上使用x86_64架构的直接I/O

    当使用InnoDB存储引擎在Solaris 10上为x86_64架构(AMD Opteron),使用直接I/OInnoDB相关文件,以避免降级InnoDB的性能。对用于存储的整个UFS文件系统使用直接I/OInnoDB相关文件,用forcedirectio选择;看到mount_ufs(1米)。(在Solaris 10/x86_64上的默认值是使用此选项。)直接I/O只应用于InnoDB文件操作而不是整个文件系统设置innodb_flush_method = O_DIRECT。这个设置,InnoDB调用译:()而不是fcntl ()用于I/O到数据文件(而不是I/O到日志文件)。

  • 对Solaris 2.6或更高版本的数据和日志文件使用原始存储

    当使用InnoDB存储引擎用大通过innodb_buffer_pool_size在Solaris 2.6及以上版本和任何平台(sparc/x86/x64/amd64)上进行基准测试InnoDB数据文件和日志文件在原始设备上或在单独的直接I/O UFS文件系统上,使用forcedirectio如上所述的挂载选项。(有必要使用mount选项而不是设置innodb_flush_method如果你想直接I/O日志文件。)Veritas文件系统VxFS的用户应该使用convosync =直接挂载选项。

    不放置其他MySQL数据文件,如那些MyISAM表,在直接I/O文件系统上。可执行文件或库不得放在直接I/O文件系统上。

  • 使用额外的存储设备

    可以使用其他存储设备来设置RAID配置。相关信息请参见第8.12.1节“优化磁盘I/O”

    另外,InnoDB表空间数据文件和日志文件可以放在不同的物理磁盘上。有关更多信息,请参阅以下部分:

  • 考虑non-rotational存储

    非旋转存储通常为随机I/O操作提供更好的性能;以及用于顺序I/O操作的旋转存储。当在旋转和非旋转存储设备上分发数据和日志文件时,要考虑主要在每个文件上执行的I/O操作类型。

    随机面向I/ o的文件通常包括file-per-table而且一般的表空间数据文件,撤消表空间文件,临时表空间文件。面向顺序I/ o的文件包括InnoDB系统表空间文件(由于doublewrite缓冲之前的MySQL 8.0.20和改变缓冲), MySQL 8.0.20中引入的doublewrite文件,以及日志文件,如二进制日志文件和重做日志文件。

    使用非旋转存储时,检查以下配置选项的设置:

    • innodb_checksum_algorithm

      crc32Option使用更快的校验和算法,推荐用于快速的存储系统。

    • innodb_flush_neighbors

      为旋转存储设备优化I/O。对于非旋转存储或混合旋转和非旋转存储禁用它。默认是禁用的。

    • innodb_idle_flush_pct

      允许在空闲期间限制刷新页面,这有助于延长非旋转存储设备的使用寿命。在MySQL 8.0.18中介绍。

    • innodb_io_capacity

      对于低端非旋转存储设备,默认设置为200就足够了。对于高端、总线连接的设备,考虑更高的设置,如1000。

    • innodb_io_capacity_max

      默认值2000用于使用非旋转存储的工作负载。对于高端的、总线连接的非旋转存储设备,请考虑更高的设置,例如2500。

    • innodb_log_compressed_pages

      如果重做日志位于非旋转存储上,请考虑禁用此选项以减少日志记录。看到禁用压缩页面的日志记录

    • innodb_log_file_size

      如果重做日志在非旋转存储上,配置此选项以最大化缓存和写组合。

    • innodb_page_size

      考虑使用与磁盘内部扇区大小匹配的页面大小。早期的SSD设备通常扇区大小为4KB。一些较新的设备扇区大小为16KB。默认的InnoDB页面大小为16KB。保持页面大小接近存储设备块大小可以将重写到磁盘的未更改数据量降到最低。

    • binlog_row_image

      如果二进制日志位于非旋转存储上,并且所有表都有主键,请考虑将此选项设置为最小的减少日志记录。

    确保您的操作系统启用了TRIM支持。它通常在默认情况下是启用的。

  • 增加I/O容量,避免出现系统积压

    如果吞吐量周期性下降,因为InnoDB检查点操作时,考虑增加的值innodb_io_capacity配置选项。数值越高,频率越高冲洗,避免可能导致吞吐量下降的工作积压。

  • 如果不延迟刷新,则会降低I/O容量

    如果系统没有落后InnoDB冲洗操作时,考虑降低值innodb_io_capacity配置选项。通常,您将这个选项值保持在尽可能低的水平,但不要低到导致吞吐量周期性下降的程度,如前面提到的那样。在可以降低选项值的典型场景中,您可能会在的输出中看到类似这样的组合显示引擎innodb状态

    • 历史名单长度低,在几千以下。

    • 在插入的行附近插入缓冲区合并。

    • 修改的页面在缓冲池一致低于innodb_max_dirty_pages_pct缓冲池的。(在服务器不进行批量插入时进行度量;在批量插入期间,修改的页面百分比显著上升是正常的。)

    • 日志序列号-最后一个检查点是否小于7/8或者理想情况下小于总尺寸的6/8InnoDB日志文件

  • 在Fusion-io设备上存放系统表空间文件

    通过将包含doublewrite存储区域的文件存储在支持原子写的Fusion-io设备上,您可以利用与doublewrite缓冲区相关的I/O优化。在MySQL 8.0.20之前,doublewrite缓冲区存储位于系统表空间数据文件中。从MySQL 8.0.20开始,存储区域驻留在doublewrite文件中。看到第15.6.4节," Doublewrite Buffer ")。当在支持原子写的Fusion-io设备上放置doublewrite存储区文件时,会自动关闭doublewrite缓冲区,所有数据文件都使用Fusion-io原子写。该特性仅在Fusion-io硬件上支持,在Linux操作系统上仅在Fusion-io nvfs上启用。为了充分利用这一特性,一个innodb_flush_method设置O_DIRECT建议。

    请注意

    由于doublewrite缓冲区设置是全局的,所以对于不在Fusion-io硬件上的数据文件,也会禁用doublewrite缓冲区。

  • 禁用压缩页面的日志记录

    当使用InnoDB表格压缩功能,图像重新压缩页面都是写给重做日志当对压缩数据进行更改时。此行为由innodb_log_compressed_pages的不同版本时可能发生的损坏zlib恢复过程中使用压缩算法。如果你确定zlib版本不可更改,禁用innodb_log_compressed_pages减少修改压缩数据的工作负载产生重做日志。