MySQL 8.0 引入 innodb_flush_method 等新参数的系统调用分析

news2024/11/19 7:45:29

本文我们将讨论如何在操作系统级别验证 innodb_flush_methodinnodb_use_fdatasync 修改为默认值之外的其它值(特别是 O_DIRECT 是最常用的)后的效果。

介绍

首先,让我们定义该 innodb_flush_method 参数的作用。它规定了 InnoDB 如何管理数据刷新到磁盘的行为。文章不会详细说明每个有效值的作用,更多详细介绍请查看参数值文档。

有效值如下(仅限 Unix):

  • fsync
  • O_DSYNC
  • littlesync
  • nosync
  • O_DIRECT
  • O_DIRECT_NO_FSYNC

如前所述,我们将重点关注 O_DIRECT。作为最佳实践的一部分,我们建议选择 O_DIRECT 避免双缓冲,绕过操作系统缓存,从而提高写入数据时的性能。下面是从官方文档中摘录的 InnoDB 架构:

在支持 fdatasync() 的平台上执行系统调用(System calls,以下简称 Syscalls),MySQL 8.0.26 中引入的 innodb_use_fdatasync 变量允许使用 innodb_flush_method 选项来替代。除非后续数据检索需要,否则系统调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。

要操作文件,MySQL 和任何其他软件都必须调用 Syscalls。每当进程需要系统资源时,它都会通过 Syscalls 向内核发送对该资源的请求。从较高层次来看,系统调用是内核向用户应用程序提供的“服务”。它们类似于库 API,被描述为具有名称、参数和返回值的函数调用。下图是此过程的高级说明:

问题:为什么不直接访问我们想要的资源(内存、磁盘等)?

这是因为 Linux 将进程的执行分为两个空间。用户运行的进程(一般称为用户空间进程)依赖于内核提供的服务。内核是操作系统的一个特定部分,它以特权运行模式处理各种低级操作。这里详细描述了用户空间和内核空间的概念。如果应用程序可以直接读写内核的地址空间,系统的安全性和稳定性就会受到影响。在给定的场景中,一个进程能够访问另一进程的内存区域。这表明内存隔离存在潜在问题,并可能导致安全漏洞。

问题:如何检查我的操作系统是否支持特定的 Syscalls?

$ man syscalls

它将列出可用的 Syscalls 以及其中出现的 Linux 内核。

验证

我们将使用 strace 实用程序和 /proc/<pid>/fdinfo/<fdinfo> 中提供的信息来证明前面描述的理论。首先,我将使用默认设置启动一个 MySQL 8.0.33 实例。

mysqld 我们可以通过检查 /proc/<pid>/fd/ 列出进程打开的文件:

$ ls -l /proc/12006/fd/
total 0
lr-x------. 1 vinicius.grippa percona 64 Jan 15 16:59 0 -> /dev/null
l-wx------. 1 vinicius.grippa percona 64 Jan 15 16:59 1 -> /home/vinicius.grippa/sandboxes/msb_8_0_33/data/msandbox.err
...
lrwx------. 1 vinicius.grippa percona 64 Jan 15 16:59 9 -> /home/vinicius.grippa/sandboxes/msb_8_0_33/data/#ib_16384_1.dblwr

我们可以通过运行这个命令,来检查每个文件描述符 cat /proc/<pid>/fdinfo/<file descriptor number>

$ cat /proc/12006/fdinfo/9
pos: 0
flags: 0100002
mnt_id: 69
lock: 1: POSIX  ADVISORY  WRITE 12006 fd:06:32640985 0 EOF

我们对八进制数表示的标志描述感兴趣。要解释这些标志,我们可以使用 GitHub 中的 fdflags 存储库或在 shell 中使用以下命令:

$ for flag in APPEND ASYNC CLOEXEC CREAT DIRECT DIRECTORY DSYNC EXCL LARGEFILE NOATIME  NOCTTY NOFOLLOW NONBLOCK PATH RDWR SYNC TMPFILE TRUNC; do printf '%s: ' O_${flag}; echo O_${flag} | gcc -D_GNU_SOURCE -include fcntl.h -E - | tail -n 1; done

并使用 fdflags 项目来避免手动工作:

fdinfo_directory="/proc/46211/fdinfo/"
fd_directory="/proc/46211/fd/"
for fd in $(ls ${fdinfo_directory}); do
    echo "Processing file descriptor ${fd}" &&
    # Read the symbolic link to find out the file name
    file_name=$(readlink "${fd_directory}${fd}")
    echo "File Name: $file_name"
    ./fdflags "${fdinfo_directory}${fd}"        
done
# Output

Processing file descriptor 5
File Name: /home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest79.ibd
O_LARGEFILE
O_RDWR
...
Processing file descriptor 99
File Name: /home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest89.ibd
O_LARGEFILE
O_RDWR

输出显示文件描述符编号、文件名以及打开时应用于该文件的标志。

接下来,我们可以确认 MySQL 正在使用 stracefsync() 来写入数据:

# Attaching strace to the mysqld process
$ strace -f -c  -o ./strace.out -p <pid>
# Once you exit strace (CTRL+C), a summary of syscalls is written in the strace.out file
$ cat strace.out
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 45.38  222.980851        1158    192526     50579 futex
 27.50  135.114996      134309      1006           io_getevents
  5.90   28.997398     1933159        15        12 restart_syscall
  5.69   27.970912      537902        52           nanosleep
  5.32   26.117827         122    213323      2088 read
  3.86   18.968682         172    109744           write
  3.00   14.731474     1133190        13           epoll_wait
  1.13    5.565184         574      9688           fsync
  0.82    4.050227         134     30132           clock_gettime
  0.61    2.974088         148     20089           pwrite64
  0.47    2.311729         708      3264           fdatasync
...
  0.00    0.000270         135         2           rename
  0.00    0.000256          32         8           close
------ ----------- ----------- --------- --------- ----------------
100.00  491.324073                590620     52679 total

即使没有启用 innodb_use_fdatasync,您也会在 strace 输出中注意到 Syscalls。当 sync_binlog >0 时,系统调用默认被二进制日志使用。我们可以在 strace 中确认:

$ strace -f  -s2048  -yy  -o ./strace.out -p <pid>
...
47252 fdatasync(70</home/vinicius.grippa/sandboxes/msb_8_0_33/data/binlog.000026> <unfinished ...>

建议:尝试设置 sync_binlog=0 并检查 fdatasync() 执行时,MySQL 是否仍然请求系统调用来获取二进制日志。

现在,我们将向 MySQL 添加以下设置并重新启动实例:

[mysqld]
innodb_flush_method=O_DIRECT
innodb_use_fdatasync = ON

再次检查,我们可以看到 O_DIRECT 文件中添加了一个新标志 :

Processing file descriptor 96
File Name: /home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest112.ibd
O_LARGEFILE
O_RDWR
O_DIRECT
…
Processing file descriptor 99
File Name: /home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest94.ibd
O_LARGEFILE
O_RDWR
O_DIRECT

并使用 strace 检查,我们将使用以下命令看到我们的表文件(*.ibd):

$ strace -f  -s2048  -yy  -o ./strace.out -p 20498
...
20551 fdatasync(48</home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest23.ibd> <unfinished ...>
20551 fdatasync(26</home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest5.ibd> <unfinished ...>
20550 fdatasync(34</home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest15.ibd> <unfinished ...>
20550 fdatasync(24</home/vinicius.grippa/sandboxes/msb_8_0_33/data/test/sbtest1.ibd> <unfinished ...>

结论

我们研究了 InnoDB 数据刷新机制的技术细微差别以及它们如何与操作系统交互。innodb_flush_method 我们可以通过调整参数和 .sql 文件 innodb_use_fdatasync 来了解优化 MySQL 性能的细节。

我们使用 strace 实用程序进行的实验以及检查文件描述符的实验 /proc/<pid>/fdinfo/ 提供了调整这些设置时行为发生变化的具体证据。使用可以带来更高效的数据写入操作。此外,MySQL 8.0.26 中的引入及其 在特定场景中的偏好说明了 MySQL 的不断发展,以利用特定的系统调用优势来提高性能。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

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

相关文章

加快“数实融合”推进新型工业化 济南个性化体检“把脉”企业数字化转型难点痛点

加快“数实融合”推进新型工业化 济南个性化体检“把脉”企业数字化转型难点痛点 以主流价值为光&#xff0c;解读“济南故事”&#xff0c;解码C位新闻。爱济南客户端推出“追光”栏目&#xff0c;发挥新型主流媒体权威性和创新性&#xff0c;着眼经济社会发展紧要处、关键处、…

Java学习day26:和线程相关的Object类的方法、等待线程和唤醒线程(知识点详解)

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾 Java学习day25&#xff1a;守护线…

压力测试工具-Jmeter使用总结

目录 一.前言 二.线程组 三.线程组的组件 四.线程组-HTTP请求 1、JSON提取器 2、XPATH提取器 3、正则表达式提取器 五.线程组-断言 1、响应断言 2、JSON断言 六.创建测试 1.创建线程组 2.配置元件 3.构造HTTP请求 4.添加HTTP请求头 5.添加断言 6.添加查看结果树…

Python之Numpy 和 Pandas

目录 2.1 numpy import numpy as np array np.array([[1,2,3],[2,3,4]]) print(array) print(number of dim:,array.ndim) print(shape:,array.shape) print(size:,array.size)pandas 1,pandas 基本介绍 df2 pd.DataFrame({A:1.,B:pd.Timestamp(20130102),C:pd.Series(1,i…

算法设计与分析实验:最短路径算法

一、网络延迟时间 力扣第743题 本题采用最短路径的思想进行求解 1.1 具体思路 &#xff08;1&#xff09;使用邻接表表示有向图&#xff1a;首先&#xff0c;我们可以使用邻接表来表示有向图。邻接表是一种数据结构&#xff0c;用于表示图中顶点的相邻关系。在这个问题中&am…

【C语言进阶篇】assert宏 使用详解

文章目录 一、assert简介 二、assert使用方法和规则 2.1 头文件 2.2 原型 2.3 功能 2.4 示例 2.5 assert的打开与关闭 三、注意事项 3.1 运行效率问题 3.2 assert只适用于调试版本 3.3 资源释放与清理 3.4 过度依赖 四、总结 个人主页&#xff1a; 倔强的石头的…

Datax3.0+DataX-Web部署分布式可视化ETL系统

一、DataX 简介 DataX 是阿里云 DataWorks 数据集成的开源版本&#xff0c;主要就是用于实现数据间的离线同步。DataX 致力于实现包括关系型数据库&#xff08;MySQL、Oracle 等&#xff09;、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源&#xff08;即不同的数据库&#x…

(2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法

Spatial-and-Frequency-aware Restoration method for Images based on Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 修改数据保真度 3.2 …

Python中使用Opencv-python库绘制直线、矩形、圆、文本

Python中使用Opencv-python库绘制直线、矩形、圆、文字 在Python中使用Opencv-python绘制直线、矩形、圆、文本非常简单&#xff0c;分别使用到line、rectangle、circle、putText这几个函数&#xff0c;具体可以参考https://docs.opencv.org/4.9.0/d6/d6e/group__imgproc__dra…

基础小白快速入门c语言----数据类型

数据类型&#xff0c;运算符&#xff0c;表达式 1c语言支持 数据类型 1.基础类型&#xff08;基本类型&#xff09; a数值类型 整型&#xff1a;往往有符号和无符号的区分&#xff0c;&#xff08;signed&#xff09;有符号 &#xff08;unsigned)无符号 基础整型&#xff1…

GSM模块的使用及注意事项

1.如何使用&#xff1f; 最近&#xff0c;我准备使用GSM模块&#xff08;SIM900A&#xff09;发送英文短信到指定号码&#xff0c;翻阅资料如下&#xff1a; 可见&#xff0c;只要给该模块按照如下步骤发送指令&#xff1a; 就可以使得模块正常工作。&#xff08;SIM900A&#…

6-1 A. DS二叉树—二叉树构建与遍历(不含框架)

题目描述 给定一颗二叉树的逻辑结构如下图&#xff0c;&#xff08;先序遍历的结果&#xff0c;空树用字符‘#’表示&#xff0c;例如AB#C##D##&#xff09;&#xff0c;建立该二叉树的二叉链式存储结构&#xff0c;并输出该二叉树的先序遍历、中序遍历和后序遍历结果。 输入 第…

【Java程序设计】【C00231】基于Springboot的景区寄存管理系统(有论文)

基于Springboot的景区寄存管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的景区行李寄存系统 主要功能如下&#xff1a;用户登录模块、用户信息管理模块、角色信息管理模块、部门信息管理模块、行李寄存柜…

十、Qt三维图表

一、Data Visualization模块概述 Data Visualization的三维显示功能主要有三种三维图形来实现&#xff0c;三各类的父类都是QAbstract3DGraph&#xff0c;从QWindow继承而来。这三类分别是&#xff1a;三维柱状图Q3DBar三维空间散点Q3DScatter三维曲面Q3DSurface 1、相关类的…

窥探向量乘矩阵的存内计算原理—基于向量乘矩阵的存内计算

在当今计算领域中&#xff0c;存内计算技术凭借其出色的向量乘矩阵操作效能引起了广泛关注。本文将深入研究基于向量乘矩阵的存内计算原理&#xff0c;并探讨几个引人注目的代表性工作&#xff0c;如DPE、ISAAC、PRIME等&#xff0c;它们在神经网络和图计算应用中表现出色&…

【笔记】Android 常用编译模块和输出产物路径

模块&产物路径 具体编译到软件的路径要看编译规则的分区&#xff0c;代码中模块编译输出的产物基本对应。 Android 代码模块 编译产物路径设备adb路径Comment 模块device/mediatek/system/common/ 资源overlay/telephony/frameworks/base/core 文件举例res/res/values-m…

Java项目:基于SSM框架实现的教务管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm813基于SSM框架实现的教务管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#x…

增加Vscode引用路径

增加Vscode引用路径 增加Vscode引用路径问题说明解决思路1在Vscode中进行配置缺点 解决思路2 增加Vscode引用路径 问题说明 在嵌入式开发中需要经常用到库函数(SPL), Vscode需要配置引用路径才能对函数名或变量进行跳转 解决思路1 与Keil5 MDK类似, 在配置C/C的json文件中添…

论在线测径仪在胶管生产行业的投资与回报!

关键词&#xff1a;在线测径仪,胶管测径仪,双轴测径仪,双向测径仪,测径仪,胶管外径检测 胶管种类多、应用广&#xff0c;在胶管生产行业中&#xff0c;在不断加深其自动化程度&#xff0c;在加深的过程中&#xff0c;先要考虑到的是其投入产出比&#xff0c;是否值得投入。在胶…

【自动化测试】---Selenium+Java

1.自动化测试分类 接口自动化测试UI自动化测试&#xff08;移动端自动化测试、Web端自动化测试&#xff09; 2.选择Selenium作为web自动化工具原因&#xff08;面试题&#xff09; 开源免费支持多个浏览器支持多个系统支持多语言Selenium包提供很多供测试使用的API 3.自动化是什…