加速 Linux 软件 Raid 重建和重新同步的 5 个技巧
毫无疑问,我非常喜欢出色的 Linux 软件 RAID。创建、组装和重建小型阵列是没问题的。但是,当您尝试重建或重新同步大型阵列时,事情开始变得糟糕。当您看到重建阵列需要 22 小时时,您可能会感到沮丧。您可以随时使用以下五个技巧来提高 Linux 软件 RAID 0/1/5/6 重建的速度。
为什么要加快 Linux 软件 RAID 重建和重新同步的速度?
最近,我为我的一个客户构建了一个运行 Linux 的小型 NAS 服务器,该服务器有 5 个 2TB 磁盘,配置为 RAID 6,用于 Linux、Mac OS X 和 Windows XP/Vista/7/10 客户端计算机的一体式备份服务器。接下来,我输入命令cat /proc/mdstat,它报告 md0 处于活动状态并且恢复正在进行中。恢复速度约为 4000K/秒,大约需要 22 小时才能完成。我想早点完成。
关于延迟初始化和 ext4 文件系统的说明
创建 ext4 文件系统时,Linux 内核使用延迟初始化。此功能允许更快地创建文件系统。名为“ext4lazyinit”的进程在后台运行,以创建其余所有 inode 表。因此,您的 RAID 重建将以最低速度运行。这仅在您刚刚创建 ext4 文件系统时才会产生影响。在运行 mkfs.ext4 命令时,有一个选项可以启用或禁用此功能:
- lazy_itable_init[= <0 to disable, 1 to enable>]– 如果启用并且启用了 uninit_bg 功能,则 mke2fs 不会完全初始化 inode 表。这显著加快了文件系统初始化速度,但它要求内核在首次挂载文件系统时在后台完成初始化文件系统。如果省略选项值,则默认为 1 以启用延迟 inode 表清零。
- lazy_journal_init[= <0 to disable, 1 to enable>]– 如果启用,日志 inode 将不会被 mke2fs 完全清零。这显著加快了文件系统初始化速度,但如果系统在日志被完全覆盖一次之前崩溃,则会带来一些小风险。如果省略选项值,则默认为 1 以启用惰性日志 inode 清零。
提示 #1:/proc/sys/dev/raid/{speed_limit_max,speed_limit_min} 内核变量
此/proc/sys/dev/raid/speed_limit_min配置文件反映了阵列上当前非重建活动时的当前“目标”重建速度。速度以每秒千字节 (1 千字节 = 2 10字节 = 1024 字节) 为单位,是每个设备的速率,而不是每个阵列的速率。默认值为 1000。
此/proc/sys/dev/raid/speed_limit_max配置文件反映了阵列上当前没有非重建活动时的当前“目标”重建速度。默认值为 100,000。
要查看当前限制,请输入:
示例输出:
# sysctl dev.raid.speed_limit_min
# sysctl dev.raid.speed_limit_max
dev.raid.speed_limit_min = 10000 dev.raid.speed_limit_max = 20000
注意:以下技巧用于恢复 Linux 软件 RAID,并提高 RAID 重建速度。这些选项有利于调整重建过程,可能会增加整体系统负载、高 CPU 和内存使用率。
要提高速度,请输入:
# echo value > /proc/sys/dev/raid/speed_limit_min
或
# sysctl -w dev.raid.speed_limit_min=value
在此示例中,将其设置为 50000 K/Sec,请输入:
# echo 50000 > /proc/sys/dev/raid/speed_limit_min
或
# sysctl -w dev.raid.speed_limit_min=50000
如果要覆盖默认值,可以将这两行添加到/etc/sysctl.conf:
#################NOTE ################ ## You are limited by CPU and memory too # ########################################### dev.raid.speed_limit_min = 50000 ## good for 4-5 disks based array ## dev.raid.speed_limit_max = 2000000 ## good for large 6-12 disks based array ### dev.raid.speed_limit_max = 5000000
提示 #2:设置预读选项
设置每个 RAID 设备的预读(以 512 字节扇区为单位)。语法为:
# blockdev --setra 65536 /dev/mdX
## Set read-ahead to 32 MiB ##
# blockdev --setra 65536 /dev/md0
# blockdev --setra 65536 /dev/md1
提示 #3:为 RAID5 或 RAID 6 设置 stripe-cache_size
这仅适用于RAID5 和 RAID6,可将同步性能提高 3-6 倍。它记录条带缓存的大小(以每台设备的页面数为单位),该缓存用于同步对阵列的所有写入操作以及阵列降级时的所有读取操作。默认值为 256。有效值为 17 到 32768。在某些情况下,增加此数字可以提高性能,但会消耗一些系统内存。请注意,将此值设置得太高可能会导致系统出现“内存不足”的情况。使用以下公式:
memory_consumed = system_page_size * nr_disks * stripe_cache_size
要将 /dev/md0 的 stripe_cache_size 设置为 16 MiB,请键入:
# echo 16384 > /sys/block/md0/md/stripe_cache_size
要将 /dev/md3 的 stripe_cache_size 设置为 32 MiB,请键入:
# echo 32768 > /sys/block/md3/md/stripe_cache_size
提示 #4:在所有磁盘上禁用 NCQ
下面将使用 bash for 循环禁用 /dev/sda、/dev/sdb、..、/dev/sde 上的 NCQ
## sample for loop ## for i in sd[abcde] do echo 1 > /sys/block/$i/device/queue_depth done
提示 #5:位图选项
位图可优化崩溃后或移除并重新添加设备后的重建时间。通过键入以下命令将其打开:
# mdadm --grow --bitmap=internal /dev/md0
阵列重建或完全同步后,禁用位图:
# mdadm --grow --bitmap=none /dev/md0
结果
我的速度从 4k 上升到 51k:
cat /proc/mdstat
示例输出:
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] md5 : active raid1 sde2[2](S) sdd2[3](S) sdc2[4](S) sdb2[1] sda2[0] 530048 blocks [2/2] [UU] md0 : active raid6 sde3[4] sdd3[3] sdc3[2] sdb3[1] sda3[0] 5855836800 blocks level 6, 64k chunk, algorithm 2 [5/5] [UUUUU] [============>........] resync = 61.7% (1205475036/1951945600) finish=242.9min speed=51204K/sec
像专业人士一样监控 RAID 重建/恢复过程
您 cat /proc/mdstat 文件。此只读文件包含有关当前正在运行的阵列的状态的信息并显示重建速度:
# cat /proc/mdstat
或者使用watch 命令在屏幕上反复显示 /proc/mdstat 输出,键入:
示例输出:
# watch -n1 cat /proc/mdstat
图 01:针对 /dev/md2 的 Linux raid6 性能优化
# mdadm --detail /dev/md2
示例输出:
图 02:查找有关 md2 raid 阵列的信息
# mdadm --detail /dev/md3 | grep 'info-you-want'
另一种选择是通过键入以下 iostat 命令来查看磁盘利用率,以查看实际情况: 示例输出:
# watch iostat -k 1 2
# watch -n1 iostat -k 1 2
图 03:查看设备和分区的 CPU 统计信息和输入/输出统计信息
# df -hT /raid1
# du -csh /raid1
结论
我们学习了如何优化 Linux 软件 RAID 设备的速度。
- 使用 man 命令查看以下手册页:
$ man 4 md
$ man 8 mdadm
$ man 5 proc - 另请查看 Debian/Ubuntu Linux 上的 /etc/cron.d/mdadm 和 /usr/share/mdadm/checkarray