问题
在过去的几周里,我的物理服务器上安装了 Linux 软件 RAID 6(md、mdadm)和 btrfs 文件系统,遇到了一些烦人的问题。
每隔几天(我注意到,这种情况并不常见),这个md1_raid6
过程就会开始消耗一个 CPU 核心的 100%在此期间,此 raid 设备上的 btrfs 上的所有文件系统访问都会卡住(用户空间进程挂起磁盘睡眠状态)。
在大多数情况下,在执行几个“IO”操作(例如列出文件(ls
)、访问 btrfs 信息(btrfs filesystem
、btrfs subvolume
)或访问设备(dd
等))之后,文件系统会神奇地解脱了并md1_raid6
从其“活动锁”(或任何循环锁)中释放进程。
有时最糟糕的情况是,当我没有成功使用这种“魔法解开”时。然后我甚至无法杀进程停滞磁盘睡眠状态,我被迫重置系统。
当我的问题发生时,我经常在内核dmesg
日志中发现类似的消息:
INFO: task md1_reclaim:910 blocked for more than 120 seconds.
包含呼叫跟踪。
但是,还有一些“被阻止”的任务,例如btrfs
还btrfs-transaction
包括呼叫跟踪。
问题
- 造成这个问题的原因应该是什么呢?
- 我应该怎么做才能缓解这个问题?
- 这可能是硬件问题吗?我该如何追踪这个问题?
我目前所做的
我使用 Debian 软件包提供的最新稳定内核来保持系统更新
我运行两者
btrfs scrub
并fsck.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 写入日志
- 在此 RAID1 之上是一个具有以下逻辑卷的 LVM:
- RAID6 通过 6 个 HDD 和 1 个 LV 作为写入日志(
md1
)- 这是受影响的设备
使用信息
- 受影响的 RAID6 块设备直接格式化为 btrfs
- 此文件系统用于存储备份
- 备份通过以下方式执行
rsnapshot
rsnapshot
配置为使用btrfs 快照用于每小时和每日备份以及rsync
复制新备份
其他IO操作
- 持续监控通过伊辛加用于
iostat
内部监控 I/O - SMART 自检定期运行(每周和每月)