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

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

fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能相关推荐

  1. from mysql partition select_通过分区(Partition)提升MySQL性能[原创翻译]

    通过分区(Partition)提升MySQL性能 --MySQL5.1新特性翻译系列 几年前,俺写过一篇题为"The Foundation of Excellent Performance& ...

  2. 提高mysql性能_提升MySQL性能值得借鉴的几个简易方法

    提升MySQL性能的几个简易方法,主要用于设计.开发阶段的借鉴.[@more@]1.Carefully choose attribute types and lengths. 仔细选择字段的类型与长度 ...

  3. mysql分区为什么提高性能_通过分区(Partition)提升MySQL性能

    通过分区(Partition)提升MySQL性能 --MySQL5.1新特性翻译系列 几年前,俺写过一篇题为"The Foundation of Excellent Performance& ...

  4. 10个提升MySQL性能的小技巧

    从工作量分析到索引的三条规则,这些专家见解肯定会让您的MySQL服务器尖叫. 在所有的关系数据库中,MySQL已经被证明了完全是一头野兽,只要通知停止运行就绝对不会让你多等一秒钟,使你的应用置于困境之 ...

  5. jbd2 mysql_解决因jbd2导致mysql性能过低问题

    在几个月前,有同事因为需要对某项功能进行压力测试,测试mysql的读写性能.当时测下来的结果非常不满意,本地测试环境性能巨差无比,当时我帮忙找问题,top看cpu.内存完全没有问题,iotop看到有j ...

  6. mysql partition 性能_通过分区(Partition)提升MySQL性能

    几年前,俺写过一篇题为"The Foundation of Excellent Performance"的文章(现在仍然可以在http://www.tdan.com/i016fe0 ...

  7. 通过分区(Partition)提升MySQL性能

    几年前,俺写过一篇题为"The Foundation of Excellent Performance"的文章(现在仍然可以在http://www.tdan.com/i016fe0 ...

  8. mysql性能升级方案_使用FriendFeed来提升MySQL性能的方法

    背景 我们使用MySQL存储了FriendFeed的所有数据.数据库随着用户基数的增长而增长了很多.现在已经存储了超过2.5亿条记录与一堆涵盖了从评论和"喜欢"到好友列表的其他数据 ...

  9. Mysql性能调优常用参数配置

    全文中一共有常用的(事实上你如果花1-2周阅读.理解.自己动手设一下后是需要这么多参数的)76个参数 可能你从未看到过这样的一篇集中火力式的把mysql参数列了这么全的文章.因此这一篇是汇集了最精华和 ...

最新文章

  1. SpringBoot第十七篇:上传文件
  2. 关于学习Python的一点学习总结(31->继承及多态)
  3. 启用Apache Mod_rewrite模块
  4. h3c服务器安装linux,H3C服务器安装Ubuntu操作系统
  5. 为什么你的记忆总会越来越模糊?
  6. BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】
  7. 4.1.4 OS之文件的物理结构(连续分配、链接分配[隐式-显式]、索引分配[链接方案-多层索引-混合索引])
  8. 使用docker安装elasticsearch
  9. java调用 restapi 乱码_Java HttpURLConnection模拟请求Rest接口解决中文乱码问题
  10. 董明珠上榜中国杰出商界女性100
  11. php MySQL定义,PHP + MySQL用户定义函数
  12. 【python数据分析】用python进行数据探索2(常见matplotlib及pandas绘图函数汇总、对比及拓展)
  13. 【Mybatis】maven配置pom.xml时找不到依赖项(已解决)
  14. 14.Java实现UDP通信
  15. eXtremeComponents指南
  16. MS-office计算机二级选择题大全
  17. python枚举详解
  18. LazyT——C#基础知识回顾
  19. DirectX和OPenGL 与 UE4、U3D、Webgl(ThreeJS)的关系
  20. 如何进行Java学习

热门文章

  1. LIRE的使用:创建索引
  2. php网络编程自学手册 pdf,葛丽萍PHP网络编程技术详解 pdf扫描版
  3. LA 2572 Viva Confetti 离散化 *
  4. 新能源汽车充电桩的这些知识你都知道吗?
  5. python PSNR代码
  6. 01 JavaScript二维数组的查找 牛客网
  7. 三维仿真在智慧城市中的运用,机械臂智能垃圾分类
  8. 足疗师手把手教你家中做足疗
  9. word文档显示文件已损坏打不开怎么办呢?
  10. 入门Python到精通,这一篇文章就够了【精心整理】