SSD Nodes Learn 🎉 VPS $4.99/月起
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-07

如何在 Linux VPS 中确认磁盘是否为 NVMe

主机声称使用 NVMe,但 virtio 可能隐藏真实硬件。使用 lsblk、sysfs、nvme-cli 和限时 fio 延迟测试,从客户机内核实磁盘类型。

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, August 3, 2026.

在 Linux 上通过 4 个步骤验证 NVMe 磁盘

要在 Linux VPS 上验证 NVMe 磁盘,请依次执行 4 项检查:使用 lsblk 确认设备名称,检查 sysfs 中的 rotational 标志以判断是否为旋转介质,使用 nvme list 确认是否存在真实的 NVMe 控制器,再运行一次简短的 fio,获取主机无法伪造的唯一数据。前三项检查各需 1 秒。最后一项可以确定结果,因为在大多数 VPS 平台上,虚拟机管理程序会对客户机隐藏物理磁盘。

NVMe(非易失性内存快速协议)是闪存通过 PCIe(外围组件互连高速)通道进行通信的协议。它取代了为旋转磁盘设计的 SATA 和 AHCI 路径。它通过消除 CPU 与闪存之间的排队瓶颈来提高速度。在虚拟机中,您很少会直接使用该协议。您使用的是由主机为您组装的虚拟磁盘,因此客户机中的设备名称描述的是驱动程序,而不是机架中的实际介质。

第 1 步:lsblk 显示什么?

lsblk 读取内核中的块设备列表。-d 标志会隐藏分区,因此每个磁盘只显示一行。

lsblk -d -o NAME,ROTA,SIZE,TYPE,TRAN,MODEL

KVM VPS 通常会显示如下内容:

NAME ROTA  SIZE TYPE TRAN MODEL
vda     0   80G disk

以下 3 种命名模式几乎涵盖所有 Linux 服务器:

  • nvme0n1 表示 NVMe 控制器 0 上的命名空间 1。您的虚拟机使用的是 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 控制器。在 virtio VPS 上,这两项都为空是正常结果,不能据此判断主机没有 NVMe 驱动器。

如果确实显示了命名空间,nvme-cli 还能提供更多信息。sudo nvme id-ctrl /dev/nvme0 输出控制器标识信息,sudo nvme smart-log /dev/nvme0n1 输出温度、通电小时数以及已使用的额定写入耐久度百分比。只有在 nvme list 实际列出设备后才运行这些命令,因为这两个命令都需要打开真实的 /dev/nvme* 节点。

为什么真正使用 NVMe 的主机仍显示 /dev/vda

虚拟机监控程序决定来宾系统看到的设备模型,该选择与底层存储介质无关。常见的配置有三种。

  • 在 NVMe 硬盘上的文件、逻辑卷或 ZFS 数据集之上使用 virtio-blk 或 virtio-scsi。您会看到 vdasda。底层存储是 NVMe,但来宾系统无法得知这一点。
  • 在任意存储之前模拟 NVMe 控制器。您会看到 nvme0n1,即使数据实际写入 SATA 磁盘阵列,或写入相隔两个机架的网络卷。
  • 使用 PCIe 直通,将物理控制器直接分配给一个来宾系统。您会看到真实的 nvme0n1,以及真实的型号字符串。在共享 VPS 套餐中,这种配置很少见,因为该控制器会专用于一个客户。

因此,设备名称可能在两个方向上误导您。更复杂的是,主机可能会在您的写入请求与闪存之间加入写回缓存、RAID 层或复制网络卷。这些组件都会改变您获得的性能,但不会改变 /sys 中的任何名称。这就是为什么设备名称只是排查的起点,而不是终点。如果您仍在选择套餐,NVMe 与 SATA SSD 存储的区别可以说明每个层级的实际价值。

真正需要测量的是延迟

fio(flexible I/O tester)会针对真实文件执行实际读取,并报告每次读取所用的时间。这里应使用小块随机读取,因为它能暴露访问存储介质的往返延迟,并且无法由预读机制提供服务。

首先创建测试文件,并确认此文件系统支持非缓冲 I/O。--direct=1 使用 O_DIRECT 打开文件,从而绕过页缓存。不使用该选项时,测量到的是内存本身的性能,结果可能高于任何磁盘能够达到的速度。

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 个作业、队列深度为 1、运行 20 秒,并使用 256 MB 数据。它不会占满磁盘,也不会导致您因滥用资源而被标记。对于当前问题,队列深度为 1 也是符合实际的设置,因为较深的队列会让慢速设备借助并行处理隐藏高延迟。

读取 fio 输出

有两行需要关注。摘要行类似于 read: IOPS=9012, BW=35.2MiB/s,其下方是 fio 输出的 clat 块。clat 是完成延迟,即 fio 提交读取请求到内核返回数据之间的时间。读取 clat percentiles 列表中的 99.00th 百分位值,然后读取 avg 值。平均值反映存储类别。第 99 百分位值反映同一主机上的其他用户使你的请求等待的频率。

当延迟值较小时,fio 以微秒为单位输出;数值较大时则切换为毫秒。比较任何数值前,先检查该行使用的单位。

NVMe 类与 SATA 类由哪些数值区分

以下数值是队列深度为 1 时,单任务 4k 随机读取的典型公开数据,来自截至 August 2026 的厂商文档和社区基准测试。这些数值用于比较,不代表您的服务器上的实测结果。

ChartTypical 4k random read latency at queue depth 1, by storage class
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
  }
]
ChartTypical 4k random read IOPS at queue depth 1, by storage class
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 微秒,在队列深度为 1 时约达到 9,000 IOPS。本地 SATA SSD 的延迟约为 320 微秒,性能约为 3,100 IOPS。网络连接的块存储的延迟约为 900 微秒,性能约为 1,100 IOPS。这是因为每次读取都必须先经过一次网络跳转,之后才能访问闪存。

在队列深度为 1 时,这两列数据表达的是同一个事实:一次只处理一个读取请求,因此吞吐量就是延迟的倒数。如果您的平均延迟更接近 110 微秒,而不是 320 微秒,那么无论 lsblk 将该设备称为什么,它都属于 NVMe 级存储。如果延迟更接近 900 微秒,则说明路径中存在比本地闪存更慢的组件;订单页面中的 NVMe 描述的是主机上的驱动器,而不是您的存储卷。

运行多次后再提交问题

一次运行只是样本,不是结论。VPS 会共享磁盘资源,因此繁忙的邻居实例可能让延迟在 10 分钟内翻倍,随后恢复正常。有些平台还会提供突发性能额度,使任何测试开始后的前几分钟看起来都非常好。在一天的不同时段运行相同的命令 3 或 4 次,并比较最差结果,而不是最佳结果。一次异常结果可能只是暂时波动。持续出现的模式才是值得提交支持工单的故障;附上 3 份带时间戳的 fio 输出,也更有助于工单处理。如需同时评估 CPU、网络和磁盘的整体性能,请参阅完整的 VPS 基准测试,它会对其他子系统采用相同的方法。

如何处理测试结果

如果延迟处于 NVMe 范围内,就不要再纠结设备名称,继续进行后续配置。vda 并不是降级选项。它是大多数主机能提供的速度最快的虚拟磁盘驱动,也是您需要使用的驱动。

如果您购买的是标称本地 NVMe 的方案,但延迟处于网络存储范围内,那么您已经有了一个具体且可复现的问题依据:完整的 fio 命令、平均完成延迟,以及执行测试的时间。这应提交为支持工单,而不是在论坛上争论。提交前,请确认磁盘不是仅仅因为已满或严重碎片化导致性能下降,并确认测试期间没有其他任务在该服务器上持续进行大量写入。

请在创建服务器当天运行此检查,而不是等到感觉速度变慢时再运行。这样您可以建立基线,供日后比较。它很适合放在新 VPS 的前十分钟配置中,与设置防火墙和 SSH 密钥一并完成。如果您仍不清楚存储层级之间的区别,请参阅SSD VPS 实际能提供什么,其中介绍了本节内容所依赖的基础知识。

FAQ

为什么 lsblk 显示 /dev/vda,而主机标称使用 NVMe?

因为 vda 表示客户机中的 virtio-blk 驱动,而不是主机上的硬件。KVM 虚拟机管理程序会向客户机提供半虚拟化块设备,其后端可以是文件、逻辑卷或数据集。这些后端存储可以位于 NVMe 驱动器上,而客户机完全不会获知。该名称描述的是虚拟化层。只有延迟测量结果能够说明存储介质。

rotational 0 是否能证明我使用的是 NVMe 磁盘?

不能。/sys/block/<dev>/queue/rotational 的值为 0 表示内核认为该设备没有旋转盘片。在 virtio 环境中,此值由主机选择的功能位设置。它可以排除普通硬盘,但无法区分 NVMe 和 SATA SSD,也无法区分本地闪存与网络卷。如果出现 1,仍应据此采取措施,因为它与标称为固态存储的方案相矛盾。

为什么我的 VPS 中 nvme list 输出为空?

因为客户机没有暴露 NVMe 控制器。nvme listlspci 读取的都是虚拟机可见的设备,而 virtio-blk 或 virtio-scsi 磁盘不会提供可枚举的 NVMe 控制器。在大多数 VPS 方案中,表格为空是正常结果,不能证明主机没有 NVMe 驱动器。使用 sudo apt install -y nvme-cli 安装 nvme-cli;除非主机直通了控制器,否则应预期表格为空。

哪种 fio 结果可视为 NVMe 级存储?

在队列深度为 1、使用 4k 随机读取并设置 --direct=1 时,平均完成延迟接近 110 微秒,可视为 NVMe 级别,对应的 IOPS 大约为 9,000。延迟约为 320 微秒通常指向 SATA SSD,约为 900 微秒通常指向网络连接存储,因为每次读取都要经过一次网络跳转。这些是截至 August 2026 发布的典型区间。因此应比较数量级,而不是比较精确数值;在不同时间段重复测试后再得出结论。