mdadm RAID1阵列中单盘await、%util等指标远高于另一磁盘的原因排查
从你提供的sar输出能明显看到RAID1阵列里两块盘的性能严重失衡:sdd的await(168.66ms)和%util(90.52%)远高于sdc的21.67ms和8.99%,直接拖垮了整个md0阵列的性能(await高达567.10ms)。另外你提到当时正处于RAID校验(raid check)阶段,这也解释了md0没有读流量的现象——校验的读操作是磁盘层面的,不会体现在阵列设备的统计里。
先把你贴的sar数据整理下方便参考:
07:24:53 AM tps rkB/s wkB/s dkB/s areq-sz aqu-sz await %util DEV 07:25:03 AM 70.90 1382.40 577.65 0.00 27.65 1.54 21.67 8.99 sdc 07:25:03 AM 66.00 1382.40 540.85 0.00 29.14 11.13 168.66 90.52 sdd 07:25:03 AM 144.00 0.00 576.00 0.00 4.00 81.66 567.10 97.86 md0
针对这种单盘性能严重拖后腿的情况,我整理了几个优先级从高到低的排查方向:
优先排查磁盘硬件健康状态
RAID校验会遍历磁盘所有扇区,最容易暴露有潜在故障的磁盘。立刻用smartctl -a /dev/sdd查看sdd的SMART数据,重点关注:Reallocated_Sector_Ct(重映射扇区数):大于0说明已有坏道被重映射,是明确的故障前兆Seek_Error_Rate(寻道错误率):数值异常升高意味着磁头或盘片存在机械问题Hardware_ECC_Recovered:持续增长可能说明磁盘读取错误频发,硬件纠错压力大
如果SMART数据有异常,这块盘大概率需要提前更换,避免阵列彻底故障。
检查磁盘I/O调度器配置
两块盘如果用了不同的I/O调度器,在高负载下可能出现明显的性能差异。分别执行以下命令对比:cat /sys/block/sdc/queue/scheduler cat /sys/block/sdd/queue/scheduler比如sdc用了
mq-deadline而sdd用了cfq,就可能导致高负载下sdd延迟飙升。可以通过echo mq-deadline > /sys/block/sdd/queue/scheduler临时统一调度器,观察性能是否改善。排查磁盘接口/线缆故障
松动的SATA线缆、氧化的接口,或者sdd插在了速率更低的接口上(比如SATA2 vs SATA3),都会导致性能瓶颈。用lsblk -d -o NAME,ROTA,SIZE,MODEL,SERIAL,SPEED查看两块盘的接口速率,如果sdd的SPEED明显低于sdc,尝试更换线缆或调整接口位置。确认磁盘缓存设置
写入缓存(write cache)关闭会大幅增加磁盘的写入延迟。用hdparm -W /dev/sdc和hdparm -W /dev/sdd对比,如果sdd的write cache处于关闭状态(输出write-caching = off),可以用hdparm -W 1 /dev/sdd开启(注意:开启前确保电源稳定,避免意外掉电丢失数据)。检查RAID阵列内部状态
执行cat /proc/mdstat查看md0的状态,确认sdd是否被标记为degraded,或者有没有未完成的resync/recheck任务异常堆积。如果RAID内部同步逻辑出现问题,也可能导致单盘负载异常升高。排查后台进程干扰
虽然RAID1下读写操作应该是同步的,但不排除有异常进程绕过阵列直接读写sdd的情况。用iotop -oP实时观察I/O进程,或者pidstat -d 1查看进程级的I/O统计,确认是否有进程单独占用sdd的I/O资源。
备注:内容来源于stack exchange,提问作者Brian

