排解 NVMe 磁碟問題

本文列出使用非揮發性記憶體高速 (NVMe) 介面時,可能會遇到的磁碟錯誤。

您可以使用 NVMe 介面搭配本機 SSD 和永久磁碟 (永久磁碟或 Google Cloud Hyperdisk)。只有最新的機器系列 (例如 Tau T2A、M3、C3、C3D 和 H3) 會使用 NVMe 介面搭配 Persistent Disk。機密 VM 也會使用 NVMe 做為永久磁碟。其他所有 Compute Engine 機型系列都使用 SCSI 磁碟介面做為永久磁碟。

I/O 作業逾時錯誤

如果遇到 I/O 逾時錯誤,延遲時間可能超過提交至 NVMe 裝置的 I/O 作業預設逾時參數。

錯誤訊息

[1369407.045521] nvme nvme0: I/O 252 QID 2 timeout, aborting
[1369407.050941] nvme nvme0: I/O 253 QID 2 timeout, aborting
[1369407.056354] nvme nvme0: I/O 254 QID 2 timeout, aborting
[1369407.061766] nvme nvme0: I/O 255 QID 2 timeout, aborting
[1369407.067168] nvme nvme0: I/O 256 QID 2 timeout, aborting
[1369407.072583] nvme nvme0: I/O 257 QID 2 timeout, aborting
[1369407.077987] nvme nvme0: I/O 258 QID 2 timeout, aborting
[1369407.083395] nvme nvme0: I/O 259 QID 2 timeout, aborting
[1369407.088802] nvme nvme0: I/O 260 QID 2 timeout, aborting
...

解決方法

如要解決這個問題,請增加逾時參數的值。

  1. 查看逾時參數的目前值。

    1. 判斷永久磁碟或本機 SSD 磁碟區使用的 NVMe 控制器。
      ls -l /dev/disk/by-id
      
    2. 顯示磁碟的 io_timeout 設定 (以秒為單位)。

      cat /sys/class/nvme/CONTROLLER_ID/NAMESPACE/queue/io_timeout
      
      取代下列項目:

      • CONTROLLER_ID:NVMe 磁碟控制器的 ID,例如 nvme1
      • NAMESPACE:NVMe 磁碟的命名空間,例如 nvme1n1

      如果只有一個使用 NVMe 的磁碟,請使用下列指令:

      cat /sys/class/nvme/nvme0/nvme0n1/queue/io_timeout
      

  2. 如要增加提交至 NVMe 裝置的 I/O 作業逾時參數,請在 /lib/udev/rules.d/65-gce-disk-naming.rules 檔案中新增下列一行,然後重新啟動 VM:

    KERNEL=="nvme*n*", ENV{DEVTYPE}=="disk", ATTRS{model}=="nvme_card-pd", ATTR{queue/io_timeout}="4294967295"
    

卸離的磁碟仍會顯示在運算執行個體的作業系統中

如果 VM 使用 Linux 核心 6.0 至 6.2 版,涉及 Compute Engine API 方法 instances.detachDiskgcloud compute instances detach-disk 指令的作業可能無法正常運作。 Google Cloud 控制台會顯示裝置已移除,運算執行個體中繼資料 (compute disks describe 指令) 會顯示裝置已移除,但裝置掛接點和 udev 規則建立的任何符號連結,仍會顯示在客層作業系統中。

錯誤訊息:

嘗試從 VM 中卸離的磁碟讀取資料時,會發生 I/O 錯誤:

sudo head /dev/nvme0n3

head: error reading '/dev/nvme0n3': Input/output error

問題

如果作業系統映像檔使用 Linux 6.0-6.2 核心,但未包含 NVMe 修復程式的回溯移植,系統就無法辨識 NVMe 磁碟何時卸離。

解決方法

重新啟動 VM,完成移除磁碟的程序。

如要避免這個問題,請使用 Linux 核心版本沒有這個問題的作業系統:

  • 5.19 以上版本
  • 6.3 以上版本

您可以在客體 OS 中使用 uname -r 指令,查看 Linux 核心版本。

後續步驟