linux - 使用 O_DIRECT 写入时是否需要使读取缓存失效/丢弃?

标签 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 刚刚写入的任何内容,我应该先删除缓存吗?

正确吗?

最佳答案

这里有几个混淆点:

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

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

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

关于linux - 使用 O_DIRECT 写入时是否需要使读取缓存失效/丢弃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32408490/

相关文章:

python - 如何在不使用 with open 的情况下检查文件是否为空?

linux - Bash-创建一个数组并递增每个索引-然后是最大的索引

python - 在 python 中使用 notify-send 显示多行通知

C# 缓存过期不起作用

java - 如何修复memcached中的 "stale data access"

java - 清除文本文件内容的更干净的方法

linux - 如何使用 'sort' 按第一列文本排序,然后按第二列数字排序?

java - Eclipse 经常崩溃

.net - 与.NET Cache 系统相比,Memcached 有哪些优势?

java - 使用 `Replace()` 方法不会替换 Apache POI 中的文本