Как проверить, что 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 0 80G diskТри шаблона именования охватывают почти каждый Linux-сервер:
nvme0n1— это пространство имен 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 выводит по одной строке для каждого пространства имен, включая серийный номер контроллера, строку модели и версию прошивки. Пустая таблица означает, что гостевой системе не предоставлено ни одного устройства 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-й процентиль показывает, как часто сосед по хосту заставляет вас ждать.
Fio выводит задержку в микросекундах, если значения малы, и переключается на миллисекунды, если они велики. Проверяйте единицы измерения в строке перед тем, как сравнивать какие-либо показатели.
Какие показатели отличают класс NVMe от класса SATA
Приведенные ниже цифры являются типичными опубликованными значениями для случайного чтения блоков 4k в одном потоке при глубине очереди 1. Данные собраны из документации производителей и бенчмарков сообщества по состоянию на август 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 при глубине очереди 1. Локальный SSD SATA находится в районе 320 микросекунд и 3,100 IOPS. Сетевое блочное хранилище показывает результат около 900 микросекунд и 1,100 IOPS, так как каждый запрос на чтение проходит через сетевой узел, прежде чем будет задействована флеш-память.
При глубине очереди 1 эти два столбца представляют собой один и тот же факт, выраженный разными способами: при выполнении одного запроса за раз пропускная способность — это просто единица, деленная на задержку. Если ваше среднее значение ближе к 110, чем к 320 микросекунд, вы используете хранилище класса NVMe, независимо от того, как lsblk решило классифицировать устройство. Если значение ближе к 900 микросекунд, значит, в пути прохождения данных находится что-то более медленное, чем локальная флеш-память, а слово NVMe в счете на оплату описывает диски хоста, а не ваш том.
Запустите тест несколько раз, прежде чем жаловаться
Один запуск — это лишь выборка, а не результат. VPS использует общие диски, поэтому сосед по серверу с высокой нагрузкой может увеличить задержку в два раза на десять минут, а затем исчезнуть. Некоторые платформы также предоставляют burst-кредиты, из-за которых первые минуты любого теста выглядят идеально. Запустите одну и ту же команду три или четыре раза в разное время суток и сравнивайте худший результат, а не лучший. Один неудачный запуск — это случайность. Повторяющаяся закономерность — это неисправность, заслуживающая обращения в поддержку, причем заявка будет убедительнее с приложенными тремя результатами fio с отметками времени. Для получения более полной картины, охватывающей CPU и сеть наряду с диском, полный бенчмарк VPS требует соблюдения той же дисциплины и для других подсистем.
Что делать с полученным ответом
Если задержка находится в диапазоне NVMe, перестаньте беспокоиться об имени устройства и переходите к следующему этапу. vda — это не ухудшение характеристик. Это самый быстрый драйвер виртуального диска, который предлагают большинство хостов, и именно его вам следует использовать.
Если задержка находится в диапазоне сетевого хранилища, хотя тариф заявлен как локальный NVMe, у вас есть конкретный, воспроизводимый аргумент: точная команда fio, средняя задержка завершения операций и время проведения тестов. Это повод для обращения в службу поддержки, а не для споров на форуме. Перед отправкой запроса убедитесь, что диск не заполнен и не сильно фрагментирован, а также проверьте, что во время тестирования на сервере нет других интенсивных операций записи.
Выполняйте эту проверку в день развертывания сервера, а не тогда, когда возникнет ощущение медленной работы, чтобы у вас были базовые показатели для сравнения в будущем. Это логично вписывается в первые десять минут работы с новым VPS, наряду с настройкой фаервола и SSH-ключей. Если разница между уровнями хранилищ все еще кажется неясной, в статье что на самом деле дает SSD VPS подробно разобраны основы этого вопроса.
FAQ
Почему lsblk показывает /dev/vda, если хост использует NVMe?
Потому что vda указывает на драйвер virtio-blk в вашей гостевой системе, а не на аппаратное обеспечение хоста. Гипервизор KVM предоставляет паравиртуализированное блочное устройство, которое опирается на файл, логический том или набор данных. Это базовое хранилище может находиться на NVMe-дисках, но гостевая система об этом не знает. Имя устройства описывает уровень виртуализации. Только измерение задержки позволяет определить тип носителя.
Означает ли rotational 0, что у меня NVMe-диск?
Нет. Значение 0 в /sys/block/<dev>/queue/rotational означает лишь то, что ядро не считает устройство вращающимся диском. В случае с 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 микросекунд — на сетевое хранилище, где каждое чтение проходит через сетевой узел. Это типичные диапазоны на август 2026 года, поэтому сравнивайте порядки величин, а не точные цифры, и повторяйте замеры в разное время суток, прежде чем делать выводы.