排解 NVMe 磁碟問題


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

您可以使用 NVMe 介面搭配本機 SSD 和永久磁碟 (Persistent Disk 或 Google Cloud Hyperdisk)。只有最新的機器系列 (例如 Tau T2A、M3、C3、C3D 和 H3) 會使用 NVMe 介面來存取永久性磁碟。機密 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"
    

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

在使用 Linux 核心 6.0 到 6.2 版的 VM 上,涉及 Compute Engine API 方法 instances.detachDiskgcloud compute instances detach-disk 指令的作業可能無法正常運作。Google Cloud 控制台顯示裝置已移除,運算執行個體的 metadata (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 以上版本

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

如果將本機 SSD 磁碟連接至 C3 或 C3D VM,您可能需要採取額外步驟,為本機 SSD 磁碟建立符號連結。只有在您使用Google Cloud提供的下列任何公開映像檔時,才需要執行這些步驟:

  • SLES 15 SP4 和 SP5
  • SLES 12 SP4

這些額外步驟僅適用於本機 SSD 磁碟,您不需要對永久磁碟磁區執行任何操作。

先前列出的公開 Linux 映像檔沒有正確的 udev 設定,無法為連接至 C3 和 C3D VM 的本機 SSD 裝置建立符號連結。自訂映像檔也可能未包含建立本機 SSD 裝置符號連結所需的 udev 規則,這些裝置已連接至 C3 和 C3D VM。

請按照這些操作說明為 SUSE 或自訂映像檔新增 udev 規則。

  1. 找出 udev 規則目錄。這個值通常是 /lib/udev/rules.d/usr/lib/udev/rules.d。您的圖片可能有不同的 udev 規則目錄。
  2. 在 udev 規則目錄中找出 65-gce-disk-naming.rules 檔案。
  3. 如果 65-gce-disk-naming.rules 檔案包含下列程式碼行,表示圖片支援新規則,您可以停止操作:

    KERNEL=="nvme*n*", ATTRS{model}=="nvme_card[0-9]*",IMPORT{program}="google_nvme_id -d $tempnode"
    
  4. 如果沒有上述行,或檔案 65-gce-disk-naming.rules 不存在,請使用以下網址中的檔案內容取代現有檔案,或建立新檔案:https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/rules.d/65-gce-disk-naming.rules。這個檔案包含更新版的 65-gce-disk-naming.rules 檔案內容,包括上一個步驟中的一行,以及 Compute Engine 磁碟命名所需的其他規則。例如:

    sudo curl -o 65-gce-disk-naming.rules https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/rules.d/65-gce-disk-naming.rules
    
  5. 前往 udev 目錄。

  6. udev 目錄中找出 google_nvme_id 檔案。

  7. 將下列網址中的內容,替換現有 google_nvme_id 檔案的內容,或建立新檔案:

    sudo curl -o google_nvme_id https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/google_nvme_id
    
  8. 確認 google_nvme_id 檔案可執行。

    sudo chmod 755 google_nvme_id
    
  9. 重新啟動 VM。

  10. 確認是否已成功建立符號連結。

    ls -l /dev/disk/by-id/google-local-nvme-ssd*
    

    輸出內容應列出與已連結至執行個體的本機 SSD 相同數量的連結,且每個連結都應指向不同的 /dev/nvme 裝置路徑。例如:

    lrwxrwxrwx 1 root root 13 Jul 19 22:52 /dev/disk/by-id/google-local-nvme-ssd-0 -> ../../nvme0n1
    lrwxrwxrwx 1 root root 13 Jul 19 22:52 /dev/disk/by-id/google-local-nvme-ssd-1 -> ../../nvme1n1
    

    如要進一步瞭解裝置名稱,請參閱「裝置命名」。

    您可以執行 lsblk,確認 /dev/nvme 裝置路徑是本機 SSD 裝置。顯示 375G 大小的 NVMe 裝置是本機 SSD 裝置。

後續步驟