Comment vérifier un disque NVMe sur un VPS Linux
Votre hébergeur annonce du NVMe ? Vérifiez-le avec lsblk, sysfs, nvme-cli et un test fio borné, car virtio peut masquer le disque physique au système invité.
Vérifier un disque NVMe sous Linux en quatre étapes
Pour vérifier un disque NVMe sur un VPS Linux, effectuez quatre contrôles dans l’ordre : lsblk pour connaître le nom du périphérique, l’indicateur rotational dans sysfs pour détecter un support rotatif, nvme list pour confirmer la présence d’un contrôleur NVMe réel, puis un court test fio pour obtenir la seule valeur qu’un hôte ne peut pas maquiller. Les trois premiers contrôles prennent chacun une seconde. Le dernier tranche la question, car, sur la plupart des plateformes VPS, l’hyperviseur masque le disque physique au système invité.
NVMe (non-volatile memory express) est le protocole utilisé par le stockage flash sur les lignes PCIe (peripheral component interconnect express). Il a remplacé le chemin SATA et AHCI, conçu pour les disques rotatifs, et il est rapide parce qu’il supprime un goulot d’étranglement de mise en file entre le CPU et la mémoire flash. Dans une machine virtuelle, vous utilisez rarement ce protocole directement. Vous utilisez un disque virtuel que l’hôte assemble pour vous. Le nom du périphérique dans votre système invité décrit donc un pilote, et non le support présent dans le rack.
Étape 1 : que montre lsblk ?
lsblk lit la liste des périphériques de type bloc du kernel. L’option -d masque les partitions : vous obtenez donc une ligne par disque.
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELUn VPS KVM répond généralement ainsi :
NAME ROTA SIZE TYPE TRAN MODEL
vda 0 80G diskTrois schémas de nommage couvrent presque tous les serveurs Linux :
nvme0n1correspond à l’espace de noms 1 du contrôleur NVMe 0. Votre guest utilise un périphérique NVMe, réel ou émulé.sdacorrespond à la couche SCSI. Les disques SATA et SAS réels apparaissent ici, tout comme ceux pris en charge par le pilote virtio-scsi.vdacorrespond à virtio-blk, le pilote de périphériques bloc paravirtualisés utilisé par défaut par la plupart des hôtes KVM.
La colonne TRAN (transport) affiche nvme pour un périphérique NVMe et sata pour un disque SATA que le guest peut voir directement. Elle est généralement vide avec virtio-blk, car le guest n’a aucun transport physique à signaler. MODEL est vide pour la même raison. Une chaîne de modèle vide sur un VPS est normale et ne fournit aucune information sur le matériel.
Étape 2 : écarter l’hypothèse d’un disque mécanique
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"Le fichier rotational contient 1 lorsque le kernel considère que le périphérique possède des plateaux en rotation, et 0 dans tous les autres cas. Sur une machine bare metal, cette valeur provient du disque. Avec virtio-blk, elle provient d’un bit de fonctionnalité défini par l’hôte. Ainsi, un 0 exclut un disque dur classique, mais ne prouve rien de plus. Consultez tout de même cette valeur : un 1 sur une offre vendue comme du stockage solid state est une contradiction manifeste, et c’est la seule capture d’écran que le support ne peut pas contester.
readlink -f résout le lien symbolique sysfs et affiche le bus auquel le périphérique est rattaché :
/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vdaLe mot virtio dans ce chemin constitue la réponse pour cette étape. Un périphérique NVMe fournit un chemin contenant nvme, par exemple /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, tandis qu’un disque ATA directement connecté fournit un chemin contenant ata1. Il s’agit du même élément que celui affiché par lsblk, mais récupéré depuis le kernel plutôt que depuis une colonne formatée. Cela est utile lorsque le champ TRAN est vide.
Étape 3 : interroger nvme-cli et le 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 affiche une ligne par namespace, avec le numéro de série du contrôleur, la chaîne du modèle et la révision du firmware. Une table vide signifie qu’aucun périphérique NVMe n’est exposé à votre guest. lspci n’affichant aucune ligne correspondante indique la même chose sous un autre angle : le bus PCI virtuel visible par votre guest ne contient aucun contrôleur NVMe. Ces deux résultats vides sont normaux sur un VPS virtio. Aucun des deux ne prouve que l’hôte ne possède aucun disque NVMe.
Si un namespace apparaît, nvme-cli permet d’aller plus loin. sudo nvme id-ctrl /dev/nvme0 affiche l’identité du contrôleur, et sudo nvme smart-log /dev/nvme0n1 affiche la température, le nombre d’heures sous tension et le pourcentage de l’endurance nominale en écriture déjà utilisé. Exécutez ces commandes uniquement lorsque nvme list a effectivement listé un périphérique, car elles doivent toutes deux ouvrir un véritable nœud /dev/nvme*.
Pourquoi un hôte réellement équipé de NVMe affiche quand même /dev/vda
L’hyperviseur détermine le modèle de périphérique présenté à votre guest. Ce choix est indépendant du support de stockage sous-jacent. Trois configurations sont courantes.
- virtio-blk ou virtio-scsi au-dessus d’un fichier, d’un logical volume ou d’un dataset ZFS situé sur des disques NVMe. Vous voyez
vdaousda. Le stockage est en NVMe. Le guest n’a aucun moyen de le savoir. - Un contrôleur NVMe émulé placé devant n’importe quel stockage. Vous voyez
nvme0n1, même si les données sont écrites sur une baie SATA ou sur un volume réseau situé à deux baies de distance. - Le PCIe passthrough, dans lequel l’hôte attribue un contrôleur physique à un seul guest. Vous voyez un véritable
nvme0n1avec une véritable chaîne de modèle. Cette configuration est rare sur les offres VPS partagées, car la carte est alors dédiée à un seul client.
Le nom du périphérique peut donc vous induire en erreur dans les deux sens. De plus, l’hôte peut placer un write-back cache, une couche RAID ou un volume réseau répliqué entre vos écritures et la mémoire flash. Chacun de ces éléments modifie les performances obtenues sans changer un seul nom dans /sys. C’est pourquoi le nom constitue un point de départ, pas une conclusion. Si vous êtes encore en train de choisir une offre, la différence entre le stockage NVMe et le stockage SSD SATA explique ce que chaque niveau justifie réellement de payer.
Le vrai test, c’est la latence : mesurez-la
fio (flexible I/O tester) effectue de vraies lectures sur un fichier réel et indique la durée de chaque opération. De petites lectures aléatoires constituent la charge adaptée ici, car elles exposent l’aller-retour vers le support et ne peuvent pas être servies par la lecture anticipée.
Commencez par créer le fichier de test et vérifiez que ce système de fichiers accepte les entrées-sorties sans mise en tampon. --direct=1 ouvre le fichier avec O_DIRECT, ce qui contourne le cache de pages. Sans cette option, vous mesurez votre propre mémoire vive et obtenez des valeurs qu’aucun disque ne peut produire.
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"Si le message affiché indique un refus, le chemin choisi se trouve sur un système de fichiers qui ne prend pas en charge O_DIRECT. Les systèmes de fichiers overlay des conteneurs et certains systèmes de fichiers réseau se comportent ainsi. Choisissez un répertoire sur le système de fichiers racine du VPS, puis réessayez. Si le message indique une réussite, lancez la mesure :
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.tmpLa durée du test est volontairement limitée : un seul job, une profondeur de file d’attente de 1, vingt secondes et 256 MB de données. Le test ne remplira pas votre disque et ne vous fera pas signaler pour abus. Une profondeur de file d’attente de 1 est également le réglage approprié pour cette question, car les files d’attente profondes permettent à un périphérique lent de masquer ses performances derrière le parallélisme alors que la latence reste élevée.
Lecture de la sortie de fio
Deux lignes sont importantes. La ligne de synthèse ressemble à read: IOPS=9012, BW=35.2MiB/s et fio affiche juste dessous un bloc clat. clat correspond à la latence d’achèvement : le temps entre la soumission d’une lecture par fio et la remise des données par le noyau. Lisez la valeur avg, puis le percentile 99.00th dans la liste clat percentiles. La moyenne vous renseigne sur la classe de stockage. Le 99e percentile indique à quelle fréquence un autre utilisateur sur le même hôte vous fait attendre.
Fio affiche la latence en microsecondes lorsque les valeurs sont faibles et passe aux millisecondes dans le cas contraire. Vérifiez l’unité indiquée sur la ligne avant toute comparaison.
Quels chiffres distinguent la classe NVMe de la classe SATA
Les valeurs ci-dessous sont des valeurs généralement publiées pour des lectures aléatoires 4k sur une seule tâche, avec une profondeur de file d’attente de 1. Elles proviennent de la documentation des fournisseurs et de benchmarks communautaires collectés en août 2026. Il s’agit de plages de comparaison, pas de mesures effectuées sur votre serveur.
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 local répond à une lecture aléatoire 4k en environ 110 microsecondes et atteint environ 9,000 IOPS avec une profondeur de file d’attente de 1. Un SSD SATA local se situe autour de 320 microsecondes et 3,100 IOPS. Un stockage bloc connecté au réseau se situe autour de 900 microsecondes et 1,100 IOPS, car chaque lecture traverse un saut réseau avant que la mémoire flash soit sollicitée.
Avec une profondeur de file d’attente de 1, ces deux colonnes expriment le même fait de deux façons : une seule lecture à la fois signifie que le débit correspond simplement à l’inverse de la latence. Si votre moyenne est plus proche de 110 que de 320 microsecondes, votre stockage appartient à la classe NVMe, quel que soit le nom que lsblk a choisi pour le périphérique. Si elle est plus proche de 900 microsecondes, un composant plus lent que la mémoire flash locale se trouve sur le chemin. Le terme NVMe affiché sur la page de commande décrit alors les disques de l’hôte, et non votre volume.
Lancez le test plusieurs fois avant de vous plaindre
Un seul test fournit un échantillon, pas un résultat. Un VPS partage ses disques, et un voisin très sollicité peut doubler votre latence pendant dix minutes avant de redevenir normal. Certaines plateformes accordent aussi des crédits de burst, ce qui rend les premières minutes d’un test particulièrement bonnes. Exécutez la même commande trois ou quatre fois à différentes heures de la journée et comparez le pire résultat, pas le meilleur. Un seul mauvais résultat peut être ponctuel. Un schéma récurrent indique un problème qui justifie un ticket auprès du support, lequel sera plus convaincant avec trois sorties fio horodatées en pièce jointe. Pour obtenir une vue d’ensemble incluant le CPU et le réseau, en plus du disque, un benchmark complet du VPS applique la même méthode aux autres sous-systèmes.
Que faire de la réponse
Si la latence se situe dans la plage du stockage NVMe, ne vous préoccupez plus du nom du périphérique et passez à la suite. vda n’est pas une régression. C’est le pilote de disque virtuel le plus rapide proposé par la plupart des hébergeurs, et c’est celui qu’il vous faut.
Si la latence se situe dans la plage du stockage réseau alors que l’offre est vendue comme du NVMe local, vous disposez d’un constat précis et reproductible : la commande fio exacte, la latence moyenne d’achèvement et les horaires auxquels vous avez effectué les tests. Cela justifie l’ouverture d’un ticket auprès du support, plutôt qu’une discussion sur un forum. Avant de l’envoyer, vérifiez que le disque n’est pas simplement plein ou fortement fragmenté, et qu’aucun processus sur la machine n’effectue d’importantes écritures pendant le test.
Effectuez cette vérification le jour où vous provisionnez le serveur, et non le jour où quelque chose semble lent. Vous aurez ainsi une référence à laquelle comparer les résultats ultérieurs. Cette vérification s’intègre naturellement dans les dix premières minutes sur un nouveau VPS, avec la configuration du firewall et des clés SSH. Si la distinction entre les différents niveaux de stockage reste floue, ce qu’un VPS SSD vous apporte réellement présente les notions sous-jacentes.
FAQ
Pourquoi lsblk affiche-t-il /dev/vda alors que mon hébergeur annonce du NVMe ?
Parce que vda désigne le pilote virtio-blk dans votre système invité, et non le matériel de l’hôte. Un hyperviseur KVM présente un périphérique bloc paravirtualisé adossé à un fichier, un volume logique ou un dataset. Ce stockage sous-jacent peut se trouver sur des disques NVMe sans que le système invité puisse le savoir. Le nom décrit la couche de virtualisation. Seule une mesure de latence décrit le support de stockage.
La valeur rotational 0 prouve-t-elle que j’ai un disque NVMe ?
Non. /sys/block/<dev>/queue/rotational contenant 0 signifie que le noyau considère que le périphérique ne possède pas de plateaux en rotation. Avec virtio, cette valeur est définie par un bit de fonctionnalité choisi par l’hôte. Elle exclut un disque dur classique. Elle ne permet pas de distinguer un NVMe d’un SSD SATA, ni une mémoire flash locale d’un volume réseau. Un 1 reste néanmoins important, car il contredit tout plan vendu comme un stockage SSD.
Pourquoi nvme list ne renvoie-t-il rien sur mon VPS ?
Parce qu’aucun contrôleur NVMe n’est exposé à votre système invité. nvme list et lspci lisent tous deux ce que la machine virtuelle peut voir, et un disque virtio-blk ou virtio-scsi ne présente aucun contrôleur NVMe à énumérer. Un tableau vide est le résultat normal sur la plupart des offres VPS. Il ne prouve pas que l’hôte ne possède pas de disques NVMe. Installez nvme-cli avec sudo apt install -y nvme-cli et attendez-vous à obtenir un tableau vide, sauf si un contrôleur a été passé directement à la machine virtuelle.
Quel résultat fio correspond à un stockage de classe NVMe ?
Avec une profondeur de file d’attente de 1, des lectures aléatoires de 4k et --direct=1, une latence moyenne d’achèvement proche de 110 microsecondes correspond à un stockage de classe NVMe. Elle donne environ 9,000 IOPS. Une valeur proche de 320 microsecondes indique un SSD SATA. Une valeur proche de 900 microsecondes indique un stockage attaché au réseau, car chaque lecture traverse un saut réseau. Ces valeurs correspondent aux plages généralement publiées en August 2026. Comparez donc les ordres de grandeur plutôt que les chiffres exacts, et répétez le test à différentes heures avant de tirer une conclusion.