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 określonej kolejności: lsblk w celu ustalenia nazwy urządzenia, flagę rotational w sysfs dla nośników talerzowych, nvme list dla rzeczywistego kontrolera NVMe oraz krótki test fio dla jedynej wartości, 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ół komunikacji pamięci flash przez magistralę PCIe (peripheral component interconnect express). Zastąpił on ścieżkę SATA i AHCI, zaprojektowaną dla dysków talerzowych, i zapewnia wysoką wydajność poprzez usunięcie wąskiego gardła w kolejkowaniu między procesorem a pamięcią flash. Wewnątrz maszyny wirtualnej protokół ten jest rzadko używany bezpośrednio. System komunikuje się z wirtualnym dyskiem przygotowanym przez hosta, dlatego nazwa urządzenia w systemie gościa opisuje sterownik, a nie nośnik fizyczny 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 odpowiada w następujący sposób:
NAME ROTA SIZE TYPE TRAN MODEL
vda 0 80G diskTrzy 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 nvme dla urządzenia NVMe oraz sata dla dysku SATA widocznego bezpośrednio dla gościa. W przypadku virtio-blk pole to jest zazwyczaj puste, ponieważ dla gościa nie istnieje fizyczny transport, który mógłby zostać zgłoszony. Pole MODEL jest 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 przechowuje 1, gdy jądro systemu rozpoznaje urządzenie jako dysk talerzowy, oraz 0 w każdym innym przypadku. Na fizycznym sprzęcie wartość ta pochodzi bezpośrednio z napędu. W przypadku 0 wartość ta wynika z bitu funkcji ustawionego przez hosta, więc 0 wyklucza zwykły dysk twardy, ale nie dostarcza dalszych informacji. Warto jednak sprawdzić ten plik: 1 w urządzeniu sprzedawanym jako nośnik półprzewodnikowy jest jawną sprzecznością i stanowi dowód, z którym dział wsparcia technicznego nie może polemizować.
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ź na tym etapie. 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ą dwie linie. Linia podsumowania wygląda jak read: IOPS=9012, BW=35.2MiB/s, a pod nią 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ę nośnika. 99. percentyl informuje o tym, jak często sąsiednie procesy na tym samym hoście powodują opóźnienia.
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 danej linii.
Jakie liczby odróżniają klasę NVMe od klasy SATA
Poniższe wartości to typowe dane publikowane 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.
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"
}
]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ż każdy pojedynczy odczyt musi przejść przez sieć, zanim nastąpi dostęp do pamięci flash.
Przy głębokości kolejki 1 te dwie kolumny przedstawiają ten sam fakt: jeden odczyt w danym czasie oznacza, że przepustowość to po prostu jeden podzielony przez opóźnienie. Jeśli średnia wartość jest bliższa 110 niż 320 mikrosekund, korzystasz z pamięci klasy NVMe, niezależnie od tego, jak lsblk zaklasyfikowało urządzenie. Jeśli wartość jest bliższa 900 mikrosekund, w ścieżce danych znajduje się coś wolniejszego niż lokalna pamięć flash, a określenie NVMe w specyfikacji odnosi się do dysków hosta, a nie do Twojego wolumenu.
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 obsługuje 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 wspierane przez plik, wolumin logiczny lub zbiór 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ć charakter nośnika.
Czy rotational 0 dowodzi posiadania dysku NVMe?
Nie. Wartość /sys/block/<dev>/queue/rotational równa 0 oznacza jedynie, że jądro systemu nie rozpoznaje urządzenia jako talerzowego. W przypadku virtio wartość ta jest ustawiana przez bit funkcji wybrany przez hosta. Wyklucza to jedynie klasyczny dysk twardy. Nie pozwala jednak odróżnić NVMe od dysku SATA SSD ani pamięci flash od woluminu sieciowego. Wartość 1 nadal wymaga weryfikacji, ponieważ jest sprzeczna z założeniami dotyczącymi wydajności pamięci typu solid state.
Dlaczego nvme list jest puste na moim VPS?
Ponieważ kontroler NVMe nie jest udostępniony systemowi gościa. Polecenia nvme list oraz lspci odczytują jedynie urządzenia widoczne dla maszyny wirtualnej, a dyski virtio-blk lub virtio-scsi nie prezentują kontrolera NVMe do wyliczenia. Pusta tabela jest standardowym wynikiem w większości planów VPS i nie stanowi dowodu na brak dysków NVMe na hoście. Instalacja nvme-cli za pomocą sudo apt install -y nvme-cli zakończy się wyświetleniem 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 oraz --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. Wartość w okolicach 320 mikrosekund wskazuje na dysk SATA SSD, natomiast około 900 mikrosekund sugeruje pamięć sieciową, gdzie każdy odczyt wymaga przejścia przez sieć. Są to typowe zakresy publikowane na sierpień 2026, dlatego należy porównywać rzędy wielkości, a nie dokładne liczby, oraz powtórzyć test w różnych godzinach przed wyciągnięciem wniosków.