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