使用O_DIRECT写入时是否需要使缓存无效/删除缓存?

时间:2015-09-05 00:57:54

标签: linux caching io filesystems lvm

我遇到了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,我应该首先删除缓存吗?

正确?

1 个答案:

答案 0 :(得分:1)

这里有几个混淆:

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

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

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