Linux 软件 RAID 5 随机小写入性能极差 - 重新配置建议

Linux 软件 RAID 5 随机小写入性能极差 - 重新配置建议

我有 3 个 1 TB 硬盘和 3 个 500 GB 硬盘。目前,每个大小分组都在 RAID 5 中,两者都在 LVM 卷组中(带有条带 LV)。

我发现这对于我进行小型随机写入来说太慢了。我在 RAID 级别和 LVM 条带级别上都尝试过条带大小,以及条带缓存和预读缓冲区大小的增加。我还按照通常的建议禁用了 NCQ。

所以我已经完成了 Linux 软件 raid 5。如果没有专用的控制器,它对我的​​目的来说毫无用处。

我正在添加另外 1 TB 驱动器和另外 500 GB 驱动器,所以每种驱动器有 4 个。

您将如何配置这八个驱动器以获得最佳的小随机写入性能?当然不包括简单的 RAID 0,因为这种设置的重点显然也是为了冗余。我考虑过将 4 个 500 GB 磁盘放入 2 个 RAID 0,然后将其添加到其他 4 个 1 TB HD 的 RAID 10 中,以形成 6 个磁盘 RAID 10,但我不确定这是否是最佳解决方案。您怎么说?

编辑:没有更多预算用于硬件升级。我真正想问的是,既然四个 1 TB 驱动器可以直接组成 RAID 10,那么我该如何处理四个 500 GB 驱动器,才能使它们最适合 4x1TB RAID 10,而不会出现冗余或性能问题?我的另一个想法是将所有四个 500 GB 驱动器一起组成 RAID 10,然后使用 LVM 将该容量添加到 4x1TB RAID10 中。您能想到更好的办法吗?

另一个编辑:现有数组的格式如下:

1 TB ext4 formatted lvm striped file share. Shared to two Macs via AFP.
1 500 GB lvm logical volume exported via iscsi to a Mac, formatted as HFS+. Used a Time Machine backup.
1 260 GB lvm logical volume exported via iscsi to a Mac, formatted as HFS+. Used as a Time Machine backup.
1 200 GB ext4 formatted lvm partition, used a disk device for a virtualised OS installtion.
An lvm snapshot of the 500 GB time machine backup.

我还没有尝试过的一件事是用 ext4 文件系统上的文件替换 Time Machine LV(这样 iscsi 安装指向文件而不是块设备)。我觉得这可以解决我的速度问题,但它会阻止我拍摄这些分区的快照。所以我不确定这是否值得权衡。

将来我打算将 iPhoto 和 iTunes 库移动到另一个 HFS+ iscsi 挂载点上的服务器上,通过对该挂载点的测试,我开始注意到其无意义的随机写入性能。

如果您好奇的话,我使用了此网址的 Raid Math 部分中的信息:http://wiki.centos.org/HowTos/Disk_Optimization弄清楚如何为 ext4 分区设置所有内容(结果我看到它具有出色的性能)但这似乎对 iscsi 共享 HFS+ 卷没有任何好处。

更多细节:

 output of lvdisplay:

  --- Logical volume ---
  LV Name                /dev/array/data
  VG Name                array
  LV UUID                2Lgn1O-q1eA-E1dj-1Nfn-JS2q-lqRR-uEqzom
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                1.00 TiB
  Current LE             262144
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           251:0

  --- Logical volume ---
  LV Name                /dev/array/etm
  VG Name                array
  LV UUID                KSwnPb-B38S-Lu2h-sRTS-MG3T-miU2-LfCBU2
  LV Write Access        read/write
  LV snapshot status     source of
                         /dev/array/etm-snapshot [active]
  LV Status              available
  # open                 1
  LV Size                500.00 GiB
  Current LE             128000
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           251:1

  --- Logical volume ---
  LV Name                /dev/array/jtm
  VG Name                array
  LV UUID                wZAK5S-CseH-FtBo-5Fuf-J3le-fVed-WzjpOo
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                260.00 GiB
  Current LE             66560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           251:2

  --- Logical volume ---
  LV Name                /dev/array/mappingvm
  VG Name                array
  LV UUID                69k2D7-XivP-Zf4o-3SVg-QAbD-jP9W-cG8foD
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                200.00 GiB
  Current LE             51200
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           251:3

  --- Logical volume ---
  LV Name                /dev/array/etm-snapshot
  VG Name                array
  LV UUID                92x9Eo-yFTY-90ib-M0gA-icFP-5kC6-gd25zW
  LV Write Access        read/write
  LV snapshot status     active destination for /dev/array/etm
  LV Status              available
  # open                 0
  LV Size                500.00 GiB
  Current LE             128000
  COW-table size         500.00 GiB
  COW-table LE           128000
  Allocated to snapshot  44.89% 
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           251:7


output of pvs --align -o pv_name,pe_start,stripe_size,stripes

PV         1st PE  Stripe  #Str
  /dev/md0   192.00k      0     1
  /dev/md0   192.00k      0     1
  /dev/md0   192.00k      0     1
  /dev/md0   192.00k      0     1
  /dev/md0   192.00k      0     0
  /dev/md11  512.00k 256.00k    2
  /dev/md11  512.00k 256.00k    2
  /dev/md11  512.00k 256.00k    2
  /dev/md11  512.00k      0     1
  /dev/md11  512.00k      0     1
  /dev/md11  512.00k      0     0
  /dev/md12  512.00k 256.00k    2
  /dev/md12  512.00k 256.00k    2
  /dev/md12  512.00k 256.00k    2
  /dev/md12  512.00k      0     0

output of cat /proc/mdstat

md12 : active raid5 sdc1[1] sde1[0] sdh1[2]
      976770560 blocks level 5, 256k chunk, algorithm 2 [3/3] [UUU]

md11 : active raid5 sdg1[2] sdf1[0] sdd1[1]
      1953521152 blocks level 5, 256k chunk, algorithm 2 [3/3] [UUU]



output of  vgdisplay:


--- Volume group ---
  VG Name               array
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                5
  Open LV               3
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               2.73 TiB
  PE Size               4.00 MiB
  Total PE              715402
  Alloc PE / Size       635904 / 2.43 TiB
  Free  PE / Size       79498 / 310.54 GiB
  VG UUID               PGE6Oz-jh96-B0Qc-zN9e-LKKX-TK6y-6olGJl



output of dumpe2fs /dev/array/data | head -n 100 (or so)

dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>
Last mounted on:          /mnt/array/data
Filesystem UUID:          b03e8fbb-19e5-479e-a62a-0dca0d1ba567
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              67108864
Block count:              268435456
Reserved block count:     13421772
Free blocks:              113399226
Free inodes:              67046222
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      960
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
RAID stride:              128
RAID stripe width:        128
Flex block group size:    16
Filesystem created:       Thu Jul 29 22:51:26 2010
Last mount time:          Sun Oct 31 14:26:40 2010
Last write time:          Sun Oct 31 14:26:40 2010
Mount count:              1
Maximum mount count:      22
Last checked:             Sun Oct 31 14:10:06 2010
Check interval:           15552000 (6 months)
Next check after:         Fri Apr 29 14:10:06 2011
Lifetime writes:          677 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      9e6a9db2-c179-495a-bd1a-49dfb57e4020
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             128M
Journal length:           32768
Journal sequence:         0x000059af
Journal start:            1




output of lvs array --aligned -o seg_all,lv_all

  Type    #Str Stripe  Stripe  Region Region Chunk Chunk Start Start SSize   Seg Tags PE Ranges                                       Devices                             LV UUID                                LV           Attr   Maj Min Rahead KMaj KMin KRahead LSize   #Seg Origin OSize   Snap%  Copy%  Move Convert LV Tags Log Modules 
  striped    2 256.00k 256.00k     0      0     0     0     0      0   1.00t          /dev/md11:0-131071 /dev/md12:0-131071           /dev/md11(0),/dev/md12(0)           2Lgn1O-q1eA-E1dj-1Nfn-JS2q-lqRR-uEqzom data         -wi-ao  -1  -1   auto 251  0      1.00m   1.00t    1             0                                                 
  striped    2 256.00k 256.00k     0      0     0     0     0      0 500.00g          /dev/md11:131072-195071 /dev/md12:131072-195071 /dev/md11(131072),/dev/md12(131072) KSwnPb-B38S-Lu2h-sRTS-MG3T-miU2-LfCBU2 etm          owi-ao  -1  -1   auto 251  1      1.00m 500.00g    1        500.00g                                        snapshot
  linear     1      0       0      0      0  4.00k 4.00k    0      0 500.00g          /dev/md11:279552-407551                         /dev/md11(279552)                   92x9Eo-yFTY-90ib-M0gA-icFP-5kC6-gd25zW etm-snapshot swi-a-  -1  -1   auto 251  7      1.00m 500.00g    1 etm    500.00g  44.89                                 snapshot
  striped    2 256.00k 256.00k     0      0     0     0     0      0 260.00g          /dev/md11:195072-228351 /dev/md12:195072-228351 /dev/md11(195072),/dev/md12(195072) wZAK5S-CseH-FtBo-5Fuf-J3le-fVed-WzjpOo jtm          -wi-ao  -1  -1   auto 251  2      1.00m 260.00g    1             0                                                 
  linear     1      0       0      0      0     0     0     0      0 200.00g          /dev/md11:228352-279551                         /dev/md11(228352)                   69k2D7-XivP-Zf4o-3SVg-QAbD-jP9W-cG8foD mappingvm    -wi-a-  -1  -1   auto 251  3      1.00m 200.00g    1             0                                                 




cat /sys/block/md11/queue/logical_block_size 
512
cat /sys/block/md11/queue/physical_block_size 
512
cat /sys/block/md11/queue/optimal_io_size 
524288
cat /sys/block/md11/queue/minimum_io_size 
262144

cat /sys/block/md12/queue/minimum_io_size 
262144
cat /sys/block/md12/queue/optimal_io_size 
524288
cat /sys/block/md12/queue/logical_block_size 
512
cat /sys/block/md12/queue/physical_block_size 
512

编辑:所以没人能告诉我这里是否有问题?没有任何具体的建议?嗯。

答案1

很抱歉,除非控制器有足够的缓存,否则 RAID 5 总是不适合小写入。校验和需要大量的读取和写入。

最好的选择是硬件控制器上的 Raid 10 - 为了获得真正的惊人性能,可以使用类似 Adaptec 的东西,并将一半驱动器设为 SSD....这样,所有读取都将转到 SSD,这将为您提供大量性能,尽管写入显然必须分开。不确定 Linux 软件是否可以做到这一点。

其余的完全取决于您的使用模式,而且基本上 - 您没有告诉我们有关这方面的任何信息。

答案2

选项 A。)您需要空间吗?您可以将 1TB 驱动器“短行程”至 500GB,并运行 8 磁盘 RAID10 阵列(获得 2TB 可用空间)。由于您没有提到,我假设它们都是 7200rpm 主轴,因此您每秒的随机写入次数约为 400 次。

这是您的最佳性能选择,其他任何选择都需要更好的硬件或 raid0。

选项 B.) 一个 1TB 驱动器的 4 磁盘 RAID10 阵列,另一个 500GB 驱动器的 4 磁盘阵列,简单的 lvm 跨接。这样,一个驱动器上就有 200 个随机写入 iops,另一个驱动器上也有 200 个随机写入 iops。

选项 C.) 所有驱动器的前 500GB 组成一个 8 磁盘 RAID10 阵列,然后 1TB 驱动器的“后”500GB 组成一个 4 磁盘 RAID10 阵列,lvm 跨接。当您在 VG 的 8 磁盘集部分时,这将提供峰值 400 随机写入 iops。

您并没有告诉我们有关该应用程序的任何信息,如果它是一个连续的日志写入,那么最好使用 C。如果它分解为至少两个并行的写入线程,我更喜欢 B 的简单性(并且不要将它们 lvm 在一起)。

答案3

除了配置 RAID 和 LVM 之外,您是否尝试过不同的磁盘 I/O 提升器?CFQ如今,这似乎是许多发行版的默认设置,对于某些工作负载来说,它没问题。对我来说,它曾多次给我带来严重困扰 —— 例如,一台备份服务器备份了大约 20 台主机,总共约 3000 万个文件和几 TB 的数据,速度出奇地慢,I/O 占用了大量时间。

在我切换到最后期限调度程序,该服务器上的所有操作都比以前快了大约两倍。好吧,在我的例子中,文件系统是(现在仍然是...)XFS,过去 XFS+CFQ 组合有其缺陷,但无论如何值得一试。

如果要动态更改 I/O 升降机:

echo deadline >/sys/block/yourdisk/queue/scheduler

如果你想使该更改永久生效,请添加到核心在您的 grub.conf 中行--或者您使用的任何引导加载程序--参数elevator=deadline

您还可以尝试anticipatorynoop调度程序。

答案4

从本质上来说,Raid 5 不适合小规模写入,因为它必须先读取每个驱动器上的每个 raid 块,然后才能写入磁盘。硬件控制器通过使用电池支持的缓存来解决这个问题,从而避免等待磁盘寻道。这样的缓存将有助于所有小规模写入,而不仅仅是在 Raid 5 上,但它在那里特别有用。

不过,可能有一个解决方案:尝试切换文件系统以日志记录数据:

tune2fs -o journal_data /dev/md0

(这显然适用于 ext3)

您可能还想增加日志的大小。使用另一台设备进行日志记录可以加快速度。通常,如果您的系统有 Raid 1,数据有大型 Raid 5,则在第一个上保留一个卷;这样提交日志的速度会快得多,因为它只需要一半的寻道次数。(有关如何执行此操作的更多信息,请参阅 man tune2fs)

重要提示:我还没有测试过。它应该可以工作,但也可能不会带来理论上那么多的好处。

相关内容