Jak sprawdzić czy dysk VPS to faktycznie NVMe w Linux
Dowiedz się jak zweryfikować typ nośnika za pomocą lsblk, sysfs, nvme-cli oraz testu fio. Sprawdź czy Twój hypervisor nie ukrywa fizycznego dysku pod warstwą wirtualizacji virtio.
Weryfikacja dysku NVMe w systemie Linux w czterech krokach
Aby zweryfikować dysk NVMe na serwerze VPS z systemem Linux, należy wykonać cztery sprawdzenia w podanej kolejności: lsblk dla nazwy urządzenia, flagę rotational oraz ścieżkę magistrali w sysfs, nvme list dla rzeczywistego kontrolera NVMe oraz krótkie uruchomienie fio dla jedynej liczby, której host nie może sfałszować. Pierwsze trzy kroki zajmują po sekundzie. Ostatni rozstrzyga kwestię, ponieważ na większości platform VPS hypervisor ukrywa fizyczny dysk przed systemem gościa.
NVMe (non-volatile memory express) to protokół, za pomocą którego pamięć flash komunikuje się przez linie PCIe (peripheral component interconnect express). Zastąpił on ścieżkę SATA i AHCI, zaprojektowaną dla dysków talerzowych, i jest szybki, ponieważ eliminuje wąskie gardło kolejkowania między procesorem a pamięcią flash. Wewnątrz maszyny wirtualnej rzadko korzysta się z tego protokołu. Komunikacja odbywa się z dyskiem wirtualnym, który host przygotowuje dla użytkownika, więc nazwa urządzenia w systemie gościa opisuje sterownik, a nie nośnik znajdujący się w szafie serwerowej.
Krok 1: co pokazuje lsblk?
lsblk odczytuje listę urządzeń blokowych z jądra systemu. Flaga -d ukrywa partycje, dzięki czemu wyświetlana jest jedna linia na każdy dysk.
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELSerwer KVM VPS zazwyczaj zwraca następujące informacje:
NAME ROTA SIZE TYPE TRAN MODEL
vda 1 80G disk virtioTrzy schematy nazewnictwa obejmują niemal każdy serwer z systemem Linux:
nvme0n1to przestrzeń nazw 1 na kontrolerze NVMe 0. System gościa obsługuje urządzenie NVMe, rzeczywiste lub emulowane.sdato warstwa SCSI. Trafiają tu rzeczywiste dyski SATA i SAS, a także sterownik virtio-scsi.vdato virtio-blk, parawirtualny sterownik blokowy używany domyślnie przez większość hostów KVM.
Kolumna TRAN (transport) zawiera wartość nvme dla urządzenia NVMe oraz sata dla dysku SATA widocznego bezpośrednio dla gościa. W przypadku virtio-blk, bieżące wydania util-linux wyświetlają virtio, co lsblk wnioskuje z nazwy urządzenia vd, natomiast starsze wydania pozostawiają to pole puste. W obu przypadkach brak jest fizycznego transportu, który gość mógłby zaraportować. Pole MODEL pozostaje puste z tego samego powodu. Pusty ciąg znaków w polu modelu na serwerze VPS jest zjawiskiem normalnym i nie dostarcza informacji o sprzęcie.
Krok 2: wykluczenie dysku talerzowego
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"Plik rotational zawiera 1, gdy jądro traktuje urządzenie jako dysk z wirującymi talerzami, oraz 0 w przeciwnym przypadku. Na serwerach typu bare metal wartość ta pochodzi bezpośrednio z napędu. W przypadku virtio-blk wartość ta jest nieokreślona: specyfikacja virtio-blk nie posiada bitu funkcji określającego typ nośnika ani prędkość obrotową, a sterownik Linux virtio-blk oznacza każdy dysk jako obrotowy. Z tego powodu vda zazwyczaj zwraca 1 nawet na hoście opartym w całości na pamięci flash, chyba że wymuszono wartość 0 za pomocą reguły udev. W przypadku sda typu virtio-scsi wartość jest zależna od konfiguracji hosta. Zatem wewnątrz VPS ta flaga nie pozwala jednoznacznie określić typu dysku, a 1 samo w sobie nie stanowi podstawy do zgłoszenia serwisowego. Poniższy test fio pozwala uzyskać wiarygodną odpowiedź na to pytanie.
readlink -f rozwiązuje dowiązanie symboliczne sysfs i wyświetla magistralę, do której podłączone jest urządzenie:
/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vdaSłowo virtio w tej ścieżce stanowi odpowiedź dla tego kroku. Urządzenie NVMe zwraca ścieżkę zawierającą nvme, na przykład /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, natomiast bezpośrednio podłączony dysk ATA zwraca ścieżkę zawierającą ata1. Jest to ten sam fakt, który wyświetla lsblk, pobrany bezpośrednio z jądra, a nie z sformatowanej kolumny, co jest przydatne, gdy pole TRAN jest puste.
Krok 3: odpytanie nvme-cli oraz magistrali 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 wyświetla jeden wiersz dla każdej przestrzeni nazw (namespace), wraz z numerem seryjnym kontrolera, ciągiem znaków modelu oraz wersją oprogramowania układowego. Pusta tabela oznacza, że żadne urządzenie NVMe nie jest udostępnione dla gościa. lspci brak pasującej linii w wyniku polecenia oznacza to samo z drugiej strony: wirtualna magistrala PCI widoczna dla gościa nie zawiera żadnego kontrolera NVMe. Oba puste wyniki są typowe dla VPS typu virtio i żaden z nich nie stanowi dowodu na brak dysków NVMe w hoście.
Jeśli przestrzeń nazw zostanie wykryta, nvme-cli pozwala na dalszą diagnostykę. sudo nvme id-ctrl /dev/nvme0 wyświetla identyfikator kontrolera, a sudo nvme smart-log /dev/nvme0n1 podaje temperaturę, czas pracy oraz procent zużycia wytrzymałości zapisu. Polecenia te należy uruchamiać tylko wtedy, gdy nvme list faktycznie wykazało obecność urządzenia, ponieważ oba wymagają poprawnego węzła /dev/nvme* do otwarcia.
Dlaczego host z prawdziwym NVMe nadal wyświetla /dev/vda
Hypervisor decyduje, jaki model urządzenia widzi system gościa, a wybór ten jest niezależny od nośnika znajdującego się poniżej. Powszechne są trzy konfiguracje.
- virtio-blk lub virtio-scsi obsługujące plik, wolumin logiczny lub dataset ZFS znajdujący się na dyskach NVMe. Widoczne są
vdalubsda. Pamięć masowa to NVMe. Gość nie ma możliwości, aby się o tym dowiedzieć. - Emulowany kontroler NVMe przed dowolnym rodzajem pamięci masowej. Widoczne jest
nvme0n1, nawet jeśli dane trafiają na macierz SATA lub wolumin sieciowy znajdujący się dwie szafy rack dalej. - PCIe passthrough, gdzie host przekazuje fizyczny kontroler jednemu gościowi. Widoczne jest rzeczywiste
nvme0n1z prawdziwym ciągiem znaków modelu. Jest to rzadkie w przypadku współdzielonych planów VPS, ponieważ karta jest wtedy przypisana wyłącznie do jednego klienta.
Nazwa urządzenia może zatem wprowadzać w błąd w obie strony. Co gorsza, host może umieścić cache typu write-back, warstwę RAID lub replikowany wolumin sieciowy pomiędzy operacjami zapisu a pamięcią flash, a każda z tych zmian wpływa na wydajność bez zmiany nazwy w /sys. Dlatego nazwa jest punktem wyjścia, a nie końcowym etapem analizy. Jeśli nadal wybierasz plan, różnica między pamięcią NVMe a SSD SATA wyjaśnia, za co w każdej z tych kategorii warto zapłacić.
Rzetelnym testem jest opóźnienie, więc należy je zmierzyć
Narzędzie fio (flexible I/O tester) wykonuje rzeczywiste operacje odczytu na pliku i raportuje czas trwania każdej z nich. Właściwym obciążeniem są tutaj małe, losowe odczyty, ponieważ ujawniają one czas pełnego cyklu dostępu do nośnika i nie mogą być obsłużone przez mechanizm read-ahead.
Najpierw należy utworzyć plik testowy i sprawdzić, czy system plików obsługuje operacje wejścia/wyjścia bez buforowania. Parametr --direct=1 otwiera plik z flagą O_DIRECT, co pozwala pominąć pamięć podręczną stron (page cache). Bez tego mierzone byłoby działanie pamięci RAM, co prowadziłoby do wyników niemożliwych do osiągnięcia dla żadnego dysku.
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"Jeśli wyświetlony został komunikat o odmowie, wybrana ścieżka znajduje się w systemie plików nieobsługującym O_DIRECT. Tak zachowują się kontenerowe systemy plików typu overlay oraz niektóre sieciowe systemy plików. Należy wybrać katalog w głównym systemie plików VPS i spróbować ponownie. Jeśli operacja zakończyła się sukcesem, należy uruchomić pomiar:
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.tmpTest jest celowo ograniczony: jedno zadanie, głębokość kolejki 1, czas trwania dwadzieścia sekund, 256 MB danych. Nie spowoduje to zapełnienia dysku ani nie narazi użytkownika na zgłoszenie nadużycia. Głębokość kolejki 1 jest również uczciwym ustawieniem w tym przypadku, ponieważ duże kolejki pozwalają wolnym urządzeniom ukryć niską wydajność za równoległością, podczas gdy opóźnienia pozostają wysokie.
Analiza wyników fio
Istotne są dwa wiersze. Wiersz podsumowania wygląda jak read: IOPS=9012, BW=35.2MiB/s, a pod nim fio drukuje blok clat. clat to opóźnienie zakończenia operacji: czas od wysłania żądania odczytu przez fio do momentu zwrócenia danych przez jądro systemu. Należy odczytać wartość avg, a następnie sprawdzić percentyl 99.00th na liście clat percentiles. Wartość średnia określa klasę wydajności nośnika. 99. percentyl wskazuje, jak wolne były najwolniejsze 1 procent odczytów; to właśnie tam najczęściej uwidacznia się rywalizacja o zasoby na współdzielonym hoście.
Fio podaje opóźnienia w mikrosekundach, gdy wartości są małe, i przełącza się na milisekundy, gdy stają się większe. Przed porównaniem jakichkolwiek danych należy sprawdzić jednostkę w wierszu.
Jakie wartości odróżniają klasę NVMe od klasy SATA
Poniższe liczby to typowe, publikowane wartości dla pojedynczego zadania odczytu losowego 4k przy głębokości kolejki 1, zebrane z dokumentacji producentów oraz benchmarków społecznościowych na sierpień 2026. Są to przedziały służące do porównania, a nie pomiary z Twojego serwera.
Dane, na których opiera się ten wykres
[
{
"label": "Local NVMe",
"avg_latency_us": 110
},
{
"label": "Local SATA SSD",
"avg_latency_us": 320
},
{
"label": "Network block storage",
"avg_latency_us": 900
}
]Dane, na których opiera się ten wykres
[
{
"label": "Local NVMe",
"iops": "9,000"
},
{
"label": "Local SATA SSD",
"iops": "3,100"
},
{
"label": "Network block storage",
"iops": "1,100"
}
]Lokalny wolumen NVMe odpowiada na jeden odczyt losowy 4k w czasie około 110 mikrosekund i osiąga około 9,000 IOPS przy głębokości kolejki 1. Lokalny dysk SATA znajduje się w okolicach 320 mikrosekund i 3,100 IOPS. Sieciowa pamięć masowa typu block storage osiąga około 900 mikrosekund i 1,100 IOPS, ponieważ odczyt, który nie trafia do pamięci podręcznej hosta, musi przejść przez sieć, zanim dotrze do pamięci flash.
Przy głębokości kolejki 1 te dwie kolumny stanowią niemal ten sam fakt wyrażony dwukrotnie: przy jednym odczycie w toku, przepustowość wynosi w przybliżeniu jeden podzielony przez opóźnienie, nieco mniej po uwzględnieniu narzutu na każde żądanie. Jeśli średnia jest bliższa 110 niż 320 mikrosekund, korzystasz z pamięci klasy NVMe, niezależnie od tego, jak lsblk zdecydowało się nazwać to urządzenie. Jeśli jest bliższa 900 mikrosekund, w ścieżce znajduje się coś wolniejszego niż lokalna pamięć flash lub host ogranicza IOPS wolumenu, co mogą robić hiperwizory takie jak QEMU, niezależnie od fizycznego nośnika. W obu przypadkach wolumen nie zapewnia opóźnień klasy NVMe, bez względu na to, co strona zamówienia mówi o dyskach hosta.
Uruchom test wielokrotnie przed zgłoszeniem problemu
Pojedyncze uruchomienie to próba, a nie wynik. VPS współdzieli zasoby dyskowe, więc obciążony sąsiad może na dziesięć minut podwoić opóźnienia, a następnie zniknąć. Niektóre platformy przyznają również kredyty wydajnościowe (burst credits), dzięki którym pierwsze minuty testu wyglądają bardzo dobrze. Uruchom to samo polecenie trzy lub cztery razy o różnych porach dnia i porównaj najgorszy wynik, a nie najlepszy. Jeden słaby wynik to kwestia chwilowych warunków. Powtarzalny wzorzec to usterka uzasadniająca zgłoszenie do wsparcia technicznego, a zgłoszenie jest skuteczniejsze, gdy załączono do niego trzy wyniki fio z sygnaturami czasowymi. Aby uzyskać szerszy obraz obejmujący procesor i sieć, a także dysk, pełny test wydajności VPS wymaga zastosowania tej samej dyscypliny wobec pozostałych podsystemów.
Co zrobić z uzyskanym wynikiem
Jeśli opóźnienie mieści się w zakresie NVMe, należy przestać przejmować się nazwą urządzenia i przejść dalej. vda nie jest rozwiązaniem gorszej jakości. Jest to najszybszy sterownik dysku wirtualnego oferowany przez większość hostów i jest to rozwiązanie zalecane.
Jeśli opóźnienie mieści się w zakresie pamięci masowej sieciowej w planie sprzedawanym jako lokalne NVMe, użytkownik dysponuje konkretnym, powtarzalnym dowodem: dokładnym poleceniem fio, średnim opóźnieniem zakończenia operacji oraz czasem wykonania testu. Jest to podstawa do zgłoszenia technicznego, a nie do dyskusji na forum. Przed wysłaniem zgłoszenia należy upewnić się, że dysk nie jest po prostu pełny lub silnie pofragmentowany oraz że w trakcie testu żaden inny proces na serwerze nie wykonuje intensywnych operacji zapisu.
Test ten należy wykonać w dniu udostępnienia serwera, a nie w momencie, gdy odczuwalny jest spadek wydajności, aby dysponować punktem odniesienia do późniejszych porównań. Naturalnie wpisuje się to w pierwsze dziesięć minut pracy z nowym VPS, obok konfiguracji firewalla i kluczy SSH. Jeśli rozróżnienie między poziomami pamięci masowej jest nadal niejasne, artykuł co faktycznie oferuje SSD VPS wyjaśnia podstawy tego zagadnienia.
FAQ
Dlaczego lsblk pokazuje /dev/vda, skoro host korzysta z NVMe?
Ponieważ vda oznacza sterownik virtio-blk wewnątrz systemu gościa, a nie fizyczny sprzęt na hoście. Hiperwizor KVM udostępnia parawirtualne urządzenie blokowe, które jest oparte na pliku, wolumenie logicznym lub zbiorze danych. Ten nośnik może znajdować się na dyskach NVMe, o czym system gościa nie musi wiedzieć. Nazwa opisuje warstwę wirtualizacji. Jedynie pomiar opóźnień pozwala określić charakterystykę nośnika.
Czy rotational 0 dowodzi posiadania dysku NVMe?
Nie. Wartość /sys/block/<dev>/queue/rotational równa 0 oznacza jedynie, że jądro nie traktuje urządzenia jako dysku talerzowego. Wewnątrz VPS jest to ustawienie, a nie wynik pomiaru. Sterownik virtio-blk nie posiada bitu funkcji określającego typ nośnika, a jądro Linux raportuje 1 dla każdego dysku, chyba że zostanie to nadpisane. Wartość 0 zazwyczaj oznacza ręczną konfigurację. Nie pozwala ona odróżnić NVMe od SATA SSD ani pamięci flash od wolumenu sieciowego. Wartość 1 wewnątrz VPS również nie dowodzi istnienia dysku twardego, dlatego należy kierować się opóźnieniami zmierzonymi przez fio, a nie tą flagą.
Dlaczego nvme list jest puste na moim VPS?
Ponieważ kontroler NVMe nie jest udostępniony systemowi gościa. Zarówno nvme list, jak i lspci odczytują dane widoczne dla maszyny wirtualnej, a dyski virtio-blk lub virtio-scsi nie prezentują kontrolera NVMe do enumeracji. Pusta tabela jest standardowym wynikiem w większości planów VPS i nie stanowi dowodu na brak dysków NVMe na hoście. Zainstaluj nvme-cli za pomocą sudo apt install -y nvme-cli i spodziewaj się pustej tabeli, chyba że kontroler został przekazany bezpośrednio (passthrough).
Jaki wynik fio kwalifikuje pamięć jako klasę NVMe?
Przy głębokości kolejki 1 (queue depth 1), losowym odczycie 4k i --direct=1, średnie opóźnienie zakończenia operacji w okolicach 110 mikrosekund odpowiada klasie NVMe, co przekłada się na około 9,000 IOPS. Wynik w okolicach 320 mikrosekund wskazuje na dysk SATA SSD, a około 900 mikrosekund na pamięć masową podłączoną przez sieć, gdzie odczyty niebędące w pamięci podręcznej hosta wymagają przejścia przez sieć, lub na wolumen ograniczany przez hosta (throttling). Są to typowe zakresy dla sierpnia 2026 roku, dlatego należy porównywać rzędy wielkości, a nie dokładne liczby, oraz powtórzyć test o różnych porach przed wyciągnięciem wniosków.