VPS-Disk unter Linux auf echtes NVMe prüfen
Ihr Host verspricht NVMe? Prüfen Sie das im Gast mit lsblk, sysfs, nvme-cli und einem begrenzten fio-Latenztest. Erfahren Sie, warum virtio die Disk verbirgt.
Linux auf einer NVMe-Disk in vier Schritten verifizieren
Um eine NVMe-Disk auf einem Linux-VPS zu verifizieren, führen Sie vier Prüfungen in dieser Reihenfolge durch: lsblk für den Gerätenamen, das Flag rotational in sysfs für rotierende Datenträger, nvme list für einen echten NVMe-Controller und einen kurzen fio-Lauf für die eine Kennzahl, die ein Host nicht verfälschen kann. Die ersten drei Prüfungen dauern jeweils eine Sekunde. Die letzte klärt die Frage, weil der Hypervisor auf den meisten VPS-Plattformen die physische Disk vor dem Gastbetriebssystem verbirgt.
NVMe (non-volatile memory express) ist das Protokoll, über das Flash-Speicher über PCIe-Lanes (peripheral component interconnect express) angesprochen wird. Es hat den für rotierende Laufwerke entwickelten SATA- und AHCI-Pfad ersetzt und ist schnell, weil es einen Warteschlangenengpass zwischen CPU und Flash-Speicher beseitigt. Innerhalb einer virtuellen Maschine verwenden Sie dieses Protokoll nur selten direkt. Sie greifen auf eine virtuelle Disk zu, die der Host für Sie bereitstellt. Der Gerätename im Gast beschreibt daher einen Treiber und nicht das Speichermedium im Rack.
Schritt 1: Was zeigt lsblk?
lsblk liest die Liste der Blockgeräte aus dem Kernel. Das Flag -d blendet Partitionen aus. Dadurch sehen Sie eine Zeile pro Datenträger.
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELEin KVM-VPS antwortet normalerweise so:
NAME ROTA SIZE TYPE TRAN MODEL
vda 0 80G diskDrei Namensmuster decken fast jeden Linux-Server ab:
nvme0n1ist Namespace 1 auf NVMe-Controller 0. Ihr Gast verwendet ein NVMe-Gerät, entweder physisch oder emuliert.sdagehört zur SCSI-Schicht. Physische SATA- und SAS-Datenträger erscheinen hier. Das gilt auch für den virtio-scsi-Treiber.vdaist virtio-blk, der paravirtualisierte Blocktreiber, den die meisten KVM-Hosts standardmäßig verwenden.
In der Spalte TRAN (Transport) steht bei einem NVMe-Gerät nvme. Bei einer SATA-Festplatte, die der Gast direkt sehen kann, steht dort sata. Unter virtio-blk bleibt die Spalte normalerweise leer, weil der Gast keinen physischen Transport melden kann. MODEL bleibt aus demselben Grund leer. Eine leere Modellbezeichnung bei einem VPS ist normal und sagt nichts über die Hardware aus.
Schritt 2: Eine rotierende Festplatte ausschließen
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"Die Datei rotational enthält 1, wenn der Kernel davon ausgeht, dass das Gerät rotierende Magnetscheiben besitzt, und 0 für alle anderen Geräte. Auf Bare Metal stammt der Wert vom Laufwerk. Unter virtio-blk stammt er aus einem vom Host gesetzten Feature-Bit. Ein 0 schließt daher eine gewöhnliche Festplatte aus, beweist aber darüber hinaus nichts. Lesen Sie den Wert trotzdem aus: Ein 1 bei einem als Solid-State-Speicher angebotenen Tarif ist ein eindeutiger Widerspruch. Außerdem ist dies der eine Screenshot, den der Support nicht wegdiskutieren kann.
readlink -f löst den sysfs-Symlink auf und gibt den Bus aus, an dem das Gerät angeschlossen ist:
/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vdaDas Wort virtio in diesem Pfad ist die Antwort für diesen Schritt. Ein NVMe-Gerät liefert einen Pfad mit nvme, beispielsweise /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1. Eine direkt angeschlossene ATA-Festplatte liefert einen Pfad mit ata1. Dies ist dieselbe Information, die lsblk ausgegeben hat, stammt hier jedoch aus dem Kernel und nicht aus einer formatierten Spalte. Das ist hilfreich, wenn das Feld TRAN leer ist.
Schritt 3: nvme-cli und den PCI-Bus abfragen
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 gibt eine Zeile pro Namespace aus, einschließlich der Seriennummer, der Modellbezeichnung und der Firmware-Version des Controllers. Eine leere Tabelle bedeutet, dass Ihrem Gast kein NVMe-Gerät bereitgestellt wird. Wenn lspci keine passende Zeile ausgibt, bedeutet das dasselbe aus der anderen Perspektive: Der virtuelle PCI-Bus, den Ihr Gast sehen kann, enthält keinen NVMe-Controller. Beide leeren Ergebnisse sind bei einem virtio-VPS normal. Keines davon ist ein Beleg dafür, dass der Host keine NVMe-Laufwerke besitzt.
Wenn ein Namespace angezeigt wird, liefert nvme-cli weitere Informationen. sudo nvme id-ctrl /dev/nvme0 gibt die Identität des Controllers aus. sudo nvme smart-log /dev/nvme0n1 gibt die Temperatur, die Betriebsstunden seit dem Einschalten und den Prozentsatz der bereits verwendeten nominalen Schreibbelastbarkeit aus. Führen Sie diese Befehle nur aus, wenn nvme list tatsächlich ein Gerät aufgelistet hat, da beide Befehle einen vorhandenen /dev/nvme*-Knoten zum Öffnen benötigen.
Warum ein tatsächlich auf NVMe basierender Host weiterhin /dev/vda anzeigt
Der Hypervisor legt fest, welches Gerätemodell der Gast sieht. Diese Auswahl ist unabhängig vom darunterliegenden Speichermedium. Drei Konfigurationen sind häufig.
- virtio-blk oder virtio-scsi über eine Datei, ein logisches Volume oder einen ZFS-Datensatz, der auf NVMe-Laufwerken liegt. Sie sehen
vdaodersda. Der Speicher verwendet NVMe. Der Gast kann das nicht erkennen. - Ein emulierter NVMe-Controller vor beliebigem Speicher. Sie sehen
nvme0n1, auch wenn die Daten auf einem SATA-Array oder auf einem Netzwerk-Volume zwei Racks entfernt liegen. - PCIe-Passthrough, bei dem der Host einen physischen Controller an einen Gast übergibt. Sie sehen ein echtes
nvme0n1mit einer echten Modellbezeichnung. Bei gemeinsam genutzten VPS-Tarifen ist das selten, weil die Karte dann diesem einen Kunden fest zugewiesen ist.
Der Gerätename kann Sie daher in beide Richtungen täuschen. Außerdem kann der Host zwischen Ihren Schreibvorgängen und dem Flash einen Write-back-Cache, eine RAID-Schicht oder ein repliziertes Netzwerk-Volume einsetzen. Jede dieser Schichten verändert die erzielte Leistung, ohne einen einzigen Namen in /sys zu ändern. Deshalb ist der Name der Ausgangspunkt, aber nicht das Ergebnis. Wenn Sie noch einen Tarif auswählen, erklärt der Unterschied zwischen NVMe- und SATA-SSD-Speicher, wofür sich die einzelnen Leistungsklassen tatsächlich lohnen.
Die aussagekräftige Messgröße ist die Latenz. Messen Sie sie daher.
fio (flexible I/O tester) führt echte Lesevorgänge gegen eine echte Datei aus und meldet, wie lange jeder Vorgang gedauert hat. Kleine zufällige Lesevorgänge sind hier der passende Workload, weil sie die Round-Trip-Zeit zum Medium sichtbar machen und nicht durch Read-Ahead bedient werden können.
Erstellen Sie zuerst die Testdatei und prüfen Sie, ob dieses Dateisystem ungepuffertes I/O akzeptiert. --direct=1 öffnet die Datei mit O_DIRECT. Dadurch wird der Page Cache umgangen. Ohne diese Option messen Sie den eigenen RAM und erhalten Werte, die kein Datenträger liefern kann.
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"Wenn dabei die Ablehnung ausgegeben wurde, liegt der gewählte Pfad auf einem Dateisystem ohne Unterstützung für O_DIRECT. Container-Overlay-Dateisysteme und einige Netzwerkdateisysteme verhalten sich so. Wählen Sie ein Verzeichnis auf dem Root-Dateisystem des VPS und versuchen Sie es erneut. Wenn Erfolg ausgegeben wurde, führen Sie die Messung aus:
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.tmpDer Test ist absichtlich begrenzt: ein Job, Warteschlangentiefe 1, zwanzig Sekunden und 256 MB Daten. Dadurch wird die Festplatte nicht gefüllt und kein Abuse-Alarm ausgelöst. Die Warteschlangentiefe 1 ist für diese Frage ebenfalls die aussagekräftige Einstellung, weil tiefe Warteschlangen ein langsames Gerät durch Parallelität ausgleichen können, während die Latenz hoch bleibt.
fio-Ausgabe lesen
Zwei Zeilen sind relevant. Die Zusammenfassungszeile sieht wie read: IOPS=9012, BW=35.2MiB/s aus. Darunter gibt fio einen clat-Block aus. clat bezeichnet die Abschlusslatenz: die Zeit zwischen der Übergabe eines Lesevorgangs durch fio und der Rückgabe der Daten durch den Kernel. Lesen Sie den Wert avg und anschließend das 99.00th-Perzentil in der Liste clat percentiles. Der Durchschnitt zeigt die Speicherklasse. Das 99. Perzentil zeigt, wie häufig ein Nachbar auf demselben Host Sie warten lässt.
fio gibt die Latenz in Mikrosekunden aus, wenn die Werte klein sind, und wechselt zu Millisekunden, wenn sie es nicht sind. Prüfen Sie die Einheit in der vorherigen Zeile, bevor Sie Werte vergleichen.
Welche Zahlen unterscheiden NVMe- von SATA-Klasse?
Die folgenden Werte sind typische veröffentlichte Angaben für zufällige 4k-Lesevorgänge mit einer einzelnen Job-Instanz und einer Warteschlangentiefe von 1. Sie wurden im August 2026 aus Herstellerdokumentationen und Community-Benchmarks zusammengestellt. Es handelt sich um Vergleichsbereiche, nicht um Messwerte Ihres Servers.
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"
}
]Ein lokales NVMe-Volume beantwortet einen zufälligen 4k-Lesevorgang in etwa 110 Mikrosekunden und erreicht bei einer Warteschlangentiefe von 1 ungefähr 9,000 IOPS. Eine lokale SATA-SSD liegt bei etwa 320 Mikrosekunden und 3,100 IOPS. Netzwerkgebundener Blockspeicher liegt bei ungefähr 900 Mikrosekunden und 1,100 IOPS, weil jeder einzelne Lesevorgang einen Netzwerk-Hop durchläuft, bevor überhaupt auf den Flash-Speicher zugegriffen wird.
Bei einer Warteschlangentiefe von 1 beschreiben diese beiden Spalten denselben Sachverhalt auf zwei Arten: Ein Lesevorgang nach dem anderen bedeutet, dass der Durchsatz einfach 1 geteilt durch die Latenz ist. Wenn Ihr Durchschnitt näher bei 110 als bei 320 Mikrosekunden liegt, verwenden Sie Speicher der NVMe-Klasse, unabhängig davon, wie lsblk das Gerät bezeichnet. Liegt der Wert näher bei 900 Mikrosekunden, befindet sich etwas Langsameres als lokaler Flash-Speicher im Pfad. Die Bezeichnung NVMe auf der Bestellseite beschreibt dann die Laufwerke des Hosts und nicht Ihr Volume.
Führen Sie den Test mehr als einmal aus, bevor Sie sich beschweren
Ein Durchlauf ist eine Stichprobe, kein Ergebnis. Ein VPS verwendet gemeinsam genutzte Festplatten. Ein ausgelasteter Nachbar kann Ihre Latenz zehn Minuten lang verdoppeln und anschließend wieder verschwinden. Einige Plattformen gewähren außerdem Burst-Guthaben. Dadurch sehen die ersten Minuten eines Tests oft ausgezeichnet aus. Führen Sie denselben Befehl zu verschiedenen Tageszeiten drei- oder viermal aus. Vergleichen Sie das schlechteste Ergebnis, nicht das beste. Ein einzelner schlechter Durchlauf kann eine vorübergehende Schwankung sein. Ein Muster ist ein Fehler, für den sich ein Support-Ticket lohnt. Das Ticket lässt sich besser bearbeiten, wenn Sie drei mit Zeitstempeln versehene fio-Ausgaben anhängen. Für eine umfassendere Bewertung von CPU, Netzwerk und Festplatte verwendet ein vollständiger VPS-Benchmarklauf dieselbe Vorgehensweise für die anderen Subsysteme.
Was Sie mit dem Ergebnis tun sollten
Liegt die Latenz im NVMe-Bereich, müssen Sie sich keine Gedanken mehr über den Gerätenamen machen. Fahren Sie mit dem nächsten Schritt fort. vda ist keine Herabstufung. Es ist der schnellste virtuelle Festplattentreiber, den die meisten Hosts anbieten, und genau diesen sollten Sie verwenden.
Liegt die Latenz bei einem Tarif, der als lokales NVMe verkauft wird, im Bereich von Netzwerkspeicher, haben Sie eine konkrete und reproduzierbare Grundlage für Ihre Meldung: den exakten fio-Befehl, die durchschnittliche Abschlusslatenz und die Zeitpunkte der Messungen. Das ist ein Support-Ticket und keine Diskussion in einem Forum. Vergewissern Sie sich vor dem Absenden, dass der Datenträger nicht einfach voll oder stark fragmentiert ist. Stellen Sie außerdem sicher, dass während des Tests kein Prozess auf dem Server intensiv schreibt.
Führen Sie diese Prüfung am Tag der Bereitstellung durch, nicht erst, wenn sich etwas langsam anfühlt. So haben Sie eine Basis zum späteren Vergleich. Die Prüfung passt gut zu den ersten zehn Minuten auf einem neuen VPS, zusammen mit der Einrichtung der Firewall und der SSH-Schlüssel. Wenn der Unterschied zwischen den Speicherebenen noch unklar ist, erklärt was ein SSD-VPS tatsächlich bietet die technischen Grundlagen.
FAQ
Warum zeigt lsblk /dev/vda an, obwohl mein Host NVMe angibt?
Weil vda den virtio-blk-Treiber in Ihrem Gast bezeichnet, nicht die Hardware auf dem Host. Ein KVM-Hypervisor stellt ein paravirtualisiertes Blockgerät bereit, das von einer Datei, einem logischen Volume oder einem Dataset unterstützt wird. Dieser zugrunde liegende Speicher kann auf NVMe-Laufwerken liegen, ohne dass der Gast davon erfährt. Der Name beschreibt die Virtualisierungsschicht. Nur eine Latenzmessung beschreibt das Speichermedium.
Beweist rotational 0, dass ich eine NVMe-Festplatte habe?
Nein. /sys/block/<dev>/queue/rotational mit dem Wert 0 bedeutet, dass der Kernel davon ausgeht, dass das Gerät keine rotierenden Magnetscheiben besitzt. Bei virtio wird dieser Wert durch ein vom Host gesetztes Feature-Bit bestimmt. Damit ist ein herkömmliches Festplattenlaufwerk ausgeschlossen. NVMe lässt sich damit jedoch nicht von einer SATA-SSD unterscheiden. Ebenso lässt sich lokaler Flash-Speicher nicht von einem Netzwerk-Volume unterscheiden. Ein 1 ist dennoch relevant, weil es einem als Solid-State-Speicher angebotenen Speichermedium widerspricht.
Warum ist die Ausgabe von nvme list auf meinem VPS leer?
Weil Ihrem Gast kein NVMe-Controller zur Verfügung gestellt wird. nvme list und lspci lesen beide nur, was die virtuelle Maschine sehen kann. Ein virtio-blk- oder virtio-scsi-Laufwerk stellt keinen NVMe-Controller zur Auflistung bereit. Eine leere Tabelle ist bei den meisten VPS-Tarifen das normale Ergebnis. Sie beweist nicht, dass auf dem Host keine NVMe-Laufwerke vorhanden sind. Installieren Sie nvme-cli mit sudo apt install -y nvme-cli. Rechnen Sie mit einer leeren Tabelle, sofern kein Controller durchgereicht wurde.
Welches fio-Ergebnis gilt als NVMe-Klasse?
Bei einer Warteschlangentiefe von 1, 4k-Zufallslesevorgängen und --direct=1 entspricht eine durchschnittliche Abschlusslatenz von ungefähr 110 Mikrosekunden NVMe-Klasse. Daraus ergeben sich ungefähr 9,000 IOPS. Etwa 320 Mikrosekunden deuten auf eine SATA-SSD hin. Etwa 900 Mikrosekunden deuten auf netzwerkgebundenen Speicher hin, bei dem jeder Lesevorgang einen Netzwerk-Hop durchläuft. Dies sind typische veröffentlichte Bereiche für August 2026. Vergleichen Sie daher eher Größenordnungen als exakte Werte. Wiederholen Sie den Test zu unterschiedlichen Uhrzeiten, bevor Sie eine Schlussfolgerung ziehen.