内核报告 RAID 阵列上的写回错误

内核报告 RAID 阵列上的写回错误

我有一个 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

这解决了问题。

相关内容