如何调试性能异常缓慢的软件RAID 10阵列?
如何调试性能异常缓慢的软件RAID 10阵列?
我来帮你一步步排查这个RAID 10性能拉胯的问题——毕竟8盘RAID10比单盘还慢肯定不对劲,先从基础环节开始排查:
一、先揪出可能拖后腿的单个磁盘
RAID10的性能下限由最慢的那块盘决定,哪怕smartmontools没报故障,也可能存在隐性性能问题。你可以逐个测试成员盘的读写速度:
- 读测试(不破坏数据):对每个磁盘分区执行(比如先测sda1):
这个命令会读取1GB数据到/dev/null,dd if=/dev/sda1 of=/dev/null bs=1M count=1024 conv=fdatasyncconv=fdatasync能避免缓存干扰,真实反映磁盘读速。 - 写测试(需要临时空间,建议找个空闲分区或者临时挂载点):
写完后记得删除临时文件。dd if=/dev/zero of=/mnt/temp_test_file bs=1M count=1024 conv=fdatasync - 更专业的测试可以用
fio,比如随机读测试:
对比所有磁盘的测试结果,如果某块盘的读写速度明显低于其他盘,那它就是罪魁祸首。fio --name=random_read_test --ioengine=libaio --rw=randread --bs=4k --numjobs=1 --size=1G --iodepth=32 --runtime=60 --time_based
二、检查RAID和文件系统的配置参数
1. RAID写入策略
mdadm的写入策略直接影响写入性能,你可以查看当前策略:
cat /sys/block/md126/md/write_policy
如果输出是write-through,改成writeback能大幅提升写入速度(注意:writeback依赖RAID缓存,突然断电可能丢失未同步的数据,确保电源稳定再改):
echo writeback > /sys/block/md126/md/write_policy
2. 文件系统挂载选项
检查/etc/fstab里的RAID挂载参数,如果有sync选项,立刻去掉——这个选项会强制每写一次就同步到磁盘,直接把写入速度拉垮。建议加上noatime,nodiratime,减少文件系统的元数据写入开销。
三、分析系统IO瓶颈
你的vmstat输出里b列是10,说明有10个进程在等待IO,系统明显卡在磁盘IO上,可以用更详细的工具分析:
- 用
iostat -x 1实时查看每个磁盘的IO利用率:重点看%util列,如果某块盘的%util接近100%,说明它已经跑满了,是瓶颈;如果所有盘利用率都很高,可能是RAID配置或文件系统的问题。 - 用
iotop查看哪个进程在疯狂占用IO,排除其他进程抢资源的情况。
四、检查RAID一致性
即使mdstat显示所有磁盘在线,也可能存在数据不一致的情况,触发一次RAID一致性检查:
echo check > /sys/block/md126/md/sync_action
然后查看/proc/mdstat的同步进度,完成后去/var/log/messages或dmesg里找错误信息,如果有磁盘相关的错误,那这块盘大概率有问题。
五、调整磁盘IO调度器
机械硬盘和固态硬盘的最佳调度器不同,你可以查看当前调度器:
cat /sys/block/sda/queue/scheduler
如果是机械盘,建议改成deadline调度器(比默认的cfq更适合大文件读写):
echo deadline > /sys/block/sda/queue/scheduler
记得对RAID的所有成员盘都执行这个命令。
如果排查后确定某块磁盘有问题,替换步骤如下:
- 标记故障盘为失效:
把mdadm /dev/md126 --fail /dev/sdx1sdx1换成你找到的故障分区。 - 从RAID中移除故障盘:
mdadm /dev/md126 --remove /dev/sdx1 - 插入新磁盘,分区成和其他成员盘一致的格式(比如同样的分区类型、大小),假设新分区是
sdy1,添加到RAID:mdadm /dev/md126 --add /dev/sdy1 - 查看
/proc/mdstat等待同步完成,同步结束后RAID就恢复8盘状态了。
备注:内容来源于stack exchange,提问作者jnasworld223




