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%+),干嘛不用呢。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • android studio不能输入中文_Android模拟器

    android studio不能输入中文_Android模拟器很多Android项目的运行都需要用到中文输入法,在一年前的AndroidStudio需要导入输入法apk安装,现在新版的AndroidStudio免去了这个麻烦,下面就教大家如何设置谷歌拼音输入法。

  • 51单片机8×8点阵屏设计(51单片机led光立方)

    1.简介本设计是以STC89C52单片机的8x8x8的LED光立方。本设计将LED光立方分成8层,分别由单片机的P1,8个IO口来控制每一层,由于采用的是共阴极所以当层电位为高电平有效,由P0口和P2的总共16个IO口来控制每层的64盏灯,低电平有效,P2口通过8个74HC573缓冲器芯片来驱动LED。这样就可以通过控制IO口的输出电平来控制每盏灯的亮灭。2.硬件设计本系统的硬件电路主要单片…

  • Python3网络爬虫教程2——urlopen的返回对象

    Python3网络爬虫教程2——urlopen的返回对象上接:Python3网络爬虫教程1——初始爬虫(爬虫是干嘛的?)https://blog.csdn.net/u011318077/article/details/865088722.3.urlopen的返回对象rsp=request.urlopen(url)有时候不一定能获得对象,断网了,服务器故障等等geturl:返回请求对象的URLinfo:返回反馈对象的meta信息…

  • java命令行执行 jar_java命令打包jar

    java命令行执行 jar_java命令打包jar摘要这个技巧阐明了如何不直接处理清单文件而将一个不能运行jar包转换成一个可以执行的jar包。学会如何写一段转换jar包的程序,将你的jar包转换成你能使用java-jar命令运行jar包或象在windows系统上那样通过双击来运行jar包。你可以很容易地将一个应用的所有的类和资源打包到一个jar文件中去。事实上,这只是打包的一个原因。另一个原因是让用户很容易地执行包中的应用。那么在java的…

  • 手把手教你如何获取微信公众号用户的个人信息(包括OpenId)

    手把手教你如何获取微信公众号用户的个人信息(包括OpenId)最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台点击进入里面的很有接口,就比较常见的翻译,语音识别,地理位置等等,都挺好的。好了,不多说,进入正题好了。我想,做微信公众号开发的,对于想获取关注了公众号的用户信息,或者说是当前与后台服务器进行交互的当前用户信息,这个功能是很重要…

  • URL Escape Codes 方便日后查询

    URL Escape Codes 方便日后查询

发表回复

您的电子邮箱地址不会被公开。

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