Linux MD RAID 与 btrfs 卡住并消耗 100% CPU

Linux MD RAID 与 btrfs 卡住并消耗 100% CPU

问题

在过去的几周里,我的物理服务器上安装了 Linux 软件 RAID 6(md、mdadm)和 btrfs 文件系统,遇到了一些烦人的问题。

每隔几天(我注意到,这种情况并不常见),这个md1_raid6过程就会开始消耗一个 CPU 核心的 100%在此期间,此 raid 设备上的 btrfs 上的所有文件系统访问都会卡住(用户空间进程挂起磁盘睡眠状态)。

在大多数情况下,在执行几个“IO”操作(例如列出文件(ls)、访问 btrfs 信息(btrfs filesystembtrfs subvolume)或访问设备(dd等))之后,文件系统会神奇地解脱了md1_raid6从其“活动锁”(或任何循环锁)中释放进程。

有时最糟糕的情况是,当我没有成功使用这种“魔法解开”时。然后我甚至无法进程停滞磁盘睡眠状态,我被迫重置系统。

当我的问题发生时,我经常在内核dmesg日志中发现类似的消息:

INFO: task md1_reclaim:910 blocked for more than 120 seconds.

包含呼叫跟踪。

但是,还有一些“被阻止”的任务,例如btrfsbtrfs-transaction包括呼叫跟踪。

问题

  1. 造成这个问题的原因应该是什么呢?
  2. 我应该怎么做才能缓解这个问题?
  3. 这可能是硬件问题吗?我该如何追踪这个问题?

我目前所做的

  • 我使用 Debian 软件包提供的最新稳定内核来保持系统更新

  • 我运行两者btrfs scrubfsck.btrfs排除 btrfs 文件系统问题。

  • 我已经读取了所有物理磁盘(使用dd命令)并执行了 SMART 自检以排除磁盘问题(尽管badblocks尚未检查读/写)。

  • 我还将所有文件移出受影响的文件系统,创建新的 btrfs 文件系统(使用最近的btrfs-progs)并将文件移回。此问题再次出现。

  • 我试图附加strace到循环md1进程,但没有成功(是否有可能strace运行内核线程?)

  • 当然,我也曾尝试在网上寻找类似的问题,但没有成功。

一些详细的事实

操作系统信息

  • Debian 10 buster(稳定版本)
  • Linux 内核 5.5(来自 Debian 反向移植)

硬件信息

  • 8 核/16 线程 amd64 处理器 (AMD EPYC 7251)
  • 6 个 SATA HDD 磁盘(Seagate Enterprise Capacity)
  • 2 个 SSD 磁盘(Intel D3-S4610)

RAID 信息

  • 所有 Linux MD RAID(未使用 HW RAID)
  • RAID1 基于 2 个 SSD ( md0)
    • 在此 RAID1 之上是一个具有以下逻辑卷的 LVM:
      • 根文件系统
      • 交换
      • RAID6 写入日志
  • RAID6 通过 6 个 HDD 和 1 个 LV 作为写入日志(md1
    • 这是受影响的设备

使用信息

  • 受影响的 RAID6 块设备直接格式化为 btrfs
  • 此文件系统用于存储备份
  • 备份通过以下方式执行rsnapshot
  • rsnapshot配置为使用btrfs 快照用于每小时和每日备份以及rsync复制新备份

其他IO操作

  • 持续监控通过伊辛加用于iostat内部监控 I/O
  • SMART 自检定期运行(每周和每月)

相关内容