Як перевірити, чи VPS справді використовує NVMe
Перевірте NVMe всередині Linux VPS через lsblk, sysfs, nvme-cli та обмежений запуск fio. Дізнайтеся, чому virtio приховує фізичний диск.
Перевірка диска NVMe у Linux за чотири кроки
Щоб перевірити диск NVMe на Linux VPS, послідовно виконайте чотири перевірки: lsblk для визначення імені пристрою, прапорець rotational у sysfs для перевірки обертового носія, nvme list для підтвердження справжнього контролера NVMe та короткий запуск fio для отримання єдиного показника, який хост не може підробити. Перші три перевірки займають приблизно секунду кожна. Остання дає остаточну відповідь, оскільки на більшості платформ VPS гіпервізор приховує фізичний диск від гостьової системи.
NVMe (non-volatile memory express) — це протокол, за яким флешсховище обмінюється даними через лінії PCIe (peripheral component interconnect express). Він замінив стек SATA та AHCI, розроблений для обертових дисків, і забезпечує високу швидкість, оскільки усуває вузьке місце в черзі між CPU та флешсховищем. Усередині віртуальної машини ви рідко працюєте безпосередньо з цим протоколом. Ви працюєте з віртуальним диском, який хост підготував для вас, тому ім’я пристрою у гостьовій системі описує драйвер, а не фізичний носій у серверній стійці.
Крок 1: що показує lsblk?
lsblk читає список блокових пристроїв ядра. Прапорець -d приховує розділи, тому ви бачите один рядок на кожен диск.
lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODELKVM VPS зазвичай відповідає так:
NAME ROTA SIZE TYPE TRAN MODEL
vda 0 80G diskТри схеми іменування охоплюють майже всі Linux-сервери:
nvme0n1— це namespace 1 на контролері NVMe 0. Гостьова система використовує пристрій NVMe, фізичний або емуляований.sda— це рівень SCSI. Сюди потрапляють фізичні диски SATA і SAS, а також драйвер virtio-scsi.vda— це virtio-blk, паравіртуальний драйвер блокових пристроїв, який більшість хостів KVM використовує за замовчуванням.
У стовпці TRAN (транспорт) для пристрою NVMe відображається nvme, а для диска SATA, який гостьова система бачить безпосередньо, — sata. У virtio-blk це поле зазвичай порожнє, оскільки гостьова система не має фізичного транспорту, про який можна повідомити. MODEL з тієї самої причини також порожнє. Порожній рядок моделі на VPS є нормальним і нічого не повідомляє про апаратне забезпечення.
Крок 2: виключіть використання диска з рухомими пластинами
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"Файл rotational містить 1, коли ядро вважає, що пристрій має рухомі пластини, і 0 — для всіх інших пристроїв. На фізичному сервері це значення надходить від накопичувача. У virtio-blk воно надходить від біта функцій, який встановлює хост, тому значення 0 виключає звичайний жорсткий диск, але саме по собі нічого більше не доводить. Усе одно перевірте його: значення 1 для тарифного плану, заявленого як сховище на твердотільних накопичувачах, є прямою суперечністю. Це єдиний знімок екрана, який служба підтримки не зможе спростувати.
readlink -f розкриває символічне посилання в sysfs і виводить шину, до якої підключено пристрій:
/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vdaСлово virtio у цьому шляху є відповіддю для цього кроку. Пристрій NVMe має шлях, що містить nvme, наприклад /sys/devices/pci0000:00/0000:01:00.0/nvme/nvme0/nvme0n1, а безпосередньо підключений диск ATA — шлях, що містить ata1. Це той самий факт, який виводить lsblk, але отриманий із ядра, а не з форматованого стовпця. Це корисно, коли поле TRAN порожнє.
Крок 3: перевірте nvme-cli і шину 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 виводить по одному рядку для кожного namespace із серійним номером контролера, рядком моделі та версією firmware. Порожня таблиця означає, що вашій гостьовій системі не доступний жоден NVMe-пристрій. Якщо lspci не виводить відповідного рядка, це підтверджує те саме з іншого боку: віртуальна шина PCI, доступна гостьовій системі, не містить NVMe-контролера. Обидва порожні результати є нормальною ситуацією на virtio VPS. Жоден із них не доводить, що на хості немає NVMe-дисків.
Якщо namespace відображається, nvme-cli дає змогу отримати додаткові дані. sudo nvme id-ctrl /dev/nvme0 виводить ідентифікаційні дані контролера, а sudo nvme smart-log /dev/nvme0n1 — температуру, кількість годин роботи після ввімкнення та відсоток використаного ресурсу запису від номінальної витривалості. Виконуйте ці команди лише тоді, коли nvme list справді вивела пристрій, оскільки обом командам потрібен реальний вузол /dev/nvme* для відкриття.
Чому на справжньому NVMe-хості все одно відображається /dev/vda
Гіпервізор визначає, яку модель пристрою бачить гостьова система. Цей вибір не залежить від фізичного носія під нею. Найпоширеніші три варіанти такі.
- virtio-blk або virtio-scsi поверх файлу, логічного тому чи набору даних ZFS, що зберігається на NVMe-накопичувачах. Ви бачите
vdaабоsda. Сховище використовує NVMe. Гостьова система не може про це дізнатися. - Емульований контролер NVMe перед будь-яким сховищем. Ви бачите
nvme0n1, навіть якщо дані записуються на SATA-масив або мережевий том за два ряди стійок. - PCIe passthrough, коли хост передає фізичний контролер одній гостьовій системі. Ви бачите справжній
nvme0n1зі справжнім рядком моделі. На спільних VPS-планах це трапляється рідко, оскільки в такому разі карта виділяється одному клієнту.
Отже, назва пристрою може ввести в оману в обох напрямках. Крім того, хост може розмістити між вашими операціями запису та флеш-пам’яттю кеш write-back, рівень RAID або реплікований мережевий том. Кожен із цих компонентів змінює отриману продуктивність, не змінюючи жодного імені в /sys. Тому назва — це лише початкова точка перевірки, а не остаточний висновок. Якщо ви ще обираєте план, у матеріалі про різницю між сховищами NVMe та SATA SSD пояснено, за що саме ви платите на кожному рівні.
Чесний тест — це затримка, тому виміряйте її
fio (flexible I/O tester) виконує реальні операції читання з реального файлу та показує, скільки часу тривала кожна з них. Тут потрібне мале довільне читання, оскільки воно показує час обміну з носієм і не може обслуговуватися механізмом попереднього читання.
Спочатку створіть тестовий файл і перевірте, чи підтримує ця файлова система неблоковане введення-виведення. --direct=1 відкриває файл із параметром O_DIRECT, який обходить кеш сторінок. Без нього ви вимірюєте власну RAM і отримуєте показники, яких не може забезпечити жоден диск.
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"Якщо було виведено повідомлення про відмову, вибраний шлях розташований у файловій системі без підтримки O_DIRECT. Так можуть працювати overlay-файлові системи контейнерів і деякі мережеві файлові системи. Виберіть каталог у кореневій файловій системі VPS і повторіть спробу. Якщо було виведено повідомлення про успішне виконання, запустіть вимірювання:
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Тривалість і обсяг тесту навмисно обмежені: одне завдання, глибина черги 1, двадцять секунд і 256 MB даних. Тест не заповнить ваш диск і не призведе до позначення сервера як джерела зловживань. Глибина черги 1 також є коректним налаштуванням для цього вимірювання, оскільки глибокі черги дають змогу повільному пристрою приховувати затримку завдяки паралельному виконанню, хоча сама затримка залишається високою.
Читання виводу fio
Важливі два рядки. Рядок підсумку має вигляд read: IOPS=9012, BW=35.2MiB/s, а під ним fio виводить блок clat. clat — це затримка завершення: час між передаванням fio запиту на читання та поверненням даних ядром. Прочитайте значення avg, а потім значення перцентиля 99.00th у списку clat percentiles. Середнє значення показує клас сховища. 99-й перцентиль показує, як часто сусідній процес на тому самому хості змушує вас чекати.
Fio виводить затримку в мікросекундах, якщо значення невеликі, і переходить до мілісекунд, якщо вони більші. Перед порівнянням обов’язково перевірте одиницю вимірювання в попередньому рядку.
Які показники відрізняють клас NVMe від класу SATA
Наведені нижче значення є типовими опублікованими показниками для довільного читання 4k в одному завданні за queue depth 1. Їх зібрано з документації виробників і community benchmarks станом на August 2026. Це діапазони для порівняння, а не вимірювання на вашому сервері.
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"
}
]Локальний том NVMe виконує одну операцію довільного читання 4k приблизно за 110 мікросекунд і досягає близько 9,000 IOPS за queue depth 1. Локальний SSD SATA має показники близько 320 мікросекунд і 3,100 IOPS. Мережеве block storage показує приблизно 900 мікросекунд і 1,100 IOPS, оскільки кожне окреме читання проходить через мережевий перехід до доступу до flash.
За queue depth 1 ці два стовпці описують один і той самий факт двома способами: коли одночасно виконується одне читання, пропускна здатність дорівнює одиниці, поділеній на затримку. Якщо ваше середнє значення ближче до 110, ніж до 320 мікросекунд, ви використовуєте сховище класу NVMe, незалежно від того, як lsblk назвав цей пристрій. Якщо воно ближче до 900 мікросекунд, у ланцюжку є щось повільніше за локальну flash-пам’ять, а слово NVMe на сторінці замовлення описує диски на стороні хоста, а не ваш том.
Запускайте тест кілька разів, перш ніж звертатися до підтримки
Один запуск — це приклад, а не результат. VPS використовує спільні диски, тому активний сусідній клієнт може подвоїти затримку на десять хвилин, а потім зникнути. Деякі платформи також надають burst credits, через які перші хвилини будь-якого тесту виглядають чудово. Виконайте ту саму команду три або чотири рази в різні години доби та порівняйте найгірший результат, а не найкращий. Один невдалий запуск може бути випадковим коливанням. Повторювана закономірність — це несправність, щодо якої варто створити звернення в підтримку. Таке звернення буде переконливішим із трьома результатами fio із часовими мітками. Для ширшої оцінки, яка охоплює CPU і мережу, а також диск, повний тест продуктивності VPS використовує такий самий підхід для інших підсистем.
Що робити з результатом
Якщо затримка відповідає діапазону NVMe, не переймайтеся назвою пристрою та переходьте далі. vda — це не погіршення характеристик. Це найшвидший драйвер віртуального диска, який пропонує більшість хостів, і саме його слід використовувати.
Якщо затримка відповідає діапазону мережевого сховища на тарифі, заявленому як локальний NVMe, у вас є конкретна відтворювана підстава для звернення: точна команда fio, середня затримка завершення операцій і час виконання тестів. Це підстава для звернення до служби підтримки, а не для суперечки на форумі. Перед надсиланням звернення переконайтеся, що диск не заповнений і не має значної фрагментації, а під час тестування система не виконує інтенсивний запис.
Виконайте цю перевірку в день розгортання сервера, а не тоді, коли він почне працювати повільно. Так ви матимете базовий показник для подальшого порівняння. Це природний етап перших десяти хвилин на новому VPS, поряд із налаштуванням firewall і SSH-ключів. Якщо різниця між рівнями сховища все ще незрозуміла, у матеріалі що насправді дає SSD VPS описано основи цієї теми.
FAQ
Чому lsblk показує /dev/vda, якщо на хості заявлено NVMe?
Тому що vda називає драйвер virtio-blk у гостьовій системі, а не апаратне забезпечення хоста. Гіпервізор KVM надає паравіртуальний блочний пристрій, основою якого може бути файл, логічний том або dataset. Це сховище може розміщуватися на NVMe-накопичувачах, але гостьова система про це не дізнається. Назва описує рівень віртуалізації. Лише вимірювання затримки дає змогу оцінити тип носія.
Чи доводить rotational 0, що я маю NVMe-диск?
Ні. /sys/block/<dev>/queue/rotational зі значенням 0 означає, що ядро не вважає пристрій таким, що має магнітні пластини, які обертаються. У разі virtio це значення встановлюється бітом можливостей, який вибирає хост. Воно виключає звичайний жорсткий диск. Але не дає змоги відрізнити NVMe від SATA SSD і локальну флеш-пам’ять від мережевого тому. На 1 все одно варто реагувати, оскільки він суперечить заявленому використанню твердотільного сховища.
Чому nvme list повертає порожній список на моєму VPS?
Тому що гостьовій системі не надано доступу до контролера NVMe. nvme list і lspci зчитують інформацію про пристрої, доступні віртуальній машині. Диск virtio-blk або virtio-scsi не надає контролера NVMe для переліку. Порожня таблиця є нормальною ситуацією для більшості тарифів VPS і не доводить, що на хості немає NVMe-накопичувачів. Встановіть nvme-cli за допомогою sudo apt install -y nvme-cli і очікуйте порожню таблицю, якщо контролер не було передано безпосередньо у віртуальну машину.
Який результат fio відповідає сховищу класу NVMe?
За глибини черги 1, випадкового читання блоками 4k і --direct=1 середня затримка завершення близько 110 мікросекунд відповідає класу NVMe, а з неї випливає приблизно 9,000 IOPS. Значення близько 320 мікросекунд вказує на SATA SSD, а близько 900 мікросекунд — на мережеве сховище, де кожне читання проходить через мережевий сегмент. Це типові опубліковані діапазони для August 2026, тому порівнюйте порядки величин, а не точні значення. Перед висновками повторіть тест у різні години.