文件的O_DIRECT标志

时间:2011-12-01 21:32:18

标签: c++ c database linux

有一句着名的莱纳斯的话,说O_DIRECT没用,甚至地狱。

如果一个人对速度有超强的要求,那么在Linux中常规文件合理使用此标志是否有no场景?

编辑:对日志文件的“只写”访问权限如何?

4 个答案:

答案 0 :(得分:3)

你可以用fdatasync和posix_fadvise获得类似的效果(advice = POSIX_FADV_DONTNEED。

fdatasync只是将您的数据传输到光盘,但不会将其从缓存中取出。

如果您以极高的速率编写日志文件(并且几乎从不读取它),则日志文件的页面通常会将更多有用的页面从缓冲区缓存中推出。这是不可取的。使用O_DIRECT,他们不会。

但是为了达到类似的效果,您可以使用posix_fadvise要求内核丢弃给定文件的给定范围的任何缓存页面(如果您愿意,可以放弃所有缓存页面)。

例如,如果您正在编写高写入数据库,并且您的事务日志填充速度为10 Mb /秒,那么您可能希望每隔100M或其他时间删除缓存页面,以允许内存更有用的是其他东西。

答案 1 :(得分:1)

使用O_DIRECT而不是没有{1}},流式写入吞吐量更具确定性。这是天赐之物。

将从写入高速磁盘阵列的块设备(类似于理论上的hw功能)获得的流写入吞吐量与您在同一阵列上的文件系统上的文件的吞吐量进行比较。确保使用具有良好流写入性能的文件系统(xfs是一个,其他一些现代的可能也是如此)。然后将O_DIRECT放入,看看会发生什么。我评估的每个内核版本+磁盘阵列都显示出显着的差异(没有O_DIRECT的sd要宽得多)。

编辑:公平地说,我从来没有将write fd上的O_DIRECTmmap / madvise进行比较。

答案 2 :(得分:0)

如果性能是一个主要问题,您可以mmap使用madvise,可能使用readahead(对于磁盘文件)。

但我真的很想了解应用程序的要求。

答案 3 :(得分:0)

使用fdatasync或特定于Linux的sync_file_range 可以获得相同的一致性效果。