10.5.8 优化 InnoDB 磁盘 I/O

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

增加缓冲池大小

当表数据缓存在 InnoDB 缓冲池中时,查询可以重复访问它,而不需要任何磁盘 I/O。 使用 innodb_buffer_pool_size 选项指定缓冲池的大小。此内存区域非常重要,因此通常建议将 innodb_buffer_pool_size 配置为系统内存的 50% 到 75%。 有关更多信息,请参阅第 10.12.3.1 节“ MySQL 如何使用内存”。

调整刷新方式

在 GNU/Linux 和 Unix 的某些版本中,使用 Unix fsync() 调用( InnoDB 默认使用)和类似方法将文件刷新到磁盘的速度慢得惊人。如果数据库写入性能有问题,请将 innodb_flush_method 参数设置为 O_DSYNC 来执行基准测试。(O_DSYNC 似乎并不常用,它实际上使用的是 O_SYNCfsync() ,并且 InnoDB 不直接使用 O_DSYNC,因为它在许多 Unix 上都存在问题。)

配置操作系统刷新的阈值

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

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

使用 fdatasync() 替代 fsync()

在支持 fdatasync() 系统调用的平台上,MySQL 8.0.26 中引入的 innodb_use_fdatasync 变量允许使用 fdatasync() 而不是 fsync() 进行操作系统刷新。除非后续数据检索需要,否则 fdatasync() 系统调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。

innodb_flush_method 设置的子集(如 fsyncO_DSYNCO_DIRECT) 使用 fsync() 系统调用。innodb_use_fdatasync 变量在使用这些设置时可用。

在 Linux 上将 noopdeadline I/O 调度器与原生 AIO 一起使用

InnoDB 使用 Linux 上的异步 I/O 子系统(native AIO) 来执行数据文件页的预读和写入请求。此行为由 innodb_use_native_aio 配置选项控制,该选项在默认情况下处于启用状态。对于原生 AIO,I/O 调度器的类型对 I/O 性能有更大的影响。通常,建议使用 noopdeadline I/O 调度器。执行基准测试,以确定哪种 I/O 调度程序能为您的工作负载和环境提供最佳结果。有关更多信息,请参阅第 17.8.6 节“在 Linux 上使用异步 I/O”。

在 x86_64 架构的 Solaris 10 上使用 Direct I/O

在 x86_64 架构( AMD Opteron)的 Solaris 10 上使用 InnoDB 存储引擎时,请对 InnoDB 相关文件使用 Direct I/O , 以避免 InnoDB 性能下降。要对用于存储 InnoDB 相关文件的整个 UFS 文件系统使用直接 I/O, 请使用 forcedirectio 选项进行装载;请参见 mount_ufs(1M)。(Solaris 10/x86_64 上的默认设置是不使用此选项。)要仅将直接 I/O 应用于 InnoDB 文件操作而不是整个文件系统,请设置innodb_flush_method = O_DIRECT。 有了这个设置,InnoDB 调用 directio() 而不是 fcntl() 来进行数据文件的 I/O( 不适用于日志文件的 I/O)。

使用 Solaris 2.6 或更高版本对数据和日志文件使用裸设备

当在任何 Solaris 2.6 及以上版本和任何平台( sparc/x86/x64/amd64) 上使用拥有很大的 innodb_buffer_pool_size 值的 InnoDB 存储引擎时,请使用 forcedirectio 挂载选项,在裸设备或单独的直接 I/O UFS 文件系统上对 InnoDB 数据文件和日志文件进行基准测试。(如果要对日志文件进行直接 I/O, 则需要使用挂载选项,而不是设置 innodb_flush_method。)Veritas 文件系统 VxFS 的用户应使用 convosync=direct 挂载选项。

不要将其他 MySQL 数据文件(例如 MyISAM 表的数据文件)放置在直接 I/O 文件系统上。可执行文件或库不得放置在直接 I/O 文件系统上。

使用额外存储设备

可以使用额外存储设备来设置 RAID 配置。有关相关信息,请参阅第 10.12.1 节“优化磁盘 I/O”。

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

  • 第17.8.1节,“InnoDB 启动配置”
  • 第17.6.1.2节,“创建外部表”
  • 创建常规表空间
  • 第17.6.1.4节,“移动或复制InnoDB表”

考虑非旋转(non-rotational)存储

非旋转存储(即非机械硬盘 --译者注)通常为随机 I/O 操作提供更好的性能;旋转存储器(即机械硬盘 --译者注)用于顺序 I/O 操作。在旋转和非旋转存储设备之间分布数据和日志文件时,请考虑主要对每个文件执行的 I/O 操作类型。

面向 I/O 的随机文件通常包括单表表空间(file-per-table)和常规表空间数据文件、undo 表空间文件和临时表空间文件。顺序 I/O 文件包括 InnoDB 系统表空间文件(由于 MySQL 8.0.20 之前的双写缓冲和更改缓冲)、 MySQL 8.0.20 中引入的双写文件,以及二进制日志文件和重做日志文件等日志文件。

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

  • innodb_checksum_algorithm

    crc32 选项使用一种更快的校验和算法,推荐用于高速存储系统。

  • 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 (在 MySQL 8.0.30 中弃用)

    如果重做日志位于非旋转存储上,请配置此选项以最大化缓存和写入合并。

  • innodb_redo_log_capacity

    如果重做日志位于非旋转存储上,请配置此选项以最大化缓存和写入合并。

  • innodb_page_size

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

  • binlog_row_image

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

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

增加 I/O 容量以避免积压(backlog)

如果吞吐量由于 InnoDB 检查点操作而周期性下降,请考虑增加 innodb_io_capacity 配置选项的值。更高的值会导致更频繁的刷新,从而避免可能导致吞吐量下降的积压工作。

如果刷新不落后,降低 I/O 容量

如果系统没有落后于 InnoDB 刷新操作,请考虑降低 innodb_io_capacity 配置选项的值。通常,您会将此选项值保持在尽可能低的水平,但不要低到导致吞吐量周期性下降的程度,如前一条所述。在一个可以降低该选项值的典型场景中,您可能会在 SHOW ENGINE INNODB STATUS 的输出中看到这样的组合:

  • 历史列表长度较低,低于几千。
  • 插入缓冲合并接近于插入的行数。
  • 缓冲池中修改的页面始终远低于缓冲池的 innodb_max_dirty_pages_pct 。(在服务器不进行批量插入时进行测量;在批量插入期间,修改的页面百分比显著上升是正常的。)
  • Log sequence number - Last checkpoint 小于 InnoDB 日志文件总大小的 7/8 ,理想情况下小于 6/8 。

将系统表空间文件存储在 Fusion-IO 设备上

通过将包含双写存储区域的文件存储在支持原子写入的 Fusion-IO 设备上,您可以利用与双写缓冲相关的 I/O 优化。(在 MySQL 8.0.20 之前,双写缓冲存储位于系统表空间数据文件中。从 MySQL 8.0.20 开始,存储区域位于双写文件中。请参阅第 17.6.4 节“双写缓冲”。)当双写存储区域文件放置在支持原子写入的 Fusion-IO 设备上时,会自动禁用双写缓冲,Fusion-IO 原子写入被用于所有数据文件。此功能仅在 Fusion-IO 硬件上受支持,并且仅在 Linux 上为 Fusion-IO NVMFS 启用。为了充分利用此功能,建议将 innodb_flush_method 设置为 O_DIRECT

注意
由于双写缓冲设置是全局的,因此对于不位于 Fusion-IO 硬件上的数据文件,也会禁用双写缓冲。

禁用压缩页面的日志记录

当使用 InnoDB 表压缩功能时,当对压缩数据进行更改时,重新压缩页面的镜像会写入重做日志。此行为由 innodb_log_compressed_pages 控制,默认情况下启用该选项以防止在恢复过程中使用不同版本的 zlib 压缩算法时可能发生的损坏。如果您确信 zlib 版本不会更改,请禁用 innodb_log_compressed_pages, 以减少修改压缩数据的工作负载的重做日志生成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭密无文件勒索病毒攻击,思考网络安全新威胁

前言 最近几年基于无文件攻击的网络犯罪活动越来越多,一些网络犯罪团伙开发了各种基于无文件攻击的恶意软件攻击套件,这些恶意软件攻击套件可用于勒索病毒、挖矿病毒、RAT远控、僵尸网络等恶意软件,在过去的几年时间里,无文件感染…

L1-8 静静的推荐(Python)

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的: 只考虑得分不低于 175 分的学生;一共接受 K 批次的推荐名单;同一批推荐名单上…

Day35:安全开发-JavaEE应用原生反序列化重写方法链条分析触发类类加载

目录 Java-原生使用-序列化&反序列化 Java-安全问题-重写方法&触发方法 Java-安全问题-可控其他类重写方法 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发&…

pandas plot函数:数据可视化的快捷通道

一般来说,我们先用pandas分析数据,然后用matplotlib之类的可视化库来显示分析结果。而pandas库中有一个强大的工具--plot函数,可以使数据可视化变得简单而高效。 1. plot 函数简介 plot函数是pandas中用于数据可视化的一个重要工具&#xff0…

WPF Window 窗口 常用属性

window窗口属性 属性 定义 属性值 注解 WindowStartupLocation 获取或设置窗口首次显示时的位置。 一个 WindowStartupLocation 值,指定窗口首次显示时的顶边/左边位置。 默认值为 Manual。 将 WindowStartupLocation 属性设置为 Manual 使窗口按其 Left 和 To…

MySQL中IF()、IFNULL()、NULLIF()、ISNULL()、CASE函数的使用详解

1、IF()函数的使用 IF函数根据判断条件是否成立进行选择执行,成立时执行一条语句,不成立时执行另一条语句 语法结构: IF(condition, value_if_true, value_if_false) 参数说明 condition: 判断条件 value_if_true: 如果condition的结果…

凌鲨本地接口架构

本地API通过监听本地端口,提供http服务,让本地应用可以获取信息和操作凌鲨客户端。 本地API架构 #mermaid-svg-seodZa6VsI4Qc8Cj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-seodZa6VsI4…

辽宁博学优晨教育:视频剪辑培训的安全正规之路

在当今数字化时代,视频剪辑已成为一项炙手可热的技能。为满足广大学习者的需求,辽宁博学优晨教育推出了一系列专业的视频剪辑培训课程。本文将重点介绍辽宁博学优晨教育的视频剪辑培训如何在保障学员安全和学习效果方面做出了卓越的努力。 一、正规资质&…

Linux操作系统-06-进程与服务管理

使用ps命令查看进程。包括过滤进程信息 使用systemctl命令管理和运行Linux服务 进程(Process):操作系统正在运行的应用程序。任意一个进程,都会消耗CPU和内存资源, 服务(Service)&#xff1a…

Word中解决插入脚注导致的分页位置错误问题

先放一个截图: 上面的截图中,样式为标题3的段落“四、固执的念头”前插入了连续型分节符,并且该分节符的样式为正文,前后的正文段落中有脚注,结果在分页时,标题3段落“四、固执的念头”后的正文段落自动进入…

python之word操作

#pip install python-docx import docx import os pathos.path.abspath(__file__) file_pathos.path.join(path,"大题.docx") print(path) print(file_path) objdocx.Document("大题.docx") #第一个段落 p1obj.paragraphs[2] # print(p1.text) #所有段落 #…

【JAVA】我和“JAVA“的细水长流,输入输出

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-Ck59fYFNNdpuGmVT {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【Educoder数据挖掘实训】插值填充法处理遗漏值

【Educoder数据挖掘实训】插值填充法处理遗漏值 开挖 这关的介绍非常详细,只要看懂了基本就没有问题。 所谓插值其实就是根据已有的数据构造出函数,然后用这个函数来计算遗漏的数据。 比如这个题目中介绍的拉格朗日插值以及 K K K近邻。 有关拉格朗日插值…

JVM-3

HotSpot虚拟机对象 我在网上看了很多相关的文章,发现在创建对象和对象的结构中内容都不太一样,一些关键字也很不同,于是我通过参考《深入理解Java虚拟机》这本书,自己总结了一篇。 1.对象的创建 当JVM收到一条创建对象的字节码…

用定时器在单片机中实现一次性回调函数执行

在单片机中实现一个异步的一次性定时器,通常可以使用硬件定时器模块或者嵌入式操作系统中的定时器功能。以下是一个基于硬件定时器的实现方法,适用于没有操作系统的情况: 1.硬件定时器配置: 选择单片机中的一个硬件定时器&#…

计算机网络 路由器 链路层 MTU 最大传送单元 网络层

一个链路层数据帧能够承载的最大数据量,被称为最大传送单元(MTU)。 因为IP数据报,被封装在链路层的帧中,因此链路层的MTU,严格地限制了IP数据报的长度,并且在IP数据报的源与目的路径上的各段链…

全面的 DevSecOps 指南:有效保护 CI/CD 管道的关键注意事项

数字化转型时代带来了对更快、更高效、更安全的软件开发流程的需求。DevSecOps:一种将安全实践集成到 DevOps 流程中的理念,旨在将安全性嵌入到开发生命周期的每个阶段 - 从代码编写到生产中的应用程序部署。DevSecOps 的结合可以带来许多好处&#xff0…

交叉编译x264 zlib ffmpeg以及OpenCV等 以及解决交叉编译OpenCV时ffmpeg始终为NO的问题

文章目录 环境编译流程nasm编译x264编译zlib编译libJPEG编译libPNG编译libtiff编译 FFmpeg编译OpenCV编译问题1解决方案 问题2解决方案 总结 环境 系统:Ubutu 18.04交叉编译链:gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 我的路径/opt/toolch…

NLP:bert下载与使用

没办法,模型精度还是不够,只能暂时弃用text2vec。然后我在github上发现了中文文本处理的老大哥:bert python使用bert可以参考这篇博客:博客 但是篇博客又出现了上一节的问题: We couldnt connect to https://hugging…

数据库相关理论知识(有目录便于直接锁定相关知识点+期末复习)

一,数据模型,关系型数据模型,网状模型,层次模型 1.数据库模型是用来描述和表示现实世界中的事物、概念以及它们之间的关系的工具,但是并不是越专业越好,还要平衡它的模型的复杂性、通用性和成本效益等因素…