首先让我承认我对硬盘的内部工作原理一无所知。因此,当我阅读变量innodb_flush_method的手册时,我感到很困惑。我可以用外行的术语解释 O_DSYNC 和 O_DIRECT 的区别,以及如何知道这是否是数据库服务器上的性能问题。
我设置的一些统计数据:Mac OSX 10.6(32 位内核,因为架构已过时)运行 MySQL 5.1.49-64 位(希望它允许我使用内存)。8GB RAM,约 6GB innodb 数据/索引。
首先让我承认我对硬盘的内部工作原理一无所知。因此,当我阅读变量innodb_flush_method的手册时,我感到很困惑。我可以用外行的术语解释 O_DSYNC 和 O_DIRECT 的区别,以及如何知道这是否是数据库服务器上的性能问题。
我设置的一些统计数据:Mac OSX 10.6(32 位内核,因为架构已过时)运行 MySQL 5.1.49-64 位(希望它允许我使用内存)。8GB RAM,约 6GB innodb 数据/索引。
这是关于如何
fdatasync()
工作与如何fsync()
工作的解释fdatasync()
将文件的所有数据缓冲区刷新到磁盘(在系统调用返回之前)。它类似于fsync()
但不需要更新元数据,例如访问时间。访问数据库或日志文件的应用程序通常会写入一个很小的数据片段(例如,日志文件中的一行),然后fsync()
立即调用,以确保写入的数据物理存储在硬盘上。不幸的是,fsync()
总是会发起两次写操作如果修改时间不是事务概念的一部分,那么
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
我希望这个答案有帮助,我希望我没有让你的情况变得更糟。