文件的O_DIRECT标志

3

有一个著名的Linus语录,说O_DIRECT是无用的,甚至是地狱。

如果某人对速度有超强的需求,那么在Linux中的普通文件中使用该标志并没有合理的使用场景,真的没有吗?

编辑:那么“只写”访问日志文件呢?


1
你是怎么想到使用 O_DIRECT 来提高速度的呢? - Zan Lynx
1
可能有用的链接:http://unix.stackexchange.com/questions/6467/use-of-o-direct-on-linux - Zan Lynx
4个回答

3
您可以使用fdatasync和posix_fadvise(advice = POSIX_FADV_DONTNEED)获得类似的效果。
fdatasync只是将数据写入磁盘,但不会将其从缓存中删除。
如果您正在以极高的速率编写日志文件(几乎从不读取它),则日志文件的页面通常会将更多有用的页面推出缓冲区缓存。这是不希望发生的。但是,使用O_DIRECT,它们不会这样做。
但是,要实现类似的效果,您可以使用posix_fadvise来请求内核丢弃给定文件的给定范围(或全部)的任何缓存页面。
例如,如果您正在编写高写入数据库,并且您的事务日志以10 Mb /秒的速度填满,则可能希望每100M清除一次缓存页面,以允许其他内容更有效地使用内存。

1

使用O_DIRECT比不使用更具有确定性,可以获得更高的流式写入吞吐量。这是一件天赐之物。

将流式写入吞吐量与写入高速磁盘阵列块设备(类似于理论硬件能力)上的文件系统的吞吐量进行比较。确保使用具有良好流式写入性能的文件系统(例如xfs,其他现代文件系统也可能如此)。然后加入O_DIRECT并观察发生了什么。我评估过的每个内核版本和磁盘阵列都表现出了显着差异(没有O_DIRECT时,sd范围更广)。

编辑:公平起见,我从未将writeO_DIRECT fd上与mmap/madvise进行比较。


真的吗?你能否添加一些细节? - Cartesius00

0
如果性能是一个主要问题,你可能会使用mmapmadvise,并且可能还会使用readahead(对于磁盘文件)。
但我真的很想了解什么样的应用程序需要这样做。

0

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


1
一致性可能不是主要原因,也许跳过内核缓冲区可能是更重要的因素。 - Cartesius00
@James:也许在过去的不好的日子里是这样。但我没有听说过在过去三年中Linux有任何性能优势。 - Zan Lynx
很好,我们想完全省略 O_DIRECT,所以我希望确保我们不会错过任何东西。 - Cartesius00
@詹姆斯:像往常一样,自行进行基准测试以确保您拥有最佳的实现。 - Zan Lynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接