【问题标题】:Is it necessary to invalidate/drop cache to read when using O_DIRECT to write?使用 O_DIRECT 写入时是否需要使缓存无效/删除才能读取?
【发布时间】:2015-12-01 05:28:27
【问题描述】:

我遇到了 LVM 和我正在处理的磁盘驱动程序的争用情况。看起来像 vgcreate 和 lvcreate 这样的东西在 O_DIRECT 模式下进行 IO。我在使用 -vvv 运行这些命令时发现了这一点。

Clearing start of logical volume "test"
    /dev/Finance-PG-vg/test: Added to device cache
    Opened /dev/Finance-PG-vg/test RW O_DIRECT
    Wiping /dev/Finance-PG-vg/test at sector 0 length 8 sectors
    /dev/Finance-PG-vg/test: block size is 4096 bytes
    Closed /dev/Finance-PG-vg/test

具体来说,我怀疑我们的读取正在访问缓存,而不是获取最新的磁盘内容。

如果是用 O_DIRECT 写的,我的理解是这绕过了缓存。因此,对该扇区的任何读取都将从缓存中接收旧数据,至少在缓存失效之前是这样。所以如果我想在几秒钟内读取 O_DIRECT 刚刚写的任何内容,我应该先删除缓存吗?

正确吗?

【问题讨论】:

  • 我尝试在每个 lvm 命令后删除缓存,但没有成功。当我阅读时,我仍然会定期得到零。

标签: linux caching io filesystems lvm


【解决方案1】:

这里有几个混淆:

  • 您提到的工具很可能使用 O_DIRECT 来确保新的 LVM 配置是持久的。 LVM 元数据实际上存储在您提供的所有物理磁盘/分区上的特定位置。

  • 默认情况下不使用 O_DIRECT 写入 LVM 设备(尽管您可以在打开文件时传递此标志)。

  • 使用 O_DIRECT 绕过缓存并不意味着您会获得陈旧的数据。假设您打开一个文件,写入文件,关闭它,然后使用 O_DIRECT 再次打开它,然后读取文件。保证读取会返回对文件的最新更改。没有返回过时的数据。使用 O_DIRECT 时无需删除缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2013-12-28
    • 1970-01-01
    • 2017-06-12
    • 2018-04-02
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多