循环设备的 direct-IO(“losetup --direct-io”)和“mount -osync”有什么区别?

循环设备的 direct-IO(“losetup --direct-io”)和“mount -osync”有什么区别?

据我所知,在不使用任何标志的情况下,循环设备涉及两个缓存。当写入循环设备内的文件系统时一次页面缓存,然后当写入底层文件的文件系统时再次访问页面缓存。那是对的吗?

direct-IO 的文档说

--direct-io[=on|off]启用或禁用备份文件的直接 I/O。可选参数可以是 on 也可以是 off。如果省略该参数,则默认为 on。

这是否意味着使用此选项,只有一个缓存,即底层文件的文件系统的缓存?

的文档-o sync

-o sync文件系统的所有 I/O 应同步完成。对于写入周期数量有限的介质(例如某些闪存驱动器),同步可能会导致生命周期缩短。

由于过去我sync在循环安装上的文件系统遇到了严重的性能问题,并且基于有关生命周期缩短的警告,我认为这意味着不再有缓存,甚至对于底层文件也是如此。数据直接写入硬件。

这是正确的,还是事情更复杂?

答案1

免责声明:这可能不是 100% 准确。这是我的理解。

一般来说,打开文件时,可以有O_SYNC或O_DIRECT。

同步是指每次写入后数据都会同步到磁盘。这可能意味着:从用户空间复制到内核空间,然后在文件系统上执行同步,最终在同步到底层后在磁盘上执行某种同步。

Direct-io 意味着数据直接写入磁盘,尽可能绕过内部缓冲区。

差异:

  • 缓存仍与同步一起使用,可以加快读取速度。它还需要额外的内存副本
  • 同步几乎肯定会导致某种磁盘同步,这意味着其他分区的数据也将同步(因为您可能只安装了一个带有“sync”的分区,但其他分区没有“sync”)
  • 我相信 direct-io 不会自动同步,这意味着 (a) 来自其他分区的数据未同步,(b) 驱动器的内部缓存未刷新
  • 其他一些东西,比如使用 512 字节的倍数

注意:在更复杂的设置中,您有多层事物(例如硬盘 -> 软件 raid -> 加密 -> lvm -> 文件系统),同步会一直向下传输到硬件。

使用 direct-io 安装环回设备意味着:

  • 缓存不用于环回设备(但用于堆栈的其余部分)
  • 数据不会隐式同步到磁盘,因此您将获得更好的性能
  • 你不会浪费内存

相关内容