SSD Nodes Learn 🎉 VPS vanaf $5.50/mnd
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-13

Hoe controleer ik of mijn VPS echt NVMe-opslag gebruikt?

Controleer of uw VPS daadwerkelijk NVMe-opslag gebruikt met lsblk, sysfs, nvme-cli en een fio latency test. Ontdek waarom virtio de fysieke schijf voor uw Linux gastmachine verbergt.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, August 3, 2026.

Een NVMe-schijf verifiëren op Linux in vier stappen

Voer vier opeenvolgende controles uit om een NVMe-schijf op een Linux VPS te verifiëren: lsblk voor de apparaatnaam, de rotational-vlag in sysfs voor roterende media, nvme list voor een echte NVMe-controller en een korte fio-run voor het enige getal dat een host niet kan veinzen. De eerste drie controles duren elk een seconde. De laatste controle geeft uitsluitsel, omdat de hypervisor op de meeste VPS-platforms de fysieke schijf verbergt voor de gastmachine.

NVMe (non-volatile memory express) is het protocol dat flashopslag gebruikt via PCIe (peripheral component interconnect express)-lanes. Het verving het SATA- en AHCI-pad dat was ontworpen voor roterende schijven; het is snel omdat het een wachtrij-knelpunt tussen de CPU en het flashgeheugen wegneemt. Binnen een virtuele machine spreekt u zelden daadwerkelijk dat protocol. U communiceert met een virtuele schijf die de host voor u samenstelt, waardoor de apparaatnaam in uw gastmachine een driver beschrijft en niet de media in het rack.

Stap 1: wat toont lsblk?

lsblk leest de lijst met blokapparaten van de kernel. De -d-vlag verbergt partities, waardoor u één regel per schijf ziet.

lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODEL

Een KVM VPS reageert doorgaans als volgt:

NAME ROTA  SIZE TYPE TRAN MODEL
vda     0   80G disk

Drie naamgevingspatronen dekken bijna elke Linux-server:

  • nvme0n1 is namespace 1 op NVMe-controller 0. Uw guest stuurt een NVMe-apparaat aan, fysiek of geëmuleerd.
  • sda is de SCSI-laag. Echte SATA- en SAS-schijven komen hier terecht, evenals de virtio-scsi-driver.
  • vda is virtio-blk, de paravirtual block-driver die de meeste KVM-hosts standaard gebruiken.

De kolom TRAN (transport) leest nvme voor een NVMe-apparaat en sata voor een SATA-schijf die de guest direct kan zien. Deze is meestal leeg bij virtio-blk, omdat er geen fysiek transport is dat de guest kan rapporteren. MODEL is om dezelfde reden leeg. Een lege modelnaam op een VPS is normaal en zegt niets over de hardware.

Stap 2: uitsluiten van een draaiende schijf

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"

Het bestand rotational bevat 1 wanneer de kernel detecteert dat het apparaat draaiende schijven bevat, en 0 voor alle andere gevallen. Op bare metal is de waarde afkomstig van de schijf zelf. Bij virtio-blk is deze afkomstig van een feature-bit die door de host wordt ingesteld; een 0 sluit dus een standaard harde schijf uit, maar bewijst verder niets. Lees het bestand desondanks uit: een 1 op een product dat als solid state storage wordt verkocht, is een directe tegenspraak en vormt het enige bewijsstuk waar de supportafdeling niet omheen kan.

readlink -f volgt de sysfs-symlink en toont de bus waaraan het apparaat is gekoppeld:

/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vda

Het woord virtio in dat pad is uw antwoord voor deze stap. Een NVMe-apparaat geeft een pad dat nvme bevat, zoals /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, en een direct aangesloten ATA-schijf geeft een pad dat ata1 bevat. Dit is hetzelfde feit dat lsblk weergaf, maar dan direct uit de kernel in plaats van uit een geformatteerde kolom; dit is nuttig wanneer het veld TRAN leeg is.

Stap 3: nvme-cli en de PCI-bus bevragen

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 geeft één rij per namespace weer, inclusief het serienummer van de controller, de modelnaam en de firmwareversie. Een lege tabel betekent dat er geen NVMe-apparaat aan uw guest is blootgesteld. lspci wanneer er geen overeenkomende regel wordt getoond, duidt dit op hetzelfde vanaf de andere kant: de virtuele PCI-bus die uw guest kan zien, bevat geen NVMe-controller. Beide lege resultaten zijn de normale uitkomst op een virtio VPS en vormen geen bewijs dat de host geen NVMe-schijven heeft.

Als er wel een namespace verschijnt, biedt nvme-cli meer mogelijkheden. sudo nvme id-ctrl /dev/nvme0 toont de identiteit van de controller en sudo nvme smart-log /dev/nvme0n1 toont de temperatuur, het aantal bedrijfsuren en het percentage van de nominale schrijfduurzaamheid dat is verbruikt. Voer deze commando's alleen uit wanneer nvme list daadwerkelijk een apparaat heeft vermeld, aangezien beide commando's een echt /dev/nvme*-node nodig hebben om te openen.

Waarom een echte NVMe-host nog steeds /dev/vda toont

De hypervisor bepaalt welk apparaatmodel uw guest ziet, en die keuze staat los van de onderliggende media. Drie configuraties komen vaak voor.

  • virtio-blk of virtio-scsi over een bestand, een logical volume of een ZFS-dataset die op NVMe-schijven staat. U ziet vda of sda. De opslag is NVMe. De guest heeft geen manier om dit te achterhalen.
  • Een geëmuleerde NVMe-controller voor willekeurige opslag. U ziet nvme0n1, zelfs wanneer de data op een SATA-array of een netwerkvolume twee racks verderop terechtkomt.
  • PCIe passthrough, waarbij de host een fysieke controller toewijst aan één guest. U ziet een echte nvme0n1 met een echte modelnaam. Dit is zeldzaam bij gedeelde VPS-abonnementen, omdat de kaart dan exclusief voor die ene klant is.

De apparaatnaam kan u dus in beide richtingen misleiden. Erger nog: de host kan een write-back cache, een RAID-laag of een gerepliceerd netwerkvolume tussen uw schrijfacties en de flash plaatsen. Elk van deze lagen verandert de prestaties die u ervaart zonder dat de naam in /sys verandert. Daarom is de naam het beginpunt en niet het eindpunt van uw onderzoek. Als u nog een abonnement kiest, legt het verschil tussen NVMe- en SATA SSD-opslag uit wat elke categorie daadwerkelijk waard is om voor te betalen.

De eerlijke test is latentie, dus meet deze

fio (flexible I/O tester) voert echte leesacties uit op een echt bestand en rapporteert hoe lang elke actie duurde. Kleine willekeurige leesacties vormen hier de juiste werklast, omdat deze de round-trip naar het medium blootleggen en niet door read-ahead kunnen worden opgevangen.

Maak eerst het testbestand aan en bewijs dat dit bestandssysteem ongebufferde I/O accepteert. --direct=1 opent het bestand met O_DIRECT, wat de page cache omzeilt. Zonder deze optie meet u uw eigen RAM en krijgt u cijfers die geen enkele schijf kan produceren.

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"

Als dit een weigering afdrukt, bevindt het gekozen pad zich op een bestandssysteem zonder ondersteuning voor O_DIRECT. Container overlay-bestandssystemen en sommige netwerkbestandssystemen gedragen zich op deze manier. Kies een map op het root-bestandssysteem van de VPS en probeer het opnieuw. Als het succes afdrukt, voer dan de meting uit:

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

De run is bewust begrensd: één job, wachtrijdiepte 1, twintig seconden, 256 MB aan data. Het zal uw schijf niet vullen en u zult niet worden gemarkeerd voor misbruik. Wachtrijdiepte 1 is bovendien de eerlijke instelling voor deze vraag, omdat diepe wachtrijen een traag apparaat laten schuilen achter parallellisme terwijl de latentie hoog blijft.

De fio-output lezen

Twee regels zijn van belang. De samenvattingsregel ziet eruit als read: IOPS=9012, BW=35.2MiB/s, en daaronder print fio een clat-blok. clat is de voltooiingslatentie: de tijd tussen het moment dat fio een leesopdracht indient en het moment dat de kernel de data teruggeeft. Lees de avg-waarde en bekijk vervolgens het 99.00th-percentiel in de clat percentiles-lijst. Het gemiddelde geeft de opslagklasse aan. Het 99e percentiel geeft aan hoe vaak een buur op dezelfde host u laat wachten.

Fio geeft latentie weer in microseconden wanneer de waarden klein zijn en schakelt over naar milliseconden wanneer dat niet het geval is. Controleer de eenheid in de regel voordat u waarden met elkaar vergelijkt.

Welke getallen onderscheiden de NVMe-klasse van de SATA-klasse

De onderstaande cijfers zijn typische gepubliceerde waarden voor 4k random reads met één job bij queue depth 1, verzameld uit leveranciersdocumentatie en community-benchmarks per augustus 2026. Dit zijn richtwaarden om mee te vergelijken, geen metingen van uw eigen server.

ChartTypical 4k random read latency at queue depth 1, by storage class
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
  }
]
ChartTypical 4k random read IOPS at queue depth 1, by storage class
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"
  }
]

Een lokaal NVMe-volume beantwoordt één 4k random read in ongeveer 110 microseconden en bereikt ongeveer 9,000 IOPS bij queue depth 1. Een lokale SATA SSD zit rond de 320 microseconden en 3,100 IOPS. Netwerkgekoppelde block storage komt uit rond de 900 microseconden en 1,100 IOPS, omdat elke individuele read een netwerk-hop moet passeren voordat de flash-opslag wordt aangesproken.

Bij queue depth 1 zijn die twee kolommen hetzelfde feit, tweemaal uitgedrukt: één read per keer betekent dat de doorvoer simpelweg één gedeeld door de latency is. Als uw gemiddelde dichter bij de 110 microseconden ligt dan bij de 320 microseconden, dan gebruikt u opslag van de NVMe-klasse, ongeacht hoe lsblk het apparaat heeft genoemd. Als het dichter bij de 900 microseconden ligt, bevindt er zich iets dat trager is dan lokale flash in het pad, en beschrijft de term NVMe op de bestelpagina de schijven van de host in plaats van uw volume.

Voer het meer dan eens uit voordat u klaagt

Eén run is een steekproef, geen resultaat. Een VPS deelt zijn schijven, dus een drukke buur kan uw latentie gedurende tien minuten verdubbelen en daarna verdwijnen. Sommige platforms verstrekken ook burst-credits waardoor de eerste minuten van elke test uitstekend lijken. Voer hetzelfde commando drie of vier keer uit op verschillende uren van de dag en vergelijk het slechtste resultaat, niet het beste. Een enkele slechte run is toeval. Een patroon is een fout die een supportticket rechtvaardigt, en het ticket wordt beter ontvangen met drie bijgevoegde fio-outputs voorzien van een tijdstempel. Voor een breder beeld dat ook CPU en netwerk naast de schijf omvat, gebruikt een volledige VPS benchmark-run dezelfde discipline voor de andere subsystemen.

Wat te doen met het resultaat

Als de latentie in de NVMe-bandbreedte valt, hoeft u zich geen zorgen te maken over de apparaatnaam en kunt u verdergaan. vda is geen downgrade. Het is de snelste virtuele schijfdriver die de meeste hosts aanbieden, en het is de driver die u wilt gebruiken.

Als de latentie in de bandbreedte voor netwerkopslag valt bij een abonnement dat als lokale NVMe wordt verkocht, heeft u een specifieke, reproduceerbare claim: het exacte fio-commando, de gemiddelde voltooiingslatentie en de tijdstippen waarop u de test heeft uitgevoerd. Dit is een onderwerp voor een supportticket in plaats van een discussie op een forum. Voordat u dit verstuurt, moet u bevestigen dat de schijf niet simpelweg vol of sterk gefragmenteerd is, en dat er geen andere processen op de server intensief schrijven terwijl u de test uitvoert.

Voer deze controle uit op de dag dat u de server in gebruik neemt, niet pas op het moment dat iets traag aanvoelt, zodat u een nulmeting heeft om later mee te vergelijken. Dit past uitstekend in de eerste tien minuten op een nieuwe VPS, naast het instellen van de firewall en de SSH-keys. Als het onderscheid tussen opslaglagen nog onduidelijk is, behandelt wat een SSD VPS u werkelijk biedt de basisprincipes die hieraan voorafgaan.

FAQ

Waarom toont lsblk /dev/vda terwijl mijn host NVMe adverteert?

Omdat vda de virtio-blk driver in uw guest benoemt, niet de hardware op de host. Een KVM-hypervisor presenteert een paravirtual block device dat wordt ondersteund door een bestand, een logical volume of een dataset; dit onderliggende opslagmedium kan zich op NVMe-schijven bevinden zonder dat de guest dit ooit opmerkt. De naam beschrijft de virtualisatielaag. Alleen een latentiemeting beschrijft het medium.

Bewijst rotational 0 dat ik een NVMe-schijf heb?

Nee. Dat /sys/block/<dev>/queue/rotational de waarde 0 bevat, betekent dat de kernel niet gelooft dat het apparaat roterende platters heeft. Bij virtio wordt deze waarde ingesteld door een feature bit die de host kiest. Het sluit een gewone harde schijf uit. Het kan echter geen onderscheid maken tussen een NVMe en een SATA SSD, en evenmin tussen lokale flashopslag en een netwerkvolume. Een 1 is nog steeds relevant, aangezien dit in strijd is met elk plan dat als solid state storage wordt verkocht.

Waarom is nvme list leeg op mijn VPS?

Omdat er geen NVMe-controller aan uw guest wordt blootgesteld. Zowel nvme list als lspci lezen wat de virtuele machine kan zien; een virtio-blk of virtio-scsi schijf presenteert geen NVMe-controller om te enumereren. Een lege tabel is het normale resultaat bij de meeste VPS-abonnementen en is geen bewijs dat de host geen NVMe-schijven heeft. Installeer nvme-cli met sudo apt install -y nvme-cli en verwacht een lege tabel, tenzij er een controller is doorgegeven (passthrough).

Welk fio-resultaat telt als NVMe-klasse opslag?

Bij een queue depth van 1 met 4k random reads en --direct=1, is een gemiddelde voltooiingslatentie van ongeveer 110 microseconden NVMe-klasse, waaruit ruwweg 9,000 IOPS voortvloeit. Ongeveer 320 microseconden wijst op een SATA SSD, en ongeveer 900 microseconden wijst op netwerkopslag, waarbij elke leesactie een netwerkhop doorkruist. Dit zijn typische gepubliceerde bandbreedtes voor augustus 2026; vergelijk daarom ordes van grootte in plaats van exacte cijfers en herhaal de test op verschillende tijdstippen voordat u een conclusie trekt.