如何从 md raid1 卷读取大于 4k 的块大小

如何从 md raid1 卷读取大于 4k 的块大小

我想设置一个 raid01 配置(由两个 raid0 组成的 raid1),其中一个 raid0 卷设置为写入为主状态,这样所有读取都会转到另一个(即一个是磁盘,另一个是闪存)。但是,整个计划遇到了一个问题,即直接从 raid0 读取时,每个磁盘 64k(块大小)是正确的,但是当我在 raid0 上添加 raid1 时,所有读取都会下降到只有 4k,因此性能很差。我猜这是因为 md(或堆栈中的某些东西)已决定 4k 是错误的粒度,所以它以这个大小进行读取,但这只是猜测。无论如何,我真的需要找到一种方法来修复它。

为了测试这一点,我使用了一个只有 1 面的 raid1,即通过以下方式创建的

mdadm --create /dev/md2 -l 1 -n 2 /dev/md1 "missing"

另一个有趣的事情是,raid0 md1 阵列上的 dd bs=512K 显示 md1 及其所有组件的读取次数为 64k,而我原本预计 iostat 会显示 md1 的读取次数为 512K,其组件磁盘的读取次数为 64K。md2 上的 dd bs=512K 显示所有磁盘的读取次数为 4K。我通过将 MB/s 除以 tps 来计算块大小,即 MB/事务。

以下是全部详细信息。

[root@pe-r910 ~]# mdadm --detail /dev/md2
/dev/md2:
        Version : 1.2
  Creation Time : Tue Jul 26 23:13:59 2011
     Raid Level : raid1
     Array Size : 1998196216 (1905.63 GiB 2046.15 GB)
  Used Dev Size : 1998196216 (1905.63 GiB 2046.15 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Thu Jul 28 08:29:35 2011
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           Name : pe-r910.ingres.prv:2  (local to host pe-r910.ingres.prv)
           UUID : 299ea821:756847a0:4db591e4:38769641
         Events : 160

    Number   Major   Minor   RaidDevice State
       0       9        1        0      active sync   /dev/md1
       1       0        0        1      removed

[root@pe-r910 ~]# mdadm --detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Tue Jul 26 01:05:05 2011
     Raid Level : raid0
     Array Size : 1998197376 (1905.63 GiB 2046.15 GB)
   Raid Devices : 14
  Total Devices : 14
    Persistence : Superblock is persistent

    Update Time : Tue Jul 26 01:05:05 2011
          State : clean
 Active Devices : 14
Working Devices : 14
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 64K

           Name : pe-r910.ingres.prv:1  (local to host pe-r910.ingres.prv)
           UUID : 735bd502:62ed0509:08c33e15:19ae4f6b
         Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1
       4       8       81        4      active sync   /dev/sdf1
       5       8       97        5      active sync   /dev/sdg1
       6       8      113        6      active sync   /dev/sdh1
       7       8      129        7      active sync   /dev/sdi1
       8       8      145        8      active sync   /dev/sdj1
       9       8      161        9      active sync   /dev/sdk1
      10       8      177       10      active sync   /dev/sdl1
      11       8      193       11      active sync   /dev/sdm1
      12       8      209       12      active sync   /dev/sdn1
      13       8      225       13      active sync   /dev/sdo1
[root@pe-r910 ~]# dd if=/dev/md1 bs=512K count=10000 iflag=nonblock,direct of=/dev/null
10000+0 records in
10000+0 records out
5242880000 bytes (5.2 GB) copied, 3.45236 s, 1.5 GB/s
[root@pe-r910 ~]# dd if=/dev/md2 bs=512K count=10000 iflag=nonblock,direct of=/dev/null
10000+0 records in
10000+0 records out
5242880000 bytes (5.2 GB) copied, 6.81182 s, 770 MB/s
[root@pe-r910 ~]#

更新:这似乎只是 md on md 的问题。如果我直接在磁盘上创建 raid1,其读取速率与磁盘相同。所以我认为我可以重新配置为 raid10(一组 raid1 组成一个 radi0​​),而不是 raid01(2 个 raid0 组成一个 raid1)。

答案1

创建设备时使用--chunk=64k或--chunk=128k。有关实际块大小,请参阅您的磁盘规格/测试。

不幸的是,创建之后没有办法改变它。

还有条带缓存端参数,这可能会影响

参见此文章 http://www.amiryan.org/2009/04/10/solved-linux-software-raid-5-too-slow/

答案2

这可能很明显,但是您是否尝试在创建设备时指定--chunk = 64k?

相关内容