fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能
大家好,又见面了,我是你们的朋友全栈君。
这篇文章很短,但很有价值~
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.cn/138357.html原文链接:https://javaforall.cn
相关文章
- MySQL空间不足:怎样解决?(mysql空间不够)
- 服务【Linux:如何启动MySQL服务】(linux如何启动mysql)
- 使用MySQL实现自增插入数据(mysql自增插入数据)
- 掌握MySQL表连接查询技巧:从简单到复杂(mysql表连接查询)
- 云使用百度云服务器安装MySQL(mysql百度)
- MySQL 使用全局索引优化性能(mysql全局索引)
- 类型MySQL中使用二进制数据类型的简单指南(mysql二进制数据)
- 使用Java连接MySQL实现查询功能(java连接mysql查询)
- MySQL自增量的作用及使用方法(mysql自增量)
- 轻松实现MySQL SQL批量执行方法,快速操作数据库(mysql批量执行sql)
- MySQL存储过程:开启创建之旅(mysql存储过程的创建)
- MySQL 服务名:往前开启新的数据库之旅(mysql服务名)
- 什么MySQL语句:创建新表格(创建mysql的语句是)
- MySQL中复合索引:实现性能优化(mysql复合索引优化)
- 用户查看Mysql root用户的技巧(mysql 查看root)
- :登录MySQL:使用命令行操作实现(登录mysql 命令)
- MySQL中如何使用in语句进行筛选(mysql中使用in)
- 让C语言实现MySQL数据库程序功能(c 写mysql)
- MySQL智能Cube让数据更加活跃(cube mysql)
- Mysql中如何使用ASC排序(mysql 中asc排序)
- 使用abs函数处理MySQL中的数据(abs() mysql)
- 用CMD命令行修改MySQL数据库编码(cmd修改mysql编码)
- MySQL每秒写入多少条记录(mysql一秒写多少记录)
- MySQL数据库的每日收益(mysql一天收入)
- MySQL中无法匹配不存在条件的记录(mysql 不存在条件)
- 走过弯路,教你正确使用MySQL语句不加单引号(mysql不加单引号)
- 解决方法MySQL服务不自启动的问题(mysql不自启动)
- 解决MySQL表中不确定列名的问题(mysql不确定列名)
- 免费使用MySQL数据库,节省费用(mysql不用费用)