Linus/ext4/nvme 在高 io 期间崩溃

Linus/ext4/nvme 在高 io 期间崩溃

在 mvn 编译期间,我遇到随机崩溃。

该问题似乎与高 IO 有关,在 kern.log 中,我可以看到类似以下内容:

kernel: [158430.895045] nvme nvme1: controller is down; will reset: CSTS=0xffffffff, PCI_STATUS=0x10
kernel: [158430.951331] blk_update_request: I/O error, dev nvme0n1, sector 819134096 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
kernel: [158430.995307] nvme nvme1: Removing after probe failure status: -19
kernel: [158431.035065] blk_update_request: I/O error, dev nvme0n1, sector 253382656 op 0x1:(WRITE) flags 0x4000 phys_seg 127 prio class 0
kernel: [158431.035083] EXT4-fs warning (device nvme0n1p1): ext4_end_bio:309: I/O error 10 writing to inode 3933601 (offset 16777216 size 2101248 starting block 31672832)
kernel: [158431.035085] Buffer I/O error on device nvme0n1p1, logical block 31672320
kernel: [158431.035090] ecryptfs_write_inode_size_to_header: Error writing file size to header; rc = [-5]

为了复制错误,我使用:

stress-ng --all 8  --timeout 60s --metrics-brief --tz

我尝试了一些启动选项,例如添加acpiphp.disable=1 pcie_aspm=off/etc/default/grup,这似乎有助于压力测试,但对我的编译没有帮助。

  • 发行版:Ubuntu 19.10
  • 内核:5.3.0-45-generic #37-Ubuntu SMP 2020 年 3 月 26 日星期四 20:41:27 UTC

nvme list显示:

Node             SN                   Model                            Namespace Usage                      Format           FW Rev  
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     28FF72PTFQAS         KXG50ZNV256G NVMe TOSHIBA 256GB          1        256,06  GB / 256,06  GB    512   B +  0 B   AADA4102
/dev/nvme1n1     37DS103NTEQT         THNSN5512GPU7 NVMe TOSHIBA 512GB         1         512,11 GB / 512,11  GB    512   B +  0 B   57DC4102

答案1

我无法确切地告诉你问题出在哪里,因为这只是 NVMe 子系统中某个地方的“一般故障”。但我可以建议你可以尝试找出问题所在。

  1. 尝试添加 nvme_core.default_ps_max_latency_us=5500 内核启动选项。
  2. 安装 nvme-cli 包(或者最好从来源) 并使用它检查各种日志,如 smart-log 和 error-log。这可能有助于进一步诊断错误。
  3. 尝试启动一些其他发行版(实时)并在其下进行压力测试,以查看这是否与内核版本/发行版有关。Systemrescuecd 发行版可能是一个很好的起点。
  4. 如果这没有帮助,您可以尝试将 MB 固件(“BIOS”,实际上现在不是 BIOS,而是 UEFI)更新到最新版本。虽然这听起来并不明显,甚至补丁说明中可能没有任何与 NVMe/PCI-E 子系统直接相关的内容,但有时它还是有帮助的(实践知识)。
  5. 更新您的 NVMe 驱动器固件。查找供应商提供的工具和手册。
  6. 如果以上所有内容都无济于事或没有提供任何线索,那么您可能遇到了未知的错误或硬件故障。

答案2

该行kernel: [158430.895045] nvme nvme1: controller is down; will reset: CSTS=0xffffffff, PCI_STATUS=0x10意味着 NVMe 磁盘控制器没有响应,并已被 NVMe 驱动程序重置以恢复与设备的通信。

此类问题可能由以下原因造成:

  • 硬件故障
  • 杂散功率(即:坏的 PSU)
  • 过于激进的 PCIe 主动状态电源管理 (ASPM)

抛开硬件故障,你可以尝试使用内核启动命令行禁用 ASPMpcie_aspm=off

答案3

我注意到错误仅发生在其中一个 SSD 上,即包含 /home 的 SSD

将 /home 移至机器中的另一个磁盘,到目前为止似乎运行得更好。

答案4

快速尝试的方法是热插拔硬盘驱动程序。

但对于性能 IO,你也不能贪便宜。检查最大延迟,看看你超出了多少。也许你只是在尝试一些需要更好的内核驱动程序的东西。

查看一些 cmake 配置或一些编译器参数以仅使用 1 个线程或更少的 IO,以某种方式减慢它的速度,如果你可以使用终端手动暂停该过程,你也许能够模拟编译,如果你非常绝望,

唯一可以快速完成的其他事情是制作该机器的 VM 机,并在 VM 上进行编译,然后在实时进行调试。

相关内容