Memecahkan masalah disk NVMe


Dokumen ini berisi daftar error yang mungkin Anda alami saat menggunakan disk dengan antarmuka nonvolatil memory Express (NVMe).

Anda dapat menggunakan antarmuka NVMe untuk SSD Lokal dan persistent disk (Persistent Disk atau Google Cloud Hyperdisk). Hanya seri mesin terbaru, seperti Tau T2A, M3, C3, C3D, dan H3 yang menggunakan antarmuka NVMe untuk Persistent Disk. Confidential VMs juga menggunakan NVMe untuk Persistent Disk. Semua seri mesin Compute Engine lainnya menggunakan antarmuka disk SCSI untuk persistent disk.

Error waktu tunggu operasi I/O habis

Jika Anda mengalami error waktu tunggu I/O, latensi dapat melebihi parameter waktu tunggu default untuk operasi I/O yang dikirimkan ke perangkat NVMe.

Pesan error:

[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
...

Resolusi:

Untuk mengatasi masalah ini, tingkatkan nilai parameter waktu tunggu.

  1. Melihat nilai parameter waktu tunggu saat ini.

    1. Menentukan pengontrol NVMe yang digunakan oleh persistent disk atau volume SSD Lokal.
      ls -l /dev/disk/by-id
      
    2. Menampilkan setelan io_timeout, yang ditentukan dalam detik, untuk disk.

      cat /sys/class/nvme/CONTROLLER_ID/NAMESPACE/queue/io_timeout
      
      Ganti kode berikut:

      • CONTROLLER_ID: ID pengontrol disk NVMe, misalnya, nvme1
      • NAMESPACE: namespace disk NVMe, misalnya, nvme1n1

      Jika Anda hanya memiliki satu disk yang menggunakan NVMe, gunakan perintah:

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

  2. Jika ingin meningkatkan parameter waktu tunggu untuk operasi I/O yang dikirim ke perangkat NVMe, tambahkan baris berikut ke file /lib/udev/rules.d/65-gce-disk-naming.rules, lalu mulai ulang VM:

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

Disk yang dilepas masih muncul di sistem operasi instance komputasi

Pada VM yang menggunakan kernel Linux versi 6.0 hingga 6.2, operasi yang melibatkan metode Compute Engine API instances.detachDisk atau perintah gcloud compute instances detach-disk mungkin tidak berfungsi seperti yang diharapkan. Konsol Google Cloud menampilkan perangkat sebagai dihapus, metadata instance komputasi (perintah compute disks describe) menampilkan perangkat sebagai dihapus, tetapi titik pemasangan perangkat dan symlink apa pun yang dibuat oleh aturan udev masih terlihat di sistem operasi tamu.

Pesan error:

Mencoba membaca dari disk yang dilepas di VM akan menyebabkan error I/O:

sudo head /dev/nvme0n3

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

Masalah:

Image sistem operasi yang menggunakan kernel Linux 6.0-6.2, tetapi tidak menyertakan backport perbaikan NVMe gagal mengenali saat disk NVMe dilepas.

Resolusi:

Mulai ulang VM untuk menyelesaikan proses penghapusan disk.

Untuk menghindari masalah ini, gunakan sistem operasi dengan versi kernel Linux yang tidak memiliki masalah ini:

  • 5.19 atau yang lebih baru
  • 6.3 atau yang lebih baru

Anda dapat menggunakan perintah uname -r di OS tamu untuk melihat versi kernel Linux.

Jika Anda memasang disk SSD Lokal ke VM C3 atau C3D, Anda mungkin perlu mengambil langkah tambahan untuk membuat symlink untuk disk SSD Lokal. Langkah-langkah ini hanya diperlukan jika Anda menggunakan salah satu image publik berikut yang ditawarkan oleh Google Cloud:

  • SLES 15 SP4 dan SP5
  • SLES 12 SP4

Langkah-langkah tambahan ini hanya berlaku untuk disk SSD Lokal; Anda tidak perlu melakukan apa pun untuk volume Persistent Disk.

Image Linux publik yang tercantum sebelumnya tidak memiliki konfigurasi udev yang benar untuk membuat symlink bagi perangkat SSD Lokal yang terpasang pada VM C3 dan C3D. Image kustom mungkin juga tidak menyertakan aturan udev wajib yang diperlukan dalam membuat symlink untuk perangkat SSD Lokal yang terpasang ke VM C3 dan C3D.

Gunakan petunjuk ini untuk menambahkan aturan udev untuk SUSE atau image kustom.

  1. Temukan direktori aturan udev. Nilai ini biasanya /lib/udev/rules.d atau /usr/lib/udev/rules.d. Gambar Anda mungkin memiliki direktori aturan udev yang berbeda.
  2. Temukan file 65-gce-disk-naming.rules di direktori aturan udev.
  3. Jika file 65-gce-disk-naming.rules berisi baris berikut, image Anda mendukung aturan baru dan Anda dapat berhenti di sini:

    KERNEL=="nvme*n*", ATTRS{model}=="nvme_card[0-9]*",IMPORT{program}="google_nvme_id -d $tempnode"
    
  4. Jika baris sebelumnya tidak ada, atau jika file 65-gce-disk-naming.rules tidak ada, ganti file yang sudah ada, atau buat file baru, dengan konten file dari URL ini: https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/rules.d/65-gce-disk-naming.rules. File ini berisi konten file 65-gce-disk-naming.rules yang diperbarui, termasuk baris dari langkah sebelumnya dan aturan lain yang diperlukan untuk penamaan disk Compute Engine. Contoh:

    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. Buka direktori udev.

  6. Temukan file google_nvme_id di direktori udev.

  7. Ganti konten file google_nvme_id yang ada, atau buat file baru, dengan konten di URL ini:

    sudo curl -o google_nvme_id https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/google_nvme_id
    
  8. Pastikan file google_nvme_id dapat dieksekusi.

    sudo chmod 755 google_nvme_id
    
  9. Mulai ulang VM.

  10. Pastikan symlink berhasil dibuat.

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

    Output harus mencantumkan jumlah link yang sama karena terdapat SSD Lokal yang terpasang ke instance, dan setiap link harus mengarah ke jalur perangkat /dev/nvme yang berbeda. Contoh:

    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
    

    Untuk mengetahui informasi selengkapnya tentang nama perangkat, lihat Penamaan perangkat.

    Anda dapat memverifikasi bahwa jalur perangkat /dev/nvme adalah perangkat SSD Lokal dengan menjalankan lsblk. Perangkat NVMe yang menampilkan ukuran 375G adalah perangkat SSD Lokal.

Apa langkah selanjutnya?