繁体   English   中英

文件的O_DIRECT标志

[英]O_DIRECT flag for files

有一个着名的Linus的话,说O_DIRECT没用,甚至地狱。

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

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

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

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

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

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

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

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

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

编辑:公平地说,我从未将O_DIRECT fd上的writemmap / madvise

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

但我真的很想了解那种应用需求。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM