我有 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
。
您还可以尝试anticipatory
和noop
调度程序。
答案4
从本质上来说,Raid 5 不适合小规模写入,因为它必须先读取每个驱动器上的每个 raid 块,然后才能写入磁盘。硬件控制器通过使用电池支持的缓存来解决这个问题,从而避免等待磁盘寻道。这样的缓存将有助于所有小规模写入,而不仅仅是在 Raid 5 上,但它在那里特别有用。
不过,可能有一个解决方案:尝试切换文件系统以日志记录数据:
tune2fs -o journal_data /dev/md0
(这显然适用于 ext3)
您可能还想增加日志的大小。使用另一台设备进行日志记录可以加快速度。通常,如果您的系统有 Raid 1,数据有大型 Raid 5,则在第一个上保留一个卷;这样提交日志的速度会快得多,因为它只需要一半的寻道次数。(有关如何执行此操作的更多信息,请参阅 man tune2fs)
重要提示:我还没有测试过。它应该可以工作,但也可能不会带来理论上那么多的好处。