为什么在同步安装时mdadm的写入速度不可用?

我有一个6磁盘raid6 mdadmarrays我想基准写道:

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] 

由于caching的原因,基准testing可能不准确,例如,请注意,此处的写入速度比应该高一些:

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

现在我们可以很容易地禁用每个磁盘caching:

 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) 

但是仍然有Linuxcaching:

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

要禁用Linuxcaching,我们可以同步安装文件系统:

 mount -o remount,sync /mnt/raid6 

但是在写入之后,它们变得比应该慢一些:

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

就好像mdadm需要asynchronous装载才能运行。 这里发生了什么?

性能急剧恶化,因为同步写入迫使奇偶校验计算锤击磁盘。

一般来说,计算和写入奇偶校验是一个相对缓慢的过程,特别是对于RAID 6–在你的情况下,不仅md必须将数据分成四个块,然后计算每个条块的两个奇偶校验块。 为了提高性能,RAID实现(包括md)会将最近使用的条带caching在内存中,以便将要写入的数据与现有数据进行比较,并在写入时快速重新计算奇偶校验。 如果将新数据写入高速caching条带,则可以比较,分片并重新计算奇偶校验,而不必接触磁盘,然后再刷新。 您已经创build了一种情况,即md总是忽略caching,在这种情况下,必须从磁盘读取数据条,比较数据,分割新数据,重新计算奇偶校验,然后直接将新条带刷新到磁盘。 在caching命中时,要求磁盘读/写零次数为零,写入的每个条带变为六次读取和六次写入

当然,您观察到的性能差异是巨大的(1.9GB / s与449KB / s),但我认为这都是为了维护数据完整性所做的工作。

如果您将磁盘安排在一个控制器上,那么这种性能上的打击可能会更加复杂,如此多的读取和写入操作将使性能停滞不前。

引用提问者:

但是仍然有Linuxcaching:

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

要禁用Linuxcaching,我们可以同步安装文件系统:

 mount -o remount,sync /mnt/raid6 

这是不正确的…同步不只是像你想要的基准禁用caching。 它使每个写入结果都处于“同步”命令,这意味着将caching一直刷新到磁盘。

这里是一个服务器在这里,更好地解释:

 $ dd if=/dev/zero of=testfile bs=1M count=500 500+0 records in 500+0 records out 524288000 bytes (524 MB) copied, 0.183744 s, 2.9 GB/s $ dd if=/dev/zero of=testfile bs=1M count=500 conv=fdatasync 500+0 records in 500+0 records out 524288000 bytes (524 MB) copied, 5.22062 s, 100 MB/s 

conv = fdatasync仅仅意味着在写入之后刷新,并且告诉你包括该刷新的时间。 或者,你可以这样做:

 $ time ( dd if=/dev/zero of=testfile bs=1M count=500 ; sync ) 500+0 records in 500+0 records out 524288000 bytes (524 MB) copied, 0.202687 s, 2.6 GB/s real 0m2.950s user 0m0.007s sys 0m0.339s 

然后从2.95s实时计算MB / s,而不是上面的0.2s。 但是,这是丑陋的,更多的工作,因为由dd打印的统计数据不包括同步。

如果你使用“同步”,你会冲洗每一个写…也许这意味着每个块,将运行非常缓慢。 “同步”应该只用于非常严格的系统,例如。 那些由于磁盘故障而导致单个事务丢失的数据库是不可接受的(例如,如果我从我的银行账户中将十亿美元转移给您的系统,系统崩溃,并且突然间您有钱,但我也是如此)。

这是另外一个解释,还有一些我很久以前读过的选项。 http://romanrm.ru/en/dd-benchmark

还有一点需要注意的是:你这样做的基准对我来说是完全有效的,尽pipe在其他许多人的观点中是不合法的。 但这不是一个真实的testing。 这是一个单线程顺序写入。 如果你的真实生活用例就是这样,例如。 通过networking发送一些大文件,那么它可能是一个很好的基准。 如果你的用例不同,例如。 一个有500人同时上传小文件的ftp服务器,那就不是很好。

而且,你应该在RAM上使用一个随机生成的文件来获得最好的结果。 一些文件系统在喂零时太聪明了。 例如。 在Linux上使用安装在/ dev /上的ram文件系统tmpfs。 (在某些系统上/ dev / random或/ dev / urandom是慢的,所以使用另一个…我忘记了哪一个,但是要么他们将远远less于RAM,所以不要直接使用)

 dd if=/dev/random of=/dev/shm/randfile bs=1M count=500 dd if=/dev/shm/randfile bs=1M count=500 conv=fdatasync 

你能告诉我们你的6个磁盘是如何组成的吗? 听起来好像他们是SAN / DAS的一部分,无论目标是什么 – 它们都是由相同的物理磁盘组成的(所以如果所有的6个磁盘都驻留在同一个磁盘上,那么性能将比单个磁盘降低6倍)。

看看这个链接到anwerleaks.com。

那么你是如何设置你的位图?