Ste*_*eve 9 linux filesystems software-raid mdadm btrfs
在具有多个磁盘和跨越慢速 (HDD) 和快速 (SSD) 驱动器的软件 RAID 的现代 Linux 系统上,如何缓存对文件系统的写入?
对于 md-raid RAID1,阵列可以配置磁盘--write-mostly,--write-behind这表明读取是从较快的磁盘执行的,而写入较慢的磁盘可能会滞后。但是它是如何在内核级别缓存的呢?内核在md-raid层之前还是之后缓存磁盘写入?在 write() 调用结束时,是否保证将数据写入非--write-behind磁盘之一?
对于btrfsRAID1,同样的情况会如何发生?没有--write-behind功能,那么脏页是在设备级别还是文件系统级别计算的?write() 会在什么时候返回?
vm.dirty_*ratio可调参数如何影响这些设置?
的--write-mostly,--write-behind由处理的md内部驱动程序。md保留元数据,比如写意图位图(这是后写功能所必需的),它基本上记录了哪些数据已经写入,哪些数据仍然丢失。如果发生断电事件,当数据尚未到达主要写入设备时,这是必要的。在这种情况下,受影响的数据区域将重新同步(在您的情况下,从 SSD 读取,写入到 HDD)。
但是它是如何在内核级别缓存的呢?
对于 write-behind 情况,md 驱动程序基本上在内部复制了写入请求。主写请求进入主驱动器并告诉上层“好的,我已经完成了”;然后,复制的写入请求会保留在 RAID 的主要写入侧,并且可能需要更长的时间才能完成,希望没有人注意到。
然后,raid 层采取很多步骤来确保在队列中仍有待处理的后写请求时,不会从主要写入的设备中读取数据。为什么要从以写入为主的设备中读取数据?好吧,SSD 可能已经失败了,所以剩下的就是全部了。它很复杂,后写引入了一些极端情况。
这可能也是为什么它只支持 RAID-1 级别,而不支持任何其他级别的原因。尽管理论上将 SSD 本质上作为 RAID-0 和两个奇偶校验 HDD 具有后写模式可能是有意义的,但不支持像这样的后写 RAID-6。它只是 RAID-1,即使在那里也很少使用。
其他缓存设置不受此影响,基本上整个缓存机制根本不关心md驱动程序如何在内部实现。缓存做它的事,而 md 做它的事。因此,文件系统缓存对于 md 上的文件系统与裸驱动器上的文件系统的工作方式相同。(实际情况比这要复杂一些,但你可以这样想。)
对于 md-raid RAID1,阵列可以配置为
--write-mostly和--write-behind,这表明从较快的磁盘执行读取,而对较慢的磁盘的写入可能会滞后。但它是如何在内核级别缓存的呢?内核是否缓存 md-raid 层之前或之后的磁盘写入?
之后,由于此功能是 md-raid 特有的。
您应该将此 md-raid 功能视为缓冲,而不是缓存。它受到以下mdadm选项的限制:
--写在后面=
指定应启用后写模式(仅对 RAID1 有效)。如果指定了参数,它将设置允许的最大未完成写入数。默认值为 256。
我只能认为它也受到正常内核和硬件缓冲的限制(即如果较小)。正常的内核缓冲以nr_requests和为界max_hw_sectors_kb。看/sys/class/block/$write_behind_device/queue/。我所说的硬件缓冲是指驱动器上的写入缓存。
在 write() 调用结束时,数据是否保证写入非
--write-behind磁盘之一?
当然,假设您的意思是 write() 是在使用 O_SYNC / O_DSYNC 打开的文件上,或者您实际上是指 write()+fsync()。如果不是,则根本不存在任何保证。