有一个着名的莱纳斯的名言,说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
来获得相同的一致性效果。