SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-10-16

VPS本地NVMe和网络存储怎么选

同样标注为NVMe,VPS本地盘与网络卷在写入延迟、快照、邻居干扰和故障范围上差异明显,了解队列深度1为何更能反映真实体验。

VPS 上的本地 NVMe 与网络存储

VPS 上的本地 NVMe 与网络存储,本质上是一个被两个产品名称掩盖的选择。本地 NVMe 磁盘是与虚拟机运行在同一台物理服务器中的闪存,通过 PCIe 访问。网络卷中的闪存位于其他服务器,通过服务商的网络访问;通常要先写入其中两台或三台服务器,系统才会确认写入完成。

两者都标为“NVMe SSD”,而且这些描述都没有问题。存储集群中的闪存确实是 NVMe 闪存。规格说明没有展示的是进程与闪存之间的访问路径,而你实际感受到的正是这条路径。

写入请求的两条路径

在本地存储中,路径很短。进程调用 write(),然后调用 fsync()。客户机内核将请求交给 virtio 设备。虚拟机监控程序将请求传递给主机块层,块层通过 PCIe 将请求发送到同一机箱中的闪存设备。设备完成存储后返回确认,确认沿同一堆栈逐层返回。

在网络存储中,路径会增加网络这一层。主机运行存储系统的客户端。常见客户端包括 Ceph RBD 和 iSCSI;现在 NVMe over Fabrics(NVMe-oF,即通过网络传输的 NVMe 协议)也越来越常见。该客户端确定哪些节点保存您的数据,然后通过网卡和交换机将写入请求发送到这些节点并等待。配置为保存 3 个副本的集群,只有在足够数量的副本持久化后才会确认写入。确认随后才会返回到进程。

这并不是缺陷。额外的跳数带来了短路径无法提供的特性。但每一跳都会增加耗时,而且每次操作都会产生这部分开销。

为什么延迟下限才是关键指标

再次查看第二条路径,并计算其中的等待时间。主机与存储节点之间至少需要一次网络往返,还要加上该节点自身的设备服务时间,以及等待提供商要求的副本数量。本地写入只需支付设备服务时间,其他等待很少。

公开数据表明,本地 NVMe 写入确认通常为几十微秒,而复制网络写入通常为几百微秒到几毫秒。应将这些数据视为厂商和社区提供的数值,而不是 VPS 的实际测量结果。关键在于两者差异的形态。两种设计具有不同的下限,而并行度无法降低下限。并行度只能提高上限。

这也是为什么针对同一磁盘的两次基准测试可能得出相反结论。队列深度为 32 的测试会掩盖下限,因为同时处理的 32 个请求会重叠等待时间。队列深度为 1 的测试会暴露下限,因为每个请求都要等待前一个请求完成。两种测试都要运行,并且要自行运行:使用 fio 在队列深度为 1 以及高队列深度下测量 VPS 磁盘,这是了解机器实际表现,而不是相信产品页面所声称性能的唯一方法。

数据库和小型写入会最先感受到影响

数据库提交属于小型同步写入。PostgreSQL 会将事务追加到预写式日志,调用 fsync(),然后才向客户端报告成功。在 fsync() 返回之前,连接会处于空闲等待状态。因此,单个连接的提交速率上限由提交延迟的倒数决定。0.1 ms 的延迟下限,允许的单连接提交速率大约是 1 ms 下限的 10 倍。这是算术关系,也解释了为什么某个应用在一家服务商上运行很快,换到另一家配置规格完全相同的服务商后却变慢。

并发可以缓解这一问题。PostgreSQL 会将并发提交合并到一次刷新操作中,因此 100 个繁忙连接不必分别等待 100 次。真正保持缓慢的是所有串行操作,例如逐行提交的迁移任务,或完成一个作业后才启动下一个作业的队列工作进程。

同样的情况也会影响所有频繁调用 fsync() 的组件:etcd、使用 appendfsync always 的 Redis、默认日志模式下的 SQLite、写入 Maildir 的邮件服务器,以及解压数千个小文件的 CI runner。对于工作集能够放入 RAM 的读密集型负载,通常几乎不会受到影响,因为页缓存会响应大多数读取请求,这些请求根本不会到达磁盘。

吞吐量受网络限制,而不是设备限制

顺序吞吐量在不同设计中会遇到不同的上限。单个现代 NVMe 设备每秒可传输数 GB。网络卷的吞吐量不能超过承载其流量的链路带宽,还要扣除协议开销,以及同一时刻通过同一交换机传输数据的其他租户所占用的带宽。10 Gbit/s 链路在线速下约可承载 1.25 GB/s,尚未扣除任何开销。因此,即使后端完全由高速闪存组成,其顺序带宽仍可能低于单个本地磁盘。

对于网络卷,服务提供商通常会明确说明这些限制,包括带宽上限和 IOPS(每秒输入/输出操作数)上限。上限通常按卷大小调整,有时还提供可随时间恢复的突发额度。按大小调整的上限意味着,20 GB 卷和 2 TB 卷的性能可能完全不同,尽管页面将它们列为同一种产品。本地磁盘通常不会按这种方式设置上限,而是由多个使用者共享,这属于另一类问题。

每种存储上的邻居噪声表现

本地 NVMe 共享同一设备和同一主机。当主机上的另一个 guest 运行高负载随机写入任务时,您的请求会排在它的请求后面,延迟也会升高。影响范围就是该主机。一些服务商会在 hypervisor 中对每个 guest 实施 I/O 限速。这样,噪声会变成您持续触及的固定上限,而不是偶尔遇到的随机延迟。

网络存储会将数据分布到多个节点,因此单个高负载租户的影响会被分摊。但您也会受到整个集群事件的影响。节点发生故障后,系统会启动恢复流程来重建缺失副本,而重建过程会与整个集群中的客户端流量争用资源。存储机架发生网络拥塞或进入维护窗口时,即使租户自身没有任何变化,也可能受到影响而变慢。

在 guest 内部,即使不了解后端实现,也可以区分“磁盘正忙”和“磁盘正在等待”。从 sysstat 软件包运行 iostat -x 1,并比较 aqu-sz(平均队列长度)与 r_await 和 w_await(每个读请求和写请求的平均等待时间)。当前版本的 sysstat 仅在短格式 iostat -x -s 1 中打印一个合并的 await 列。当 aqu-sz 保持较小,而 w_await 或 r_await 较高时,说明时间消耗在您的系统之下,因为您自身的工作负载不足以解释这些排队请求。cat /proc/pressure/io 表达的是相同的情况,只是使用停顿百分比表示:some avg10 值持续升高,说明任务因等待 I/O 而被阻塞。存储噪声和 CPU 噪声通常会同时出现,steal time 是 CPU 侧对应的指标。

实时迁移期间会发生什么

网络存储的价值就在这里体现出来。磁盘位于集群中时,将 VPS 迁移到另一台主机只需复制 CPU 状态和 RAM。磁盘不需要移动,因为它从未位于这台主机上。现代虚拟机管理程序可以将暂停时间控制在毫秒级。您通常会从状态页面得知迁移,而不是从监控系统中发现。

磁盘位于本地时,磁盘也必须迁移。虚拟机管理程序会在虚拟机继续运行并不断产生脏块的同时,将块设备镜像到目标主机。因此,复制所需时间至少与数据量相当;如果迁移期间仍在写入,耗时会更长。一些服务提供商仍会执行此类迁移。许多服务提供商不会这样做,其维护通知会说明需要重启。通知中的这一措辞差异,通常可以帮助判断底层采用了哪种设计。

存储节点发生故障时会怎样

网络存储可以承受一个节点丢失,因为副本位于其他位置。租户看到的是暂停,而不是数据丢失:集群确定哪个副本为权威副本期间,I/O 会阻塞。如果暂停时间过长,客户机内核会报告错误。dmesg 会打印类似下面的内容:

INFO: task jbd2/vda1-8:311 blocked in I/O wait for more than 120 seconds.
I/O error, dev vda, sector 1050624 op 0x1:(WRITE) flags 0x0 phys_seg 1 prio class 0
EXT4-fs (vda1): Remounting filesystem read-only

较旧的内核对前两行的措辞略有不同:挂起任务行不包含 “in I/O wait”,错误行以 blk_update_request: 开头。请在日志中搜索这两种形式。

文件系统变为只读后,会一直保持只读状态,直到重新挂载或重启。因此,即使服务提供商已妥善处理存储事件,您的 VPS 仍可能需要重启。对于设备提供此选项的情况,增加客户机 I/O 超时只能延长客户机静默等待而不是报告失败的时间窗口。

本地 NVMe 的故障表现不同。当主机向镜像存储集写入数据时,闪存设备损坏仍可恢复。因此,对于宣传使用本地磁盘的方案,值得询问是否提供 主机上的 RAID 10。主机损坏则无法以相同方式恢复:您的数据仍完整地保存在无人可访问的闪存中,除非机器恢复运行;如果机器永远无法恢复,数据也无法恢复。本地 NVMe 仍适合许多工作负载,但前提是您负责恢复路径,而快照与备份的区别正是许多人事后才发现的问题。

网络存储的价值

即时快照是最明显的例子。集群中的快照是一个写时复制标记,因此无论卷大小如何,通常都能在约 1 秒内完成,因为按下按钮时不会复制任何数据。对于本地磁盘,快照意味着复制实际数据块,这需要在同一台主机上占用实际时间和空间。

只有当卷不与某台主机硬件绑定时,才能将其从一个实例卸载并挂载到另一个实例。出于同样的原因,卷容量可以扩展到超过提供商所拥有的最大驱动器容量;精简配置也是如此。面板因此可以向您提供 5 TB,而无需今天就为您部署 5 TB 的物理存储。当限制因素是容量而非延迟时,这种灵活性就是网络存储的核心价值;块存储卷与对象存储:低价太字节容量的比较介绍了资金实际流向何处。

如何确定您使用的是哪一种

在 guest 内部,设备名称无法说明实际存储位置。几乎所有 VPS 都通过 virtio 将磁盘呈现为 /dev/vda,无论底层使用什么存储介质。对于 virtio-blk 磁盘,即使数据块位于闪存上,cat /sys/block/vda/queue/rotational 仍会显示为 1。这是因为 Linux 的 virtio-blk 驱动会将其创建的每个磁盘标记为旋转磁盘,并且不会清除该标志;只有镜像中的 udev 规则可以修改它。对于 virtio-scsi,该值取决于 hypervisor 宣布的旋转速率,因此显示为 0 通常表示启用了 SSD 模拟,而不是表示磁盘位于本地。lsblk -o NAME,SIZE,ROTA,TRAN,MODEL 通常会为 virtio-blk 显示空的 MODEL,为 virtio-scsi 显示 QEMU HARDDISK;这两个字符串都无法说明数据块的实际位置。

在适用时,只有一种检查可以给出实际答案:

ls /sys/class/nvme/
cat /sys/class/nvme/nvme0/transport

如果您的磁盘显示为 /dev/nvme0n1,则对于连接到本地 PCIe 总线的设备,transport 会显示 pcie;对于通过 NVMe over Fabrics 连接的设备,则会显示 tcp、rdma 或 fc。后者属于使用 NVMe 名称的网络存储。因此,单独看到 /dev/nvme0n1 不能证明磁盘位于本地。如果 /sys/class/nvme/ 不存在,说明您使用的是 virtio,此检查不适用于您。有关更多内核侧检查方法,请参阅在 Linux guest 内部确认 NVMe 磁盘。

此时应查看磁盘的行为和相关说明。这些信息比设备名称更可靠:

  • 可以将磁盘从当前实例分离,再挂载到其他实例吗?如果可以,它就是网络卷。
  • 大型磁盘的快照能在几秒内完成吗?那么它几乎可以确定使用的是集群中的写时复制。
  • 机器运行期间可以调整磁盘大小,或者可以订购大于任意单个物理磁盘容量的磁盘吗?结论相同。
  • 服务商承诺维护主机时无需重启吗?这要求磁盘在维护过程中保持原位。
  • 额外磁盘是否按每 GB 每月单独计费?服务商会这样为网络卷定价,因为其容量确实可以与机器分离管理。

然后用直白的语言询问支持人员。简短的问题通常比预想中更容易得到明确答复:“系统盘是主机中的本地 NVMe 设备,还是分布式存储系统中的卷?”请分别询问 root 磁盘和其他附加卷,因为一台 VPS 往往同时包含两者:用于操作系统的本地 root 磁盘,以及用于大量数据的网络卷。

最后进行测量。队列深度为 1 的随机写入测试,比任何规格表都更能反映底层设计;正确运行该测试的 fio 配方已集中整理在一处,因此这里不再重复。

阅读写着“Cloud”或“VPS”的德国套餐说明

这两个词都不是技术术语。实际上,德国市场通常将带有 API、按小时计费、快照和可挂载卷的产品称为“Cloud”,将固定月费、固定磁盘的机器称为“VPS”或“vServer”。这种对应关系确实存在,但它属于营销惯例,并不代表底层架构。供应商可能随时更改这种叫法,且不会通知用户。

应查看存储说明,而不是产品名称。“Lokale NVMe-SSD”或“lokaler NVMe-Speicher”表示磁盘位于主机中。“Verteiltes Speichersystem”、“Netzwerkspeicher”、“Blockspeicher”或“dreifach redundant gespeichert”表示写入数据会离开当前机器。“三副本冗余存储”之类的表述本身就是强信号,因为单台主机中的单块本地磁盘不可能在任何位置保存三份。

注意那些无论哪种情况都成立的表述。“NVMe SSD storage”既可以准确描述由 NVMe 硬盘组成的 Ceph 集群,也可以描述主机中的一块硬盘。它只说明介质类型,没有说明存储距离。如果页面只写了介质类型,应假设页面尚未说明存储位置,并主动询问。对于页面的其他内容,也应采用相同的阅读方式;逐行阅读廉价 VPS 套餐说明会具体介绍这种方法,而存储型 VPS 与普通 VPS 的区别则会说明在以容量为优先的套餐中,这个问题如何再次发生变化。

哪些工作负载适合哪种存储

当用户等待的路径上存在小型同步写入时,应为本地 NVMe 付费。具有实际提交速率的 PostgreSQL 或 MySQL 主库、etcd、每个作业都要提交的队列工作进程、邮件存储、CI runner,都受延迟下限约束;而这个下限正是您要购买的性能。作为交换,您需要接受一台主机保存这份数据副本。请将数据复制到主机之外,或在主机之外备份,并监控分配给您的磁盘;从来宾系统内部监控磁盘运行状况可以覆盖租户实际能够看到的部分。

当数据必须比实例存续时间更长、所需容量超过单台机器的承载能力,或者您希望在无需安排停机的情况下迁移、调整大小和创建快照时,应为网络存储付费。只读副本、应用服务器、备份目标和媒体库都适合使用网络存储,因为它们都不受单线程提交延迟限制。

大多数实际部署最终都会采用混合方案:将 root 磁盘放在本地 NVMe 上,让操作系统和数据库保持较快响应;同时挂载网络卷,用于备份和大型文件。这样可以减少意外问题,因为每种存储都承担自己擅长的任务。如果您还在拓扑设计之前决定存储介质,那么应先解决NVMe 与 VPS 上 SATA SSD 的比较这一问题。

FAQ

如何判断 VPS 磁盘是本地 NVMe 还是网络存储?

在客户机内部,仅凭设备名称无法判断,因为 virtio 在这两种情况下都会呈现为 /dev/vda。如果系统中有 /dev/nvme0n1,请读取 /sys/class/nvme/nvme0/transport:pcie 表示本地 PCIe 总线,tcp 或 rdma 表示基于网络的 NVMe,也就是网络存储。否则只能根据行为判断。大型磁盘可以即时创建快照、卸载卷后在其他位置重新挂载、在线扩容,或在无需重启的情况下进行维护,这些功能都需要网络存储。然后分别向支持人员确认根磁盘和额外卷,因为一台机器通常同时使用这两种存储。

规格表中的 “NVMe” 是否表示磁盘位于我的服务器内部?

不是。它描述的是存储介质,而不是存储距离。由 NVMe 磁盘组成的分布式存储集群,准确来说也属于 NVMe 存储,但每次写入仍会经过网络,并等待副本确认。应关注数据存储位置的描述,例如 “lokal” 与 “verteilt” 或 “redundant gespeichert”,不要只看介质名称。

为什么标称使用 NVMe 的 VPS 上,数据库仍然很慢?

每次提交都会调用 fsync() 并等待,因此单个连接的提交速度不可能超过写入确认延迟的倒数。网络存储会为每次等待增加一次网络往返和副本确认。串行任务受影响最大,例如每行提交一次的迁移,或单线程 worker。并发提交可以合并到一次刷新中,因此即使每次单独提交仍然很慢,提高并发度通常也能恢复大部分吞吐量。

网络存储是否比本地 NVMe 更安全?

网络存储更能抵御硬件故障,因为副本位于不同机器上,丢失的节点会自动重建。但它不是备份。删除表或执行错误的迁移后,变更会立即复制到所有副本。本地 NVMe 将数据持久性责任交给您;如果不采取措施,风险更高。如果在主机之外进行复制或备份,本地 NVMe 同样完全可用。

可以在网络存储上运行生产数据库吗?

可以,很多人都这样做。但应预期更高的提交延迟下限,并据此设计:在应用允许的情况下批量写入;同时确认提供商是否按卷大小限制 IOPS,因为小卷的 IOPS 上限可能较低。如果用户实际感受到的是单线程提交速率,请先在队列深度为 1 的条件下测试两种设计,再作决定。