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

存储型VPS磁盘到底有多快?顺序速度与随机IOPS实测

顺序吞吐量和随机 IOPS 不是同一指标。了解廉价存储型 VPS 的真实差异,并用 fio 测量您实际购买的卷,避免迁移重要数据后才发现性能不合适。

简短结论

存储型 VPS 的磁盘在一种工作负载下速度很快,在另一种工作负载下却很慢,而这两种工作负载经常被混淆。顺序吞吐量是卷传输一个大文件的速率,通常表现良好。随机 IOPS(每秒输入/输出操作数)是数据库执行的小块、分散读写,通常表现较差。这种差异不是缺陷。选择容量而不是速度时,你购买的就是这种特性;它决定了哪些工作负载适合放在这台服务器上。

没有任何公开数据可以直接说明你的卷的性能。不同容量方案使用的磁盘类型、阵列结构各不相同,而且存储设备未必位于运行 VM 的同一台机器中。因此,本指南的后半部分要求你使用 fio,在实际购买的卷上自行测量,并在将重要数据迁移到该卷之前完成测试。

顺序吞吐量和随机 IOPS 衡量的是不同指标

顺序工作负载会按顺序读取或写入一段连续的数据块。随机工作负载则会在彼此无关的位置之间跳转。对于机械硬盘,这种差异是物理上的:数据传输前,磁头必须移动到正确的磁道,盘片也必须转到磁头下方。顺序访问只需承担一次定位开销,随后即可持续传输。随机访问则每次操作都要承担定位开销,因此硬盘大部分时间都在定位,而不是传输数据。同一块硬盘因此会产生看起来像是来自不同硬件的两组结果。

两个设置会决定测试结果,因此单独引用 IOPS 数值没有意义。第一个设置是块大小:4k 随机读取和 1M 顺序读取,是针对同一设备提出的不同问题。第二个设置是队列深度。每次读取都要等前一个读取完成后才发起下一次读取的程序,只受延迟限制;更深的队列则允许阵列同时处理多个请求。如果有人只告诉您 IOPS,请同时询问块大小和队列深度,否则不要采用这个数值。

阵列结构也会同时影响这两个数值。独立磁盘越多,就有越多磁头可以同时执行寻道,因此RAID 10 阵列如何由镜像对组成对随机工作负载的影响远大于对流式传输的影响。带奇偶校验的阵列会为每次小型写入增加读取-修改-写入步骤,因此小型随机写入是其最差场景。

为什么存储型 VPS 适合 restic、rsync 和媒体服务

备份目标和媒体服务器需要的正是这类磁盘擅长的工作模式。

restic 会将数据组织成数 MB 大小的包文件,而不是为每个源文件分别写入一个对象。因此,包含 1000000 个小文件的备份到达目标端时,会表现为一系列大块写入。随机 I/O 部分的工作,包括分块和去重,会在保存源数据的机器上完成,而不是在存储服务器上完成。

流式读取会按顺序从头到尾读取文件,播放器会预先缓冲即将播放的内容,因此每次读取增加的延迟不会传递给观看者。这就是 使用大型媒体库运行 Jellyfin 在容量型存储上表现良好的原因。但有一点需要注意:转码是 CPU 工作,不是磁盘工作。容量型方案通常提供的 CPU 较少,因此无需转码即可播放的媒体库没有问题;如果每个客户端都会强制触发转码,则不适合。

rsync 取决于您的数据。复制磁盘映像或视频文件属于顺序操作。复制源代码树、Maildir 或 node_modules 目录则不是。rsync 会遍历目录树并对每个文件执行 stat,默认情况下先使用临时名称写入每个目标文件,然后再重命名。这会产生数千次小型元数据操作,而元数据操作属于随机工作。传输的字节数看起来很少,但整个任务可能需要数小时。如果 rsync 源包含大量小文件,应预计存储服务器会成为较慢的一端。

为什么这对数据库、邮件队列或构建服务器不利

数据库提交不是带宽问题。PostgreSQL 会将事务写入预写式日志,并调用 fsync,然后才告诉客户端提交成功。客户端等待的是一次小型写入变为持久化写入。因此,提交速率受写入延迟限制,顺序吞吐量再高也无法改善这一点。PostgreSQL 提供 pg_test_fsync,用于报告卷每秒可以完成多少次持久化写入。请在存储卷和主服务器的磁盘上分别运行它。两者之间的差距就是不应迁移数据库的原因。

邮件队列的情况相同。Maildir 为每封邮件存储一个文件,投递代理会同步每个文件,因此磁盘会持续处理大量小型同步写入。安装软件包、拉取容器镜像、在大型仓库中执行 git 操作,以及任何解压归档的操作,都属于同一种工作负载,只是表现形式不同:数千个小文件,每个文件都需要执行元数据操作。

这种症状很容易识别。机器并不繁忙,但所有操作都很慢。top 会显示较高的 wa 数值,表示 CPU 等待 I/O 的时间占比。来自 sysstat 软件包的 iostat -x 1 会显示较高的 await 列,并且 %util 接近满载,而 r/sw/s 保持较低。设备处于繁忙状态却没有传输大量数据,这是容量型存储设备执行随机访问的典型特征。

我的存储 VPS 卷是否连接到网络存储?

通常是,这会改变答案。在容量型方案中,数 TB 数据通常位于通过网络访问的独立存储系统上,而不是运行 VM 的机器内部磁盘上。每次读取都必须经过其他客户也在使用的链路。延迟除了磁盘耗时外,还会增加网络往返时间,而且链路带宽上限不由您控制。

先查看内核提供的信息。

findmnt -T /mnt/storage -o SOURCE,FSTYPE,OPTIONS
lsblk -d -o NAME,ROTA,SIZE,TRAN,MODEL
df -hT /mnt/storage

FSTYPEnfs4cifs 时,可以明确判定为网络存储。virtio 块设备几乎不能说明问题,因为相同的设备节点可能对应本地 NVMe 分区、相邻机架中的机械磁盘阵列,或分布式集群;来宾内核无法区分这些情况。ROTA 同样不可靠:它报告的是 hypervisor 声明的信息,因此其中的 0 不能证明设备使用了闪存。

既然无法直接从系统中读出答案,就改为测量延迟。

sudo apt update && sudo apt install -y ioping
ioping -c 20 -D /mnt/storage
ioping -c 20 -D /

-D 请求直接 I/O,因此页缓存无法代替磁盘返回结果。请在其他负载基本空闲的机器上,将该卷与根文件系统进行比较。差距大且稳定,说明网络影响了测量结果。然后在晚上再次运行同一组测试。如果延迟随时间变化,说明这是共享资源,而您正与其他用户共同使用它。

同一平台上的快照不是异地备份

快照很有用,但它们不是备份。服务商快照位于同一账户、同一平台,并受同一组登录凭据保护。它可以防止您误删文件,但无法防止账户因付款失败而被关闭、控制面板密码被盗,或平台故障同时影响存储和快照。这些副本会同时失效,因为它们从一开始就不具备独立性。

至少保留一个副本,将其存储在与原始数据完全隔离的基础设施上。这正是使用第二台 VPS 作为异地备份目标的意义所在。存储型 VPS 非常适合保存这个副本,但不适合保存唯一副本。

如何使用 fio 测量存储型 VPS 的磁盘速度

以下内容已于 2026 年 9 月在 Ubuntu 24.04 上验证。fioiopingsysstat 都位于默认软件仓库中,因此不需要第三方源。

sudo apt update && sudo apt install -y fio
sudo install -d -o "$USER" -g "$USER" /mnt/storage/fio
df -h /mnt/storage
free -g

首次运行前请遵循两条规则。每个任务都要传入 --direct=1,因为它会绕过页缓存;如果缓存可以直接返回测试数据,测量的就是 RAM,而不是磁盘。将 --size 设置为大于 free -g 显示的 RAM,原因相同。先检查 df -h,确保测试文件有足够的可用空间。

顺序写入:备份目标最关注的指标:

fio --name=seqwrite --directory=/mnt/storage/fio --rw=write \
  --bs=1M --size=8G --numjobs=1 --iodepth=8 --ioengine=libaio \
  --direct=1 --end_fsync=1 --group_reporting

顺序读取:流式处理最关注的指标:

fio --name=seqread --directory=/mnt/storage/fio --rw=read \
  --bs=1M --size=8G --numjobs=1 --iodepth=8 --ioengine=libaio \
  --direct=1 --group_reporting

fio 第一次使用某个任务名称时,会先创建该任务的测试文件,因此这个读取任务会先写入文件,再读取文件。这是正常行为,文件创建阶段不计入报告结果。

4k 随机读取:可用于判断数据库是否会受到影响:

fio --name=randread --directory=/mnt/storage/fio --rw=randread \
  --bs=4k --size=8G --numjobs=1 --iodepth=32 --ioengine=libaio \
  --direct=1 --runtime=300 --time_based --group_reporting

混合随机负载:更接近真实应用的工作方式:

fio --name=randrw --directory=/mnt/storage/fio --rw=randrw --rwmixread=70 \
  --bs=4k --size=4G --numjobs=4 --iodepth=16 --ioengine=libaio \
  --direct=1 --runtime=300 --time_based --group_reporting

注意最后一个测试中的 --numjobs。fio 会为每个任务创建一个文件,因此 4 个任务各使用 --size=4G 时,总写入量为 16G,而不是 4G。启动前检查可用空间,因为将卷填满到没有可用块本身就会造成服务中断。

从输出中读取以下 3 项内容。bw= 表示吞吐量。IOPS= 表示每秒操作数,只有结合你设置的 bsiodepth 才有意义。clat percentiles 区块最容易被忽略,但它最能预测服务器在实际使用中的响应:第 99 个百分位的完成延迟,就是最慢请求实际等待的时间。中位延迟正常但第 99 个百分位非常差,说明队列会在负载升高时停滞。

保存原始结果,不要只截取终端屏幕。

fio --output-format=json --output=/mnt/storage/fio/randread-1.json \
  --name=randread --directory=/mnt/storage/fio --rw=randread \
  --bs=4k --size=8G --numjobs=1 --iodepth=32 --ioengine=libaio \
  --direct=1 --runtime=300 --time_based --group_reporting

测试文件占用空间较大,完成后请删除。rm -rf /mnt/storage/fio 会删除你在上面创建的目录,不会删除其他内容。

单次运行不发布结果

一次 fio 运行只能算个案。共享基础设施中的多个常见因素都会影响结果。

  • 首次写入从未写入过的块时,行为可能不同于在精简配置存储上进行重写。因此应舍弃第一次运行的结果,保留后续运行的结果。
  • 缓存层或突发性能额度可能让开始几秒的表现非常好,但稳定状态很普通。--time_based --runtime=300运行时间足够长,可以显示实际属于哪种情况。
  • 邻近租户共享存储阵列和链路。03:00 的结果可能与 20:00 的结果不同,因此应在这两个时段都进行测试。

每个作业至少运行三次,并安排在不同时间段,然后报告中位数及其取值范围。如果范围很大,离散程度就是最有价值的信息,因为它体现了存储卷是否具有可规划的性能。收集任何 VPS 指标时都应遵循相同原则;诚实测试 VPS 的更完整方法也涵盖同一问题中的 CPU 和网络部分。

常见方案:一台小型高速服务器加一台大型低速服务器

确定自己的两个数字后,架构通常就很明确了,而且很少只使用一台机器。将需要高性能的工作放在配备高速本地存储的小型服务器上:数据库、应用、容器构建任务和邮件队列。将数据放在大容量服务器上:媒体库、归档文件、restic 仓库以及无人查询的日志。如果服务商提供私有网络,就通过该网络连接两台服务器;如果没有,则使用隧道连接。

这种布局正是将存储 VPS 与主 VPS 配对的用途。与购买一台大型高速服务器相比,这样做的成本更低,因为只有少量需要高性能的数据才需要支付高速存储费用。如果你还在选择方案,存储 VPS 与常规 VPS 的区别说明了同一权衡在产品选择中的体现,NVMe 相比 SATA SSD 的优势介绍了这对服务器中的高速部分,而计算实际需要多少 TB 存储空间可以避免购买永远用不满的容量。注册服务前,使用选择存储 VPS 的检查清单核对方案,并直接询问服务商该存储卷是本地连接还是网络连接。服务商如果不愿回答这个问题,其实也已经说明了一些情况。

FAQ

存储 VPS 的速度足以运行数据库吗?

通常不适合直接运行数据库。提交操作需要等待一次小型同步写入持久化,因此吞吐量无法解决问题,写入延迟决定了事务速率。在存储卷和普通服务器磁盘上分别运行 pg_test_fsync,然后比较两组数据。应将数据库放在速度更快的本地存储上,并使用存储 VPS 保存数据库转储和归档的预写式日志。

如何判断存储 VPS 卷是否通过网络连接?

如果卷使用 NFS 或 SMB,findmnt -T /mnt/storage -o SOURCE,FSTYPE,OPTIONS 会直接显示相关信息。virtio 块设备会隐藏这一点,因为无论存储位于本机还是另一台机架中的设备上,客户机内核看到的都是同一个设备。应改为进行测量:在运行针对 / 的同一命令的同时运行 ioping -c 20 -D /mnt/storage,并在一天中的不同时间重复两项测试。如果延迟随时间变化,说明使用的是共享基础设施。

为什么 fio 测试结果比实际工作负载好得多?

通常原因是缺少 --direct=1,导致页缓存直接返回读取结果,因此测试测量的是 RAM。--size 小于机器 RAM 时,也会因同样原因造成问题。运行时间过短也会使存储卷的表现看起来更好,因为缓存层或突发配额可以支撑开始的几秒,之后就会停止。使用直接 I/O,设置大于 RAM 的工作集,并使用 --time_based --runtime=300

服务商的快照算备份吗?

不算。快照位于同一平台上的同一账户中,因此只能防止您误操作文件,无法防范影响账户或平台的事件。账户被关闭、面板登录凭据被盗,或平台发生故障时,原始数据和快照会同时丢失。应在与原始数据完全无共享基础设施的位置保留一份副本。

可以从存储 VPS 流式播放 4K 视频吗?

读取视频文件属于顺序读取,播放器也会提前缓冲,因此磁盘通常不是瓶颈。通常有另外两个限制。套餐的网络配额决定了服务器可以同时提供多少路流,转码则需要 CPU 资源,而存储型套餐通常并非为此设计。先使用上文的 fio 作业测量顺序读取性能,再检查 CPU 和带宽策略,然后确定可支持的并发流数量。