ubuntu – 为什么mdadm在同步挂载时写入速度非常慢?

ubuntu – 为什么mdadm在同步挂载时写入速度非常慢?
我有一个6磁盘raid6 mdadm数组我想基准写入:
root@ubuntu:~# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid6 sda[0] sdf[5] sde[4] sdd[3] sdc[2] sdb[1]      1953545984 blocks level 6, 64k chunk, algorithm 2 [6/6] [UUUUUU]

由于缓存,基准测试可能不准确 – 例如,请注意此处的写入速度高于应有的速度:

root@ubuntu:/mnt/raid6# dd if=/dev/zero of=delme bs=1M count=100100+0 records in100+0 records out104857600 bytes (105 MB) copied, 0.276026 s, 380 MB/s

现在我们可以非常轻松地禁用每个磁盘缓存:

root@ubuntu:~# hdparm -W0 /dev/sd*/dev/sda: setting drive write-caching to 0 (off) write-caching =  0 (off)/dev/sdb: setting drive write-caching to 0 (off) write-caching =  0 (off)/dev/sdc: setting drive write-caching to 0 (off) write-caching =  0 (off)/dev/sdd: setting drive write-caching to 0 (off) write-caching =  0 (off)/dev/sde: setting drive write-caching to 0 (off) write-caching =  0 (off)/dev/sdf: setting drive write-caching to 0 (off) write-caching =  0 (off)

但仍有Linux缓存:

root@ubuntu:/mnt/raid6# dd if=/dev/zero of=delme bs=1M count=1010+0 records in10+0 records out10485760 bytes (10 MB) copied, 0.00566339 s, 1.9 GB/s

要禁用Linux缓存,我们可以同步挂载文件系统:

mount -o remount,sync /mnt/raid6

但在此之后写入变得比它们应该更慢:

root@ubuntu:/mnt/raid6# dd if=/dev/zero of=delme bs=1M count=1010+0 records in10+0 records out10485760 bytes (10 MB) copied, 23.3311 s, 449 kB/s

这就好像mdadm需要异步安装才能运行.这里发生了什么?

性能显着恶化,因为同步写入会强制奇偶校验计算来锤击磁盘.

通常,计算和写入奇偶校验是一个相对缓慢的过程,特别是对于RAID 6 – 在您的情况下,md不仅必须将数据分段为四个块,它还会为每个条带计算两个奇偶校验块.为了提高性能,RAID实现(包括md)将在内存中缓存最近使用的条带,以便将要写入的数据与现有数据进行比较,并在写入时快速重新计算奇偶校验.如果将新数据写入缓存的条带,它可以比较,分段和重新计算奇偶校验,而无需接触磁盘,然后再刷新它.您创建了一个md总是错过缓存的情况,在这种情况下,它必须从磁盘读取条带,比较数据,分割新数据,重新计算奇偶校验,然后将新条带直接刷新到磁盘.在高速缓存命中时需要对磁盘进行零读取和写入的内容将变为每次写入的条带的六次读取和六次写入.

当然,你观察到的性能差异是巨大的(1.9GB / s对449KB / s),但我认为这都是md为保持数据完整性做了多少工作.

磁盘排列的方式可能会加剧这种性能损失……如果你将它们全部放在一个控制器上,那么额外的读写将使性能停滞不前.

推荐阅读