![循环设备的 direct-IO(“losetup --direct-io”)和“mount -osync”有什么区别?](https://linux22.com/image/140542/%E5%BE%AA%E7%8E%AF%E8%AE%BE%E5%A4%87%E7%9A%84%20direct-IO%EF%BC%88%E2%80%9Closetup%20--direct-io%E2%80%9D%EF%BC%89%E5%92%8C%E2%80%9Cmount%20-osync%E2%80%9D%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
据我所知,在不使用任何标志的情况下,循环设备涉及两个缓存。当写入循环设备内的文件系统时一次页面缓存,然后当写入底层文件的文件系统时再次访问页面缓存。那是对的吗?
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 安装环回设备意味着:
- 缓存不用于环回设备(但用于堆栈的其余部分)
- 数据不会隐式同步到磁盘,因此您将获得更好的性能
- 你不会浪费内存