Risoluzione dei problemi relativi ai dischi NVMe

Questo documento elenca gli errori che potresti riscontrare quando utilizzi dischi con l'interfaccia NVMe (Nonvolatile Memory Express).

Puoi utilizzare l'interfaccia NVMe per le unità SSD locali e i dischi permanenti (Persistent Disk o Google Cloud Hyperdisk). Solo le serie di macchine più recenti, come Tau T2A, M3, C3, C3D e H3, utilizzano l'interfaccia NVMe per Persistent Disk. Anche le Confidential VM utilizzano NVMe per Persistent Disk. Tutte le altre serie di macchine Compute Engine utilizzano l'interfaccia disco SCSI per i dischi permanenti.

Errore di timeout dell'operazione I/O

Se si verificano errori di timeout I/O, la latenza potrebbe superare il parametro di timeout predefinito per le operazioni di I/O inviate ai dispositivi NVMe.

Messaggio di errore:

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

Risoluzione:

Per risolvere il problema, aumenta il valore del parametro di timeout.

  1. Visualizza il valore attuale del parametro di timeout.

    1. Determina quale controller NVMe viene utilizzato dal disco permanente o dal volume SSD locale.
      ls -l /dev/disk/by-id
      
    2. Visualizza l'impostazione io_timeout, specificata in secondi, per il disco.

      cat /sys/class/nvme/CONTROLLER_ID/NAMESPACE/queue/io_timeout
      
      Sostituisci quanto segue:

      • CONTROLLER_ID: l'ID del controller del disco NVMe, ad esempio nvme1
      • NAMESPACE: lo spazio dei nomi del disco NVMe, ad esempio nvme1n1

      Se hai un solo disco che utilizza NVMe, utilizza il comando:

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

  2. Per aumentare il parametro di timeout per le operazioni di I/O inviate ai dispositivi NVMe, aggiungi la seguente riga al file /lib/udev/rules.d/65-gce-disk-naming.rules, quindi riavvia la VM:

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

I dischi scollegati appaiono ancora nel sistema operativo di un'istanza Compute

Sulle VM che utilizzano il kernel Linux dalla versione 6.0 alla versione 6.2, le operazioni che prevedono il metodo instances.detachDisk o il comando gcloud compute instances detach-disk dell'API Compute Engine potrebbero non funzionare come previsto. La console Google Cloud mostra il dispositivo come rimosso, i metadati dell'istanza Compute (comando compute disks describe) mostrano il dispositivo come rimosso, ma il punto di montaggio del dispositivo ed eventuali link simbolici creati dalle regole udev sono ancora visibili nel sistema operativo ospite.

Messaggio di errore:

Il tentativo di leggere dal disco scollegato sulla VM determina errori di I/O:

sudo head /dev/nvme0n3

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

Problema:

Le immagini del sistema operativo che utilizzano un kernel Linux 6.0-6.2 ma non includono un backport di una correzione NVMe non riescono a riconoscere quando un disco NVMe viene scollegato.

Risoluzione:

Riavvia la VM per completare il processo di rimozione del disco.

Per evitare questo problema, utilizza un sistema operativo con una versione kernel Linux che non presenti questo problema:

  • 5,19 o versioni precedenti
  • 6.3 o versioni successive

Puoi usare il comando uname -r nel sistema operativo guest per visualizzare la versione kernel Linux.

Se colleghi dischi SSD locali a una VM C3 o C3D, potresti dover eseguire passaggi aggiuntivi per creare i collegamenti simbolici per i dischi SSD locali. Questi passaggi sono necessari solo se utilizzi una delle seguenti immagini pubbliche offerte da Google Cloud:

  • SLES 15 SP4 e SP5
  • SLES 12 SP4

Questi passaggi aggiuntivi si applicano solo ai dischi SSD locali; non è necessario fare nulla per i volumi dei Persistent Disk.

Le immagini Linux pubbliche elencate in precedenza non hanno la configurazione udev corretta per creare collegamenti simbolici per i dispositivi SSD locali collegati alle VM C3 e C3D. Inoltre, le immagini personalizzate potrebbero non includere le regole udev necessarie per creare collegamenti simbolici per i dispositivi SSD locali collegati a VM C3 e C3D.

Utilizza queste istruzioni per aggiungere regole udev per SUSE o immagini personalizzate.

  1. Individua la directory delle regole udev. In genere è /lib/udev/rules.d o /usr/lib/udev/rules.d. L'immagine potrebbe avere una directory delle regole udev diversa.
  2. Individua il file 65-gce-disk-naming.rules nella directory delle regole udev.
  3. Se il file 65-gce-disk-naming.rules contiene la riga seguente, l'immagine supporta le nuove regole e puoi fermarti qui:

    KERNEL=="nvme*n*", ATTRS{model}=="nvme_card[0-9]*",IMPORT{program}="google_nvme_id -d $tempnode"
    
  4. Se la riga precedente non è presente o se il file 65-gce-disk-naming.rules non esiste, sostituisci il file esistente o creane uno nuovo con il contenuto del file da questo URL: https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/rules.d/65-gce-disk-naming.rules. Questo file contiene i contenuti aggiornati del file 65-gce-disk-naming.rules, inclusa la riga del passaggio precedente e altre regole necessarie per la denominazione dei dischi di Compute Engine. Ad esempio:

    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. Vai alla directory udev.

  6. Individua il file google_nvme_id nella directory udev.

  7. Sostituisci i contenuti del file google_nvme_id esistente o crea un nuovo file con i contenuti in questo URL:

    sudo curl -o google_nvme_id https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/google_nvme_id
    
  8. Assicurati che il file google_nvme_id sia eseguibile.

    sudo chmod 755 google_nvme_id
    
  9. Riavvia la VM.

  10. Verifica che i collegamenti simbolici siano stati creati correttamente.

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

    L'output dovrebbe elencare lo stesso numero di link delle unità SSD locali collegate all'istanza e ogni link deve puntare a un percorso del dispositivo /dev/nvme diverso. Ad esempio:

    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
    

    Per ulteriori informazioni sui nomi dei dispositivi, consulta Denominazione dei dispositivi.

    Puoi verificare che i percorsi dei dispositivi /dev/nvme siano dispositivi SSD locali eseguendo lsblk. I dispositivi NVMe che mostrano dimensioni 375G sono dispositivi SSD locali.

Che cosa succede dopo?