我有一个 RAID-6 阵列md0
,最近在内核日志中开始收到突发的写回错误,如下所示:
[Thu Jun 9 11:56:49 2022] md0: writeback error on inode 1412769769, offset 3035136, sector 285462910760
[Thu Jun 9 12:47:17 2022] md0: writeback error on inode 1412769771, offset 0, sector 285491991552
[Thu Jun 9 13:20:45 2022] md0: writeback error on inode 224524727190, offset 0, sector 288770741760
[Thu Jun 9 13:21:32 2022] md0: writeback error on inode 224524727190, offset 2510848, sector 288770744104
[Thu Jun 9 14:03:18 2022] md0: writeback error on inode 224507073535, offset 5963776, sector 285428442496
扇区位置并不完全随机:它们集中在扇区 286000000000 附近。我无法将这些突发事件与任何类型的活动(例如高 CPU 负载或高磁盘利用率)关联起来。当这些错误出现时,驱动器 SMART 日志中的 UDMA CRC 错误计数不会增加。我echo check > /sys/block/md0/md/sync_action
在未安装阵列的情况下进行了完整的 RAID 检查 (),并对阵列中的所有驱动器运行了扩展 SMART 测试,这些测试没有发现任何错误、重新分配/待处理的扇区或可疑的 SMART 值。接下来我应该尝试什么来诊断此行为?
$ mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Xxx xx xx:xx:xx xxxx
Raid Level : raid6
Array Size : 164062560256 (156462.25 GiB 168000.06 GB)
Used Dev Size : 11718754304 (11175.88 GiB 12000.00 GB)
Raid Devices : 16
Total Devices : 16
Persistence : Superblock is persistent
Intent Bitmap : /var/raid/bitmap
Update Time : Thu Jun 9 15:02:53 2022
State : clean
Active Devices : 16
Working Devices : 16
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : bitmap
Name : centos7:0
UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
Events : 427699
Number Major Minor RaidDevice State
18 8 176 0 active sync /dev/sdl
... 14 more lines like this ...
14 65 16 15 active sync /dev/sdr
更新:显然有是阵列或 md 驱动程序出现了问题(我只有 5.6.6 内核),因为我注意到在写入有问题的位置后,阵列的意图位图中的位会被卡住。
答案1
回顾我的日志和记录,问题几乎肯定是由 md 坏块条目引起的错误克隆当我扩展阵列时,我将这些条目添加到新磁盘。尽管受影响的区域没有任何问题,但这些条目却弄乱了它,并且随着阵列上的文件系统填满并且 XFS 开始使用该区域,写回错误似乎无处不在。我列出了阵列中的所有坏块,清除了它们并禁用了坏块逻辑,然后运行raid6check
以检测和修复任何不匹配:
(for i in {a..p}; do mdadm --examine-badblocks /dev/sd$i; done)>badblocks.txt
# edit the resulting file a bit
mdadm --stop /dev/md0
mdadm --assemble /dev/md0 --uuid xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx \
--update=force-no-bbl --bitmap /var/raid/bitmap
while read s _
do
p=$(($s/1024-115)) # 115 is the array's data offset in chunks
echo ============$p===============
raid6check /dev/md0 $(($p-1)) 3 autorepair
done <badblocks.txt
这解决了问题。