首页 > 编程知识 正文

linux禁用fsync,innodb_force_recovery

时间:2023-05-06 07:23:28 阅读:171152 作者:1914

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

MySQL下的InnoDB存储引擎具有InnoDB_flush_method只读参数,用户可以在其中设置InnoDB数据和重做日志文件的闪存行为。 definesthemethodusedtoflushdatatoinnodbdatafilesandlogfiles,which can affect I/O throughput。

这是一个严重影响性能和数据可靠性的参数。 以下是以前测试的性能比较图。

可以看出,该参数从fsync到O_DIRECT,以及O_DIRECT_NO_FSYNC,性能分别明显提高。 通常,在Linux上,将此参数设置为O_DIRECT。 也就是说,数据文件IO处于direct_IO模式,重做日志文件处于系统缓存(linux page cache )模式(在IO完成后为fsync ) )进行持久性保存。 但是,重做日志是否调用fsync ()还取决于innodb_flush_log_at_trx_commit参数。 o _ director 4: innodbuseso _ direct (or directio ) on Solaris ) to open the data files,and usesfsync ) toflushboththedata

O_DIRECT_NO_FSYNC选项表示在使用O_DIRECT完成IO后,不调用fsync ()画笔。

这里简单地说,使用direct_io模式绕过page cache直接写入盘文件的理由和需要调用fsync )来打磨盘的理由是vfs的inode cache和dentry cache

例如,向新文件写入数据时,不仅要向指定的文件系统数据block写入数据,还必须确保具有与文件系统的磁盘元数据对应的文件名和文件路径。 此外,还必须将相应的数据块标记为已使用。 保存文件id (实际上是inode )的inode block也必须标记为已使用。

但是,文件系统元数据并不总是在每次I/o操作时更新,例如,可能不太可能只是更改记录的值。 因此,某些IO操作需要使用O_DIRECT模式,而其他IO操作可以使用O_DIRECT_NO_FSYNC模式。 如果能够区分这些不同的IO操作类型,就可以提高IO性能。

这就是本文的内容。 请看下面的一节。 o _ direct _ no _ fsync 3360 innodbuseso _ directduringflushingi/o,butskipsthefsync (systemcallaftereachwrich

Prior to MySQL 8.0.14、thissettingisnotsuitableforfilesystemssuchasxfsandext 4、 whichrequireanfsync (systemcalltosynchronizefilesystemmetadatachanges.ifyouarenotsurewhetheryourfilesystemrequiresanfsync

As of MySQL 8.0.14,fsync (iscalledaftercreatinganewfile,after increasing file size,and after closing a file,与afsync ), toensurethatfilesystemmetadatachangesaresynchronized.the fsync (systemcallisstillskippedaftereachwriteoperation )。

从MySQL 8.0.14开始,社区版本已经为我做了这样的事情。 因此,当前O_DIRECT_NO_FSYNC可以代替O_DIRECT。 MySQL中也已经这样做了,并且此参数的缺省值(fsync )没有直接更改,但专用MySQL服务中的建议值已更改。 详细内容参考innodb-dedicated-server,仅举一例,o _ direct _ no _ fsyncwheno _ direct _ no _ fsyncsettingisnotavailablablable

现在是MySQL 8.0.19。 在此版本中,可以放心使用O_DIRECT_NO_FSYNC,并具有更好的性能。 (从上面的测试结果来看,性能至少提高了20%。 )为什么呢?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。