自建机房的一台 CentOS 7.9,巡检发现 sda 的 Reallocated_Sector_Ct 从 8 涨到 48,Current_Pending_Sector 也多了 3,业务还在跑,iostat 里偶发两秒左右的卡顿。
一开始怀疑是「机箱散热差,盘温长期五十五度以上,加速了介质老化」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。盘面出现了新的坏道,固件把扇区重映射到备用区,计数就这么涨上去。还有一种是备用扇区池有限,涨得快说明坏道在扩散而不是一次偶发。
还有一种情况,RAID 卡电池失效导致写缓存策略回退,写入放大加重了磨损。
第一件事是看完整属性而不是只盯一个数
smartctl -A /dev/sda | grep -E 'Reallocated|Pending|Uncorrectable|Temperature'
然后跑一次短自检确认盘面状态
smartctl -t short /dev/sda && sleep 120 && smartctl -l selftest /dev/sda
接着把数据同步到新盘
rsync -aHAX --info=progress2 /data/ /mnt/newdisk/data/
剩下的就是在阵列里把坏盘换下来
mdadm --manage /dev/md0 --fail /dev/sda1 --remove /dev/sda1
别只看报错消失,验证要多做一步。新盘上数据校验通过,mdstat 里阵列回到 UU,旧盘下线后 iostat 不再出现秒级卡顿。
重映射计数只增不减,短期内涨几十个基本可以判死;换盘前别做全盘 dd 测试,那个动作会把仅剩的备用扇区一起耗光。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
