澄清 MySQL innodb_flush_method 变量

Der*_*ney 22 mysql innodb

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

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

Rol*_*DBA 18

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

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

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

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

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

从数字O_DSYNC上看,有四个写操作,其中两个被验证,而fsync()四个写操作,都在之后被验证。

结论

O_DSYNC

  • 比...快 O_DIRECT
  • 由于延迟或彻底崩溃,数据可能/可能不一致

O_DIRECT

  • 更稳定
  • 数据一致
  • 自然更慢

我希望这个答案有帮助,我希望我没有让你的事情变得更糟。

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