Как проверить, что VPS диск действительно NVMe в Linux
Узнайте, как подтвердить тип накопителя на виртуальном сервере. Используйте команды lsblk, sysfs, nvme-cli и тест fio, чтобы выявить подмену диска через драйверы virtio.
Проверка NVMe-диска в Linux за четыре шага
Чтобы проверить NVMe-диск на VPS с Linux, выполните четыре проверки по порядку: 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 1 80G disk virtioТри схемы именования охватывают почти все Linux-серверы:
nvme0n1— это пространство имен 1 на NVMe-контроллере 0. Ваша гостевая система работает с NVMe-устройством, реальным или эмулируемым.sda— это уровень SCSI. Сюда попадают реальные SATA- и SAS-диски, а также устройства, использующие драйвер virtio-scsi.vda— это virtio-blk, паравиртуальный блочный драйвер, который большинство KVM-хостов используют по умолчанию.
Столбец TRAN (транспорт) показывает nvme для NVMe-устройства и sata для SATA-диска, который гостевая система видит напрямую. При использовании virtio-blk текущие версии util-linux выводят virtio, что lsblk определяет по имени устройства vd, а более старые версии оставляют это поле пустым. В любом случае, для гостевой системы физический транспорт не определяется. 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 оно берется «из ниоткуда»: спецификация virtio-blk не содержит бита признака типа носителя или скорости вращения, поэтому драйвер Linux virtio-blk помечает каждый диск как вращающийся. В связи с этим vda обычно содержит 1 даже на хосте с полностью флеш-памятью, если только кто-то принудительно не установил 0 с помощью правила udev. На контроллере virtio-scsi sda значение соответствует тому, что было настроено на хосте. Таким образом, внутри VPS этот флаг не позволяет однозначно определить тип диска, и 1 сам по себе не является основанием для обращения в службу поддержки. Ответ на этот вопрос дает приведенный ниже тест fio.
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 выводит по одной строке для каждого пространства имен, включая серийный номер контроллера, строку модели и версию прошивки. Пустая таблица означает, что гостевой системе не предоставлено ни одного устройства NVMe. lspci, не выводящая ни одной соответствующей строки, подтверждает это с другой стороны: виртуальная шина PCI, доступная гостевой системе, не содержит контроллеров NVMe. Оба пустых результата являются нормальным поведением для VPS на базе virtio и не свидетельствуют об отсутствии накопителей NVMe на хосте.
Если пространство имен отображается, 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 dataset, которые размещены на NVMe-накопителях. Вы видите
vdaилиsda. Хранилище является NVMe, но гостевая система не может этого определить. - Эмулируемый NVMe-контроллер перед любым типом хранилища. Вы видите
nvme0n1, даже если данные записываются на SATA-массив или сетевой том, расположенный в другой стойке. - PCIe passthrough, при котором хост передает физический контроллер одной гостевой системе. Вы видите реальное устройство
nvme0n1с реальной строкой модели. Это редко встречается в общих VPS-планах, так как контроллер в этом случае закрепляется за одним клиентом.
Таким образом, имя устройства может вводить в заблуждение в обоих направлениях. Хуже того, хост может добавить кэш с обратной записью, RAID-уровень или реплицируемый сетевой том между вашими операциями записи и флеш-памятью. Каждый из этих слоев меняет производительность, не меняя при этом ни одного имени в /sys. Именно поэтому имя устройства — это лишь отправная точка, а не конечный результат диагностики. Если вы еще выбираете тарифный план, разница между хранилищами NVMe и SATA SSD объясняет, за что на самом деле стоит платить в каждом сегменте.
Честный тест — это измерение задержки
fio (flexible I/O tester) выполняет реальные операции чтения из реального файла и фиксирует время выполнения каждой из них. Для этой задачи лучше всего подходят небольшие случайные операции чтения, так как они показывают реальное время обращения к носителю и не могут быть ускорены за счет упреждающего чтения (read-ahead).
Сначала создайте тестовый файл и убедитесь, что файловая система поддерживает небуферизированный ввод-вывод. --direct=1 открывает файл с флагом O_DIRECT, который позволяет обойти page cache. Без этого флага вы будете измерять скорость своей оперативной памяти, что даст результаты, недостижимые для любого диска.
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 — это задержка завершения: время с момента отправки запроса на чтение до момента возврата данных ядром. Прочитайте значение avg, а затем посмотрите на 99.00th-й процентиль в списке clat percentiles. Среднее значение указывает на класс накопителя. 99-й процентиль показывает, насколько медленными были самые медленные 1 процент операций чтения; именно здесь обычно в первую очередь проявляется конкуренция за ресурсы на общем хосте.
Fio выводит задержку в микросекундах, если значения малы, и переключается на миллисекунды, если они велики. Проверяйте единицы измерения в строке перед тем, как сравнивать какие-либо показатели.
Какие показатели отличают класс NVMe от класса SATA
Приведенные ниже цифры — это типичные опубликованные значения для случайного чтения блоков 4k в одном потоке при глубине очереди 1. Данные собраны из документации производителей и сообщества по состоянию на август 2026 года. Это ориентиры для сравнения, а не результаты измерений на вашем сервере.
Данные, на которых построен график
[
{
"label": "Local NVMe",
"avg_latency_us": 110
},
{
"label": "Local SATA SSD",
"avg_latency_us": 320
},
{
"label": "Network block storage",
"avg_latency_us": 900
}
]Данные, на которых построен график
[
{
"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 при глубине очереди 1. Локальный SSD SATA находится в районе 320 микросекунд и 3,100 IOPS. Сетевое блочное хранилище показывает результат около 900 микросекунд и 1,100 IOPS, так как запрос, не попавший в кэш на стороне хоста, должен пройти через сеть, прежде чем достигнет флеш-памяти.
При глубине очереди 1 эти два столбца фактически говорят об одном и том же: при выполнении одного запроса за раз пропускная способность примерно равна единице, деленной на задержку, с небольшим снижением из-за накладных расходов на каждый запрос. Если ваше среднее значение ближе к 110, чем к 320 микросекунд, вы используете хранилище класса NVMe, независимо от того, как lsblk решило назвать это устройство. Если значение ближе к 900 микросекунд, значит, либо на пути запроса находится что-то более медленное, чем локальная флеш-память, либо хост ограничивает IOPS вашего тома, что могут делать гипервизоры вроде QEMU вне зависимости от типа накопителя. В обоих случаях ваш том не обеспечивает задержку класса NVMe, что бы ни было указано на странице заказа о дисках хоста.
Запустите тест несколько раз, прежде чем жаловаться
Один запуск — это лишь выборка, а не результат. VPS использует общие диски, поэтому сосед по серверу с высокой нагрузкой может увеличить задержку в два раза на десять минут, а затем исчезнуть. Некоторые платформы также предоставляют burst-кредиты, из-за которых первые минуты любого теста выглядят идеально. Запустите одну и ту же команду три или четыре раза в разное время суток и сравнивайте худший результат, а не лучший. Один неудачный запуск — это случайность. Повторяющаяся закономерность — это неисправность, заслуживающая обращения в поддержку, причем заявка будет убедительнее с приложенными тремя результатами fio с отметками времени. Для получения более полной картины, охватывающей CPU и сеть наряду с диском, полный бенчмарк VPS требует соблюдения той же дисциплины и для других подсистем.
Что делать с полученным ответом
Если задержка находится в диапазоне NVMe, перестаньте беспокоиться об имени устройства и переходите к следующему этапу. vda — это не ухудшение характеристик. Это самый быстрый драйвер виртуального диска, который предлагают большинство хостов, и именно его вам следует использовать.
Если задержка находится в диапазоне сетевого хранилища, хотя тариф заявлен как локальный NVMe, у вас есть конкретный, воспроизводимый аргумент: точная команда fio, средняя задержка завершения операций и время проведения тестов. Это повод для обращения в службу поддержки, а не для споров на форуме. Перед отправкой запроса убедитесь, что диск не заполнен и не сильно фрагментирован, а также проверьте, что во время тестирования на сервере нет других интенсивных операций записи.
Выполняйте эту проверку в день развертывания сервера, а не тогда, когда возникнет ощущение медленной работы, чтобы у вас были базовые показатели для сравнения в будущем. Это логично вписывается в первые десять минут работы с новым VPS, наряду с настройкой фаервола и SSH-ключей. Если разница между уровнями хранилищ все еще кажется неясной, в статье что на самом деле дает SSD VPS подробно разобраны основы этого вопроса.
FAQ
Почему lsblk показывает /dev/vda, хотя хост заявляет об использовании NVMe?
Потому что vda указывает на драйвер virtio-blk в вашей гостевой системе, а не на оборудование хоста. Гипервизор KVM предоставляет паравиртуализированное блочное устройство, которое опирается на файл, логический том или датасет. Это базовое хранилище может располагаться на NVMe-дисках, но гостевая система об этом не узнает. Имя устройства описывает уровень виртуализации. Только измерение задержки (latency) позволяет определить тип носителя.
Означает ли rotational 0, что у меня диск NVMe?
Нет. Значение /sys/block/<dev>/queue/rotational, равное 0, означает лишь то, что ядро не считает устройство диском с вращающимися пластинами, но внутри VPS это программная настройка, а не результат измерения. У virtio-blk нет бита признака типа носителя, и драйвер Linux virtio-blk сообщает 1 для любого диска, если только это значение не было переопределено вручную. Поэтому 0 в этом поле обычно означает, что кто-то установил его самостоятельно. Это значение не позволяет отличить NVMe от SATA SSD, а также локальную флеш-память от сетевого тома. Значение 1 внутри VPS также не доказывает наличие жесткого диска, поэтому ориентируйтесь на задержки, полученные через fio, а не на этот флаг.
Почему список nvme пуст на моем VPS?
Потому что гостевой системе не предоставлен доступ к NVMe-контроллеру. Команды nvme list и lspci считывают информацию о том, что «видит» виртуальная машина, а диски virtio-blk или virtio-scsi не предоставляют NVMe-контроллер для перечисления. Пустая таблица — это нормальный результат для большинства тарифных планов VPS, и это не является доказательством отсутствия NVMe-дисков на хосте. Установите nvme-cli с помощью sudo apt install -y nvme-cli и ожидайте пустую таблицу, если только контроллер не был проброшен (passthrough) напрямую.
Какой результат fio соответствует хранилищу класса NVMe?
При глубине очереди 1 (queue depth 1), случайном чтении блоками 4k и --direct=1, средняя задержка завершения операции около 110 микросекунд соответствует классу NVMe, что примерно дает 9,000 IOPS. Значение около 320 микросекунд указывает на SATA SSD, а около 900 микросекунд — на сетевое хранилище (где чтение при промахе кэша хоста проходит через сетевой узел) или на том, который ограничивается хостом по производительности. Это типичные диапазоны на август 2026 года, поэтому сравнивайте порядки величин, а не точные цифры, и повторяйте тесты в разное время суток, прежде чем делать выводы.