NVMe ディスクのトラブルシューティング


このドキュメントでは、NonVolatile Memory express(NVMe)インターフェースを備えたディスクの使用時に発生する可能性のあるエラーの一覧を示します。

ローカル SSD と永続ディスク(Persistent Disk または Google Cloud Hyperdisk)には NVMe インターフェースを使用できます。Tau T2A、M3、C3、C3D、H3 など、最新のマシンシリーズのみが Persistent Disk に NVMe インターフェースを使用します。Confidential VMs も Persistent Disk に 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 を使用する単一ディスクが 1 つだけの場合は、次のコマンドを使用します。

      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"
    

切断されたディスクが Compute インスタンスのオペレーティング システムに引き続き表示される

Linux カーネル バージョン 6.0~6.2 を使用する VM では、Compute Engine API メソッド instances.detachDisk または gcloud compute instances detach-disk コマンドを含むオペレーションが想定どおりに機能しない場合があります。Google Cloud コンソールではデバイスが削除されたものとして表示され、Compute インスタンスのメタデータ(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 カーネル バージョンを確認できます。

ローカル SSD ディスクを C3 VM または C3D VM にアタッチする場合、ローカル SSD ディスク用のシンボリック リンクを作成するために、追加の手順が必要になることがあります。以下の手順は、Google Cloud が提供する次の公開イメージのいずれかを使用する場合にのみ必要です。

  • SLES 15 SP4 および SP5
  • SLES 12 SP4

これらの追加の手順は、ローカル SSD ディスクにのみ適用されます。Persistent Disk のボリュームに関して何もする必要はありません。

前述の公開 Linux イメージには、C3 VM と C3D VM にアタッチされたローカル SSD デバイスのシンボリック リンクを作成するための正しい udev 構成がありません。カスタム イメージに、C3 VM と C3D VM にアタッチされたローカル SSD デバイスのシンボリック リンクを作成するために必要な udev ルールが含まれていない場合もあります。

次の手順に沿って、SUSE またはカスタム イメージ用の udev ルールを追加します。

  1. udev ルール ディレクトリを見つけます。通常、これは /lib/udev/rules.d または /usr/lib/udev/rules.d です。イメージの udev ルール ディレクトリが異なる場合があります。
  2. udev rules ディレクトリで 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 が存在しない場合は、既存のファイルを置き換えるか、または新しいファイルを次の URL にあるファイルの内容で作成します。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 ファイルの内容を次の URL にある内容で置き換えるか、または新しいファイルを次の URL にある内容で作成します。

    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 デバイスです。

次のステップ