一台戴尔 R740 上六块 4T 盘组 RAID5,一块盘掉线后自动重建,mdstat 显示 resync 进度每小时只走百分之三,业务读延迟同时翻倍。

一开始怀疑是「sync_speed_max 被前一位运维写死在一个很小的值,重启后一直生效」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。内核默认把重建速率限制在较低值,避免重建把业务 IO 挤死。也可能是重建期间阵列处于降级状态,读请求要跨盘校验,本身就更慢。

少数情况下是盘的写缓存策略是 write through,重建时的顺序写没有走缓存。

第一件事是确认当前限速和重建进度

cat /proc/sys/dev/raid/speed_limit_max /proc/mdstat

接着在业务低谷临时提高重建上限

echo 200000 > /proc/sys/dev/raid/speed_limit_max

然后把限速写进配置文件,重启后保持一致

echo 'dev.raid.speed_limit_max = 200000' > /etc/sysctl.d/90-raid.conf

等前面都确认过,再查看重建期间各盘的错误计数

mdadm --detail /dev/md0 | tail -20

恢复的判定其实很直接。/proc/mdstat 里的 resync 行消失、状态回到 [UUUUUU],重建耗时缩短到十小时以内,业务读延迟回落到重建前的水平。

重建越快降级窗口越短,但业务会被拖慢,两头要权衡;重建期间再掉一块盘就是数据全失,务必提前把重要数据同步出去。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189