写入缓存如何与跨越不同速度的磁盘的文件系统一起工作?


9

在具有多个磁盘和跨越慢速(HDD)和快速(SSD)驱动器的软件RAID的现代Linux系统上,如何缓存对文件系统的写入?

对于md-raid RAID1,可以为磁盘配置磁盘,--write-mostly并且--write-behind表明从较快的磁盘执行读取,而对较慢的磁盘进行写入可能会滞后。但是如何在内核级别缓存呢?内核是否在md-raid层之前或之后缓存磁盘写入的内容?在write()调用结束时,是否保证将数据写入其中一个非--write-behind磁盘?

对于btrfsRAID1,相同的情况如何发生?没有--write-behind功能,因此脏页是在设备级别还是在文件系统级别进行计数的?什么时候会返回write()?

vm.dirty_*ratio可调参数如何影响这些设置?

Answers:


7

--write-mostly--write-behind由处理的md内部驱动程序。md保留元数据,例如写意图位图(这对于后写功能是必不可少的),它基本上记录了哪些数据已经被写入以及哪些数据仍然丢失。如果发生断电事件,而数据还没有到达以写为主的设备,这很有必要。在这种情况下,受影响的数据区域将重新同步(在您的情况下是从SSD读取,然后写入HDD)。

但是如何在内核级别缓存呢?

对于后写情况,md驱动程序基本上在内部复制写请求。主写请求转到主驱动器,并告诉上层“确定,我已经完成了”;然后,复制的写请求将停留在RAID的大多数写后侧,并且可能需要更长的时间才能完成,希望没有任何人注意。

然后,raid层采取许多步骤来确保在队列中仍有待处理的写后请求时,不会从以写为主的设备中读取任何数据。为什么要从以写为主的设备中读取数据?好吧,SSD可能发生了故障,因此只剩下了。这很复杂,而后写介绍了一些极端情况。

这也可能就是为什么仅RAID-1级别而不支持其他级别的原因。尽管从理论上讲,将SSD本质上设置为RAID-0和两个奇偶校验HDD在后写模式下可能会有意义,但是并没有像这样支持RAID-6。它仅是RAID-1,即使在那里也很少使用。

其他缓存设置不受此影响,基本上,整个缓存机制根本不关心md驱动程序如何在内部实现事物。缓存执行其操作,而md执行其操作。因此,文件系统缓存对md之上的文件系统与裸驱动器之上的文件系统的工作原理相同。(实际情况要比这复杂得多,但您可以这样想。)


3

对于md-raid RAID1,可以为磁盘配置磁盘,--write-mostly并且--write-behind表明从较快的磁盘执行读取,而对较慢的磁盘进行写入可能会滞后。但是如何在内核级别缓存呢?内核是否在md-raid层之前或之后缓存磁盘写入的内容?

之后,由于此功能特定于md-raid。

您应该将此md-raid功能视为缓冲而非缓存。它受以下mdadm选项限制:

--write-behind =

指定应启用后写模式(仅对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()。如果没有,则根本不提供任何保证。


谢谢,但这确实提出了另一个问题:如果使用O_SYNC打开文件,在这种情况下,写入第一个磁盘或写入所有磁盘后,write()是否返回?
史蒂夫

3
必须先完成对非写后磁盘的子写操作
sourcejedi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.