关于MySQL innodb_flush_method变量的说明


21

首先,让我承认我对硬盘的内部运行情况一无所知。因此,当我阅读有关变量innodb_flush_method的手册时,我感到困惑。我可以用外行的术语来解释O_DSYNC和O_DIRECT的区别,以及如何知道这是否是数据库服务器上的性能问题。

我的设置上的一些统计信息:运行MySQL 5.1.49-64位的Mac OSX 10.6(32位内核,因为体系结构已过时)(希望它可以让我使用内存)。8GB RAM,〜6GB innodb数据/索引。


2
我不知道Mac OS X是否支持适当的直接IO选项-我认为它不支持。您是我今天看到的第二个人,对该手册页感到困惑。我在这里有一个未解决的错误:bugs.mysql.com/bug.php?id=54306
Morgan Tocker 2011年

Answers:


16

这是关于fdatasync()工作原理与fsync()工作原理的解释

fdatasync()将文件的所有数据缓冲区刷新到磁盘(在系统调用返回之前)。它类似于fsync()但不需要更新元数据,例如访问时间。访问数据库或日志文件的应用程序通常会写入一个很小的数据片段(例如,日志文件中的一行),然后fsync()立即调用以确保所写入的数据实际存储在硬盘上。不幸的是,fsync()总是会发起两个写操作

  • 对新写入的数据进行一次写入操作
  • 一次写操作,以更新存储在索引节点中的修改时间

如果修改时间不属于事务概念的一部分,则fdatasync()可以用来避免不必要的inode磁盘写操作。

在英语中,O_DSYNC是不是更快O_DIRECT,因为O_DIRECT电话fsync()的两倍(一个用于日志,一个用于数据),并fsync()通过两次写操作验证数据写入。使用O_DSYNC电话fdatsync()fsync()。您可以将其fdatasync()视为异步操作fsync()(而不是验证数据)。

从数字上看O_DSYNC,有四个写操作,其中两个已经过验证,而fsync()四个写操作都在以后进行了验证。

结论

  • O_DSYNC
    • 比...快 O_DIRECT
    • 由于延迟或完全崩溃,数据可能/可能不一致
  • O_DIRECT
    • 更稳定
    • 数据一致
    • 自然较慢

我希望这个答案会有所帮助,也希望我不会让您的情况变得更糟。


2
值得指出的是:O_DIRECT仅用于表空间文件,而不用于日志。另外-O_DIRECT是否有用将取决于硬件。我链接到一个开放的文档错误,作为对作者问题的评论。
Morgan Tocker 2011年

谢谢您的澄清,摩根。我会改正的。
RolandoMySQLDBA 2011年

O_DSYNC是同步写入,您如何得出结论,异步+ fsync更快?
noonex 2014年

@noonex fdatasync()同步其数据,而不同步其元数据。根据notifyit.com/articles/article.aspx?p=23618&seqNum=5的说法This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.在我3.5年前写我的文章的时候,这是真的,尤其是对于旧版本的Linux。
RolandoMySQLDBA 2014年

@noonex根据en.wikipedia.org/wiki/Sync_(Unix)The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.(该Wiki最近更新于2014年7月28日)。
RolandoMySQLDBA 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.