文件的O_DIRECT标志

有一个着名的莱纳斯的名言,说O_DIRECT是无用的,甚至是地狱。

如果一个人对速度有超强的要求,那么在Linux中对于常规文件合理使用这个标志是no真的no情况?

编辑:怎么样“只写”访问日志文件?

O_DIRECT流写入吞吐量比没有写入吞吐量要高得多。 这是天赐之物。

比较从写入到高速磁盘阵列的块设备(类似于理论硬件能力)的流写入吞吐量与您在同一阵列上的文件系统上的文件吞吐量。 确保你使用的文件系统具有良好的流写性能( xfs是一个,其他一些现代的也可以)。 然后把O_DIRECT ,看看会发生什么。 我评估过的每个内核版本+磁盘阵列都显示出显着的差异(没有O_DIRECT比没有更大的sd)。

编辑:公平地说,我从来没有比较write在一个O_DIRECT fd与mmap / madvise

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

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

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

但是为了达到类似的效果,可以使用posix_fadvise来让内核放弃给定文件给定范围的任何缓存页面(如果你喜欢,也可以全部)。

例如,如果您正在编写一个高写入的数据库,并且事务日志填满了10 Mb /秒,那么您可能希望每隔100M就清除缓存的页面,以使内存更加有用被其他东西使用。

如果性能是一个主要问题,那么可以使用madmap和mmap (对于磁盘文件)。

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

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