一台戴尔 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],重建耗时缩短到十小时以内,业务读延迟回落到重建前的水平。
重建越快降级窗口越短,但业务会被拖慢,两头要权衡;重建期间再掉一块盘就是数据全失,务必提前把重要数据同步出去。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。