Come verificare se il disco VPS è davvero NVMe
Scopri se il tuo VPS usa davvero NVMe con lsblk, sysfs, nvme-cli e un test fio limitato. Capisci anche perché virtio può nascondere il disco fisico.
Verificare un disco NVMe su Linux in quattro passaggi
Per verificare un disco NVMe su un VPS Linux, esegui quattro controlli in ordine: lsblk per identificare il dispositivo, il flag rotational in sysfs per verificare se si tratta di un supporto rotazionale, nvme list per confermare la presenza di un controller NVMe reale e una breve esecuzione di fio per ottenere l'unico valore che l'host non può mascherare. I primi tre controlli richiedono circa un secondo ciascuno. L'ultimo risolve il dubbio, perché nella maggior parte delle piattaforme VPS l'hypervisor nasconde al guest il disco fisico.
NVMe (non-volatile memory express) è il protocollo utilizzato dallo storage flash tramite le linee PCIe (peripheral component interconnect express). Ha sostituito il percorso SATA e AHCI, progettato per le unità rotazionali, e offre prestazioni elevate perché rimuove un collo di bottiglia nella gestione delle code tra CPU e memoria flash. All'interno di una macchina virtuale, raramente si comunica direttamente tramite questo protocollo. Si comunica con un disco virtuale assemblato dall'host, quindi il nome del dispositivo nel guest descrive un driver, non il supporto installato nel rack.
Passaggio 1: cosa mostra lsblk?
lsblk legge l'elenco dei dispositivi a blocchi fornito dal kernel. Il flag -d nasconde le partizioni, quindi viene visualizzata una riga per ogni disco.
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELUn VPS KVM di solito restituisce un output simile al seguente:
NAME ROTA SIZE TYPE TRAN MODEL
vda 0 80G diskTre schemi di denominazione coprono quasi tutti i server Linux:
nvme0n1è lo spazio dei nomi 1 sul controller NVMe 0. Il guest utilizza un dispositivo NVMe, reale o emulato.sdaè il livello SCSI. I dischi SATA e SAS reali vengono rilevati qui, così come quelli gestiti dal driver virtio-scsi.vdaè virtio-blk, il driver a blocchi paravirtualizzato utilizzato per impostazione predefinita dalla maggior parte degli host KVM.
La colonna TRAN (trasporto) riporta nvme per un dispositivo NVMe e sata per un disco SATA direttamente visibile al guest. Di solito è vuota con virtio-blk, perché il guest non dispone di un trasporto fisico da indicare. Per lo stesso motivo, MODEL è vuota. Su un VPS, una stringa del modello vuota è normale e non fornisce informazioni sull'hardware.
Passaggio 2: escludere un disco magnetico
DISK=$(lsblk -dno NAME,TYPE | awk '$2 == "disk" { print $1; exit }')
echo "checking $DISK"
cat "/sys/block/$DISK/queue/rotational"
readlink -f "/sys/block/$DISK"Il file rotational contiene 1 quando il kernel considera il dispositivo dotato di piatti magnetici rotanti e 0 per tutti gli altri dispositivi. Su hardware fisico, il valore proviene dall’unità. Con virtio-blk, proviene da un feature bit impostato dall’host, quindi un valore 0 esclude un normale disco rigido, ma non dimostra altro. Leggetelo comunque: un valore 1 in un piano commercializzato come spazio di archiviazione a stato solido è una contraddizione evidente, ed è l’unico screenshot che il supporto non può contestare.
readlink -f risolve il symlink sysfs e visualizza il bus a cui è collegato il dispositivo:
/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vdaLa parola virtio presente nel percorso è la risposta per questo passaggio. Un dispositivo NVMe restituisce un percorso contenente nvme, ad esempio /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, mentre un disco ATA collegato direttamente restituisce un percorso contenente ata1. È lo stesso dato visualizzato da lsblk, ottenuto dal kernel anziché da una colonna formattata, utile quando il campo TRAN è vuoto.
Passaggio 3: interrogare nvme-cli e il bus PCI
sudo apt update
sudo apt install -y nvme-cli pciutils
sudo nvme list || echo "nvme-cli found no NVMe device"
lspci | grep -i -e nvme -e 'non-volatile' || echo "no NVMe controller on this guest's PCI bus"nvme list stampa una riga per ogni namespace, con il numero di serie del controller, la stringa del modello e la revisione del firmware. Una tabella vuota indica che al guest non è esposto alcun dispositivo NVMe. Se lspci non stampa alcuna riga corrispondente, il risultato conferma la stessa condizione dal lato opposto: il bus PCI virtuale visibile al guest non contiene alcun controller NVMe. Entrambi i risultati vuoti sono normali su una VPS virtio e non dimostrano che l'host non disponga di unità NVMe.
Se compare un namespace, nvme-cli può fornire ulteriori informazioni. sudo nvme id-ctrl /dev/nvme0 stampa l'identità del controller, mentre sudo nvme smart-log /dev/nvme0n1 stampa la temperatura, le ore di accensione e la percentuale dell'endurance di scrittura nominale già utilizzata. Esegui questi comandi solo se nvme list ha effettivamente elencato un dispositivo, perché entrambi devono aprire un nodo /dev/nvme* reale.
Perché un host realmente basato su NVMe mostra comunque /dev/vda
L’hypervisor decide quale modello di dispositivo vede il guest, indipendentemente dal supporto sottostante. Sono comuni tre configurazioni.
- virtio-blk o virtio-scsi sopra un file, un volume logico o un dataset ZFS che risiede su unità NVMe. Vedi
vdaosda. Lo storage è NVMe. Il guest non può rilevarlo. - Un controller NVMe emulato davanti a qualsiasi tipo di storage. Vedi
nvme0n1anche quando i dati vengono scritti su un array SATA o su un volume di rete a due rack di distanza. - PCIe passthrough, con cui l’host assegna un controller fisico a un solo guest. Vedi un vero
nvme0n1con una stringa del modello reale. Questa configurazione è rara nei piani VPS condivisi, perché la scheda viene dedicata a un solo cliente.
Il nome del dispositivo può quindi trarre in errore in entrambe le direzioni. Inoltre, l’host può inserire una cache write-back, un livello RAID o un volume di rete replicato tra le operazioni di scrittura e la memoria flash. Ognuno di questi livelli modifica le prestazioni ottenute senza cambiare un solo nome in /sys. Per questo il nome è il punto di partenza, non quello di arrivo. Se stai ancora scegliendo un piano, la differenza tra storage NVMe e SSD SATA spiega per quale motivo vale realmente la pena pagare ciascun livello.
La verifica corretta è la latenza, quindi misurala
fio (flexible I/O tester) esegue letture reali su un file reale e indica quanto tempo ha richiesto ciascuna operazione. Le piccole letture casuali sono il carico corretto in questo caso, perché evidenziano il tempo di andata e ritorno verso il supporto e non possono essere soddisfatte dal read-ahead.
Per prima cosa crea il file di test e verifica che questo filesystem accetti l’I/O non bufferizzato. --direct=1 apre il file con O_DIRECT, bypassando la page cache. Senza questa opzione misuri la RAM del sistema e ottieni valori che nessun disco può produrre.
sudo apt install -y fio
fio --name=prep --filename=/var/tmp/nvme-check.tmp --size=256M --bs=1M --rw=write --direct=1 --end_fsync=1 > /dev/null \
&& echo "unbuffered writes work here, the timing test is valid" \
|| echo "this filesystem refuses direct=1, so the timing test below will not run"Se il comando ha stampato il rifiuto, il percorso scelto si trova su un filesystem che non supporta O_DIRECT. I filesystem overlay dei container e alcuni filesystem di rete si comportano in questo modo. Scegli una directory sul filesystem root del VPS e riprova. Se ha stampato il messaggio di esito positivo, esegui la misurazione:
fio --name=randread4k --filename=/var/tmp/nvme-check.tmp --bs=4k --rw=randread \
--direct=1 --iodepth=1 --numjobs=1 --runtime=20 --time_based --group_reporting \
|| echo "fio stopped early, read its first line for the reason"
rm -f /var/tmp/nvme-check.tmpL'esecuzione è limitata intenzionalmente: un job, profondità della coda pari a 1, venti secondi e 256 MB di dati. Non riempirà il disco e non farà segnalare il sistema per abuso. La profondità della coda pari a 1 è inoltre l'impostazione corretta per questa verifica, perché le code profonde permettono a un dispositivo lento di nascondere la propria latenza usando operazioni parallele, mentre la latenza resta elevata.
Lettura dell'output di fio
Sono importanti due righe. La riga riepilogativa è simile a read: IOPS=9012, BW=35.2MiB/s e sotto di essa fio stampa un blocco clat. clat è la latenza di completamento: il tempo che intercorre tra l'invio di una lettura da parte di fio e la restituzione dei dati da parte del kernel. Leggere il valore avg, quindi il percentile 99.00th nell'elenco clat percentiles. La media indica la classe di storage. Il 99° percentile indica con quale frequenza un vicino sullo stesso host ti costringe ad attendere.
Fio mostra la latenza in microsecondi quando i valori sono ridotti e passa ai millisecondi quando non lo sono. Verificare l'unità nella riga precedente prima di confrontare i valori.
Quali numeri distinguono la classe NVMe dalla classe SATA
I valori riportati di seguito sono valori tipici pubblicati per letture casuali 4k con singolo job e queue depth 1, raccolti dalla documentazione dei produttori e da benchmark della community ad agosto 2026. Sono intervalli di confronto, non misurazioni del tuo server.
The data behind this chart
[
{
"label": "Local NVMe",
"avg_latency_us": 110
},
{
"label": "Local SATA SSD",
"avg_latency_us": 320
},
{
"label": "Network block storage",
"avg_latency_us": 900
}
]The data behind this chart
[
{
"label": "Local NVMe",
"iops": "9,000"
},
{
"label": "Local SATA SSD",
"iops": "3,100"
},
{
"label": "Network block storage",
"iops": "1,100"
}
]Un volume NVMe locale completa una lettura casuale 4k in circa 110 microsecondi e raggiunge circa 9,000 IOPS con queue depth 1. Un SSD SATA locale si colloca intorno a 320 microsecondi e 3,100 IOPS. Lo storage a blocchi collegato tramite rete si attesta intorno a 900 microsecondi e 1,100 IOPS, perché ogni singola lettura attraversa un hop di rete prima che venga consultata la memoria flash.
Con queue depth 1, le due colonne esprimono lo stesso dato in due modi: una lettura alla volta significa che il throughput è semplicemente l'inverso della latenza. Se la tua media è più vicina a 110 che a 320 microsecondi, stai usando storage di classe NVMe, indipendentemente da come lsblk ha deciso di chiamare il dispositivo. Se è più vicina a 900 microsecondi, nel percorso è presente qualcosa di più lento della memoria flash locale e la dicitura NVMe nella pagina dell'ordine descrive le unità del sistema host, non il tuo volume.
Esegui il test più volte prima di segnalare un problema
Un'esecuzione è un campione, non un risultato. Un VPS condivide i dischi, quindi un vicino che utilizza intensamente le risorse può raddoppiare la latenza per dieci minuti e poi smettere. Alcune piattaforme concedono anche crediti di burst, che fanno apparire eccellenti i primi minuti di qualsiasi test. Esegui lo stesso comando tre o quattro volte in ore diverse della giornata e confronta il risultato peggiore, non quello migliore. Un singolo risultato negativo può dipendere da una condizione temporanea. Un andamento ricorrente indica un problema per cui vale la pena aprire un ticket all'assistenza, che sarà più efficace se alleghi tre output di fio con relativo timestamp. Per una valutazione più ampia, che includa CPU e rete oltre al disco, un test completo delle prestazioni del VPS applica lo stesso metodo agli altri sottosistemi.
Cosa fare con il risultato
Se la latenza rientra nell'intervallo tipico degli NVMe, non concentrarti più sul nome del dispositivo e prosegui. vda non rappresenta un declassamento. È il driver per dischi virtuali più veloce offerto dalla maggior parte degli host ed è quello che vuoi utilizzare.
Se la latenza rientra nell'intervallo tipico dello storage di rete su un piano venduto come NVMe locale, hai una segnalazione specifica e riproducibile: il comando fio esatto, la latenza media di completamento e gli orari in cui hai eseguito il test. Questo è un ticket di supporto, non una discussione da forum. Prima di inviarlo, verifica che il disco non sia semplicemente pieno o fortemente frammentato e accertati che durante il test nessun processo sul server stia eseguendo un'intensa attività di scrittura.
Esegui questo controllo il giorno in cui esegui il provisioning, non quando qualcosa sembra lento, così in seguito avrai una baseline con cui confrontare i risultati. Si inserisce naturalmente nei primi dieci minuti su un nuovo VPS, insieme alla configurazione del firewall e delle chiavi SSH. Se la distinzione tra i diversi livelli di storage non è ancora chiara, cosa offre realmente un VPS con SSD illustra i concetti alla base di questo test.
FAQ
Perché lsblk mostra /dev/vda se il mio host dichiara NVMe?
Perché vda identifica il driver virtio-blk nel guest, non l'hardware dell'host. Un hypervisor KVM presenta un dispositivo a blocchi paravirtualizzato supportato da un file, un volume logico o un dataset. Il relativo storage di supporto può trovarsi su unità NVMe senza che il guest possa rilevarlo. Il nome descrive il livello di virtualizzazione. Solo una misurazione della latenza descrive il supporto.
Il valore rotational 0 dimostra che ho un disco NVMe?
No. /sys/block/<dev>/queue/rotational con valore 0 indica che il kernel non considera il dispositivo dotato di piatti rotanti. Con virtio, questo valore è impostato da un feature bit scelto dall'host. Esclude un normale disco rigido. Non permette di distinguere NVMe da un SSD SATA e non distingue la memoria flash locale da un volume di rete. Un valore 1 merita comunque attenzione, perché contraddice qualsiasi piano venduto come storage a stato solido.
Perché nvme list non restituisce nulla sul mio VPS?
Perché nel guest non è esposto alcun controller NVMe. nvme list e lspci leggono entrambi ciò che la macchina virtuale può vedere. Un disco virtio-blk o virtio-scsi non presenta alcun controller NVMe da enumerare. Una tabella vuota è il risultato normale nella maggior parte dei piani VPS e non dimostra che l'host non disponga di unità NVMe. Installa nvme-cli con sudo apt install -y nvme-cli e prevedi una tabella vuota, salvo che sia stato assegnato direttamente un controller.
Quale risultato di fio corrisponde a uno storage di classe NVMe?
Con queue depth 1, letture casuali 4k e --direct=1, una latenza media di completamento vicina a 110 microsecondi è tipica della classe NVMe e corrisponde a circa 9,000 IOPS. Un valore vicino a 320 microsecondi indica un SSD SATA, mentre un valore vicino a 900 microsecondi indica uno storage collegato in rete, in cui ogni lettura attraversa un hop di rete. Questi sono intervalli tipici pubblicati per August 2026. Confronta quindi gli ordini di grandezza, non i valori esatti, e ripeti il test in orari diversi prima di trarre una conclusione.