软件 RAID10 设置写入小文件非常慢,这正常吗?

软件 RAID10 设置写入小文件非常慢,这正常吗?

我在 Linux 3.16.6-203.fc20.x86_64 上设置了软件 RAID-10,具有 1.2 元数据和默认块大小 (512K):

$ cat /proc/mdstat
md0 : active raid10 sdc1[4] sdb1[0] sdd1[2] sde1[3]
      3907023872 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      bitmap: 4/30 pages [16KB], 65536KB chunk

unused devices: <none>

文件系统是 ext4,位于 LVM 之上,位于 RAID-10 卷组之上。

$ df -k .
Filesystem                     1K-blocks      Used  Available Use% Mounted on
/dev/mapper/vg_raid10-lv_home 2015734504 810039552 1103278568  43% /home

带安装选项:

$ mount | grep vg_raid10-lv_home
/dev/mapper/vg_raid10-lv_home on /home type ext4 (rw,relatime,seclabel,stripe=256)

一切看起来都很好。 SMART 表示所有磁盘都完全正常,没有重新分配、挂起或脱机扇区。原始同步写入吞吐量似乎相当不错:

$ dd if=/dev/zero of=tmp.bin bs=1G count=1 oflag=dsync
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 7.85743 s, 137 MB/s

然而,当写小 100b (编辑:正如答案中所指出的,我正在编写 512 字节块,而不是 100 字节块)到 RAID 阵列,它是极其慢(每次同步写入大约 84 毫秒):

$ dd if=/dev/zero of=tmp.bin bs=512 count=1000 oflag=dsync
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 84.2859 s, 6.1 kB/s

这对于我的 RAID-10 配置来说正常吗?

答案1

RAID10 不会加速任何形式的文件O_*SYNC,至少不会加速小文件。您一次写入 512b,每次写入后都会将其强制写入磁盘(加上读回所需的元数据,例如文件大小)。

这需要 RAID10 写入至少 2 个磁盘,可能是 4 个(即所有磁盘)。所有这些写入都需要在返回 dd 之前完成,因为这是所O_DSYNC要求的保证。

答案2

你的 dd 命令给我提供了 73.7 kB/s - 在 SSD 上。所以是的,我想这很正常。或者更确切地说,dd 并不是一个好的基准。

RAID 当然不会对小文件进行任何加速。访问时间仍然保持不变,对于 HDD 来说,对于小文件来说,这将花费大部分精力,首先将读头读取到文件的物理地址将比实际读取它花费更长的时间。

(如果您有 4K 扇区磁盘,则速度会进一步减慢,因为磁盘必须执行一些特殊操作才能写入少于完整扇区的数据。)

答案3

你不是在做“100b”(字节?块?你的意图是什么?)块,而是在做 512 字节块。这总是很慢,因为 RAID 使用 512k 块。这意味着对于每一个512 字节 RAID 系统必须读取 512k 块,更新该块中的 512 字节,计算其奇偶校验,并将数据 + 奇偶校验写入磁盘。它必须为您正在写入的 1000 个块中的每一个每次执行更新、奇偶校验计算和 512k + 512k 奇偶校验写入。读取仅执行一次,因为它保存在缓冲区高速缓存中,并且整个操作仅占用一个 RAID 块。

所以,是的,这很正常。不要这样做:-)

编辑:以上对于 RAID5 来说是正确的。对于 RAID10,不计算奇偶校验,但对于每个dd512 字节块,仍然有 2 次 512k 写入,每个镜像一次。因此,您仍然写入了总计 1000MB 的内容,而仅更新了 512k 内容。可能系统足够聪明,只能写出更新的扇区,但我强烈怀疑事实并非如此。还要考虑对写入意图位图的更新。

相关内容