fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能

fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能这篇文章很短,但很有价值~MySQL下InnoDB存储引擎有个innodb_flush_method只读参数,用户设置InnoDB的数据和redo日志文件flush行为。definesthemethodusedtoflushdatatoInnoDBdatafilesandlogfiles,whichcanaffectI/Othroughput.这是一个对性能和数据可…

大家好,又见面了,我是你们的朋友全栈君。

这篇文章很短,但很有价值~

MySQL下InnoDB存储引擎有个innodb_flush_method只读参数,用户设置InnoDB的数据和redo日志文件flush行为。defines the method used to flush data toInnoDBdata files and log files, which can affect I/O throughput.

这是一个对性能和数据可靠性有较大影响的参数,在此拿出之前测试的一张性能对比图:

可以看到,该参数从fsync到O_DIRECT再到O_DIRECT_NO_FSYNC,性能分别有明显的提升。一般在Linux下,我们会将该参数设置为O_DIRECT,即数据文件IO走direct_io模式,redo日志文件走系统缓存(linux page cache)模式,在IO完成后均使用fsync()进行持久化。不过redo日志是否调用fsync()还依赖innodb_flush_log_at_trx_commit参数。O_DIRECTor4:InnoDBusesO_DIRECT(ordirectio()on Solaris) to open the data files, and usesfsync()to flush both the data and log files.

而O_DIRECT_NO_FSYNC选项的意思是,使用O_DIRECT完成IO后,不调用fsync()刷盘。

这里简单说下,为什么采用direct_io模式绕过page cache直接写磁盘文件,还需要调用fsync()刷盘,原因就是还存在文件系统元数据缓存,包括vfs中的inode cache和dentry cache等,以及具体文件系统元数据,如对于ext4还包括inode block bitmap,data block bitmap等。

比如往一个新文件写入数据,除了将数据写入指定的文件系统数据block中,还需要确保文件系统的磁盘元数据上有对应的文件名和文件路径,而且还需要将对应的数据block标记为已使用状态,需要将保存文件id(其实是inode)的inode block也标记为已使用状态。

但并不是每次IO操作都会导致文件系统元数据的更新,比如单纯修改一条记录的值,可能就不会。因此,某些IO操作需要采用O_DIRECT模式,另一些IO操作可以采用O_DIRECT_NO_FSYNC模式。如果能够区分这些不同的IO操作类型,那么就可以提升IO性能。

这就是本文要说的内容。先看下面一段话:O_DIRECT_NO_FSYNC: InnoDB uses O_DIRECT during flushing I/O, but skips the fsync() system call after each write operation.

Prior to MySQL 8.0.14, this setting is not suitable for file systems such as XFS and EXT4, which require an fsync() system call to synchronize file system metadata changes. If you are not sure whether your file system requires an fsync() system call to synchronize file system metadata changes, use O_DIRECT instead.

As of MySQL 8.0.14, fsync() is called after creating a new file, after increasing file size, and after closing a file, to ensure that file system metadata changes are synchronized. The fsync() system call is still skipped after each write operation.

从MySQL 8.0.14开始,社区版本就已经为我们做了这样的事情。因此,现在O_DIRECT_NO_FSYNC是可以取代O_DIRECT的。而MySQL也已经这么做了,虽然没有直接修改该参数默认值(fsync),但在专用的MySQL服务器上,推荐值已经变了。详见innodb-dedicated-server,简单例举如下:O_DIRECT_NO_FSYNC when O_DIRECT_NO_FSYNC setting is not available, the default

现在已经是MySQL 8.0.19了,应该说,在该版本上,大家可以放心使用O_DIRECT_NO_FSYNC了,能够有更好的性能(从上面的测试结果看,性能至少提升了20%+),干嘛不用呢。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138357.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kalidirsearch_kali.org

    kalidirsearch_kali.orgdirsearch是一个python3开发的目录扫描工具,目的是扫描网站的敏感文件和目录从而找到突破口。dirsearch使用:-u指定网址-e指定网站语言-w指定字典-r递归目录(跑出目录后,继续跑目录下面的目录)-random-agents使用随机UApythondirsearch.py-u网址-e*模板:pythondirsearch.py-uhttp://5073135b-4e2c-4551-b64f-242d901d8076.chall

    2022年9月27日
    3
  • opencv——访问图像元素(imagedata widthstep)

    opencv——访问图像元素(imagedata widthstep)http://blog.sina.com.cn/s/blog_759803690101gtpx.html怎么访问图像元素(坐标起点相对于图像原点 image origin 从 0 开始,或者是左上角 (img->origin=IPL_ORIGIN_TL) 或者是左下角 (img->origin=IPL_ORIGIN_BL) 假设有 8-bit 1-通道的图像 I (IplIma

    2022年5月2日
    37
  • SOAP协议简介[通俗易懂]

    SOAP协议简介[通俗易懂]SOAP 简介SOAP是基于XML的简易协议,可使应用程序在HTTP之上进行信息交换。或者更简单地说:SOAP是用于访问网络服务的协议。您应当具备的基础知识在继续学习之前,您需要对下面的知识有基本的了解:XMLXML命名空间如果您希望首先学习这些项目,请访问我们的《XML教程》。什么是SOAP?SOAP指简易对象访问协议SOAP是一种通信协议SOAP用于应用程序之间的通信S…

    2022年7月24日
    12
  • js中有几种数据类型_数据类型定义

    js中有几种数据类型_数据类型定义js数据类型有几种?它们之间的区别是什么两种基本数据类型和引用数据类型区别:1)基本类型在栈内存,引用类型在堆内存分配地址; 2)不同的内存分配机制也带来了不同的访问机制; 3)赋值变量时的不同; 4)参数传递的不同(把实参赋值给形参的过程);…

    2025年8月29日
    3
  • 操作系统核心原理之内存管理思维导图

    操作系统的两个角色分别是魔术师和管理者,在管理者这个角色中,除了CPU之外,内存是操作系统要管理的另外一个重要资源。内存管理需要达到两个目标:一是地址保护,即一个程序不能访问另一个程序的地址空间。二是

    2021年12月19日
    52
  • 简单理解常量、常量池、运行时常量池和字符串常量池

    简单理解常量、常量池、运行时常量池和字符串常量池1、常量常量在java中就值的是一般的字面量,比如字符串,整数,浮点数等等数据。简单理解java中什么叫常量2、常量池,也叫静态常量池,说常量池一定要指明是编译器生产

    2022年7月28日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号