【VPS 硬件选型指南 (存储 篇) 02】到手如何验货:fio 实测与识别「假 NVMe」(方法论篇)
2026-08-15 · DevCraft Studio
到手如何亲手验货:本篇只讲拿到 VPS 后怎么用 fio 自测磁盘、读懂 IOPS / BW / 延迟三行,并用 ioping 与队列深度技巧识别「假 NVMe」、RAID10 SATA、超售限速与网络块存储。介质原理与厂商盘点请见同系列其他篇。
VPS 硬件选型指南(存储篇)· 共 6 篇
同系列其他篇章(按需跳转,避免重复阅读):
延伸阅读
更多相关攻略推荐:刚买的 VPS 怎么连上去?SSH 新手教程(Windows / M、【VPS 硬件选型指南 (存储 篇) 03】主流商家磁盘实情横向盘点、VPS 的带宽、流量、端口到底是啥?1Gbps 和 10TB 流量怎、【VPS 进阶玩法精选 022】VPS 计费门道:预付、按比例、发票、【VPS vs 云 01】VPS 和云服务器是一回事吗?和阿里云/腾。
本篇只讲一件事:到手怎么验货
这是系列的第 02 篇,定位是「方法论 / 验货篇」。上一篇(01 原理篇)和 05 深潜篇 已经把 NVMe 为什么快、IOPS 是什么讲透了,03 厂商篇 会横向盘点各家真实磁盘,06 实战篇 再讲数据库场景。所以本篇不重复原理、不点名厂商、不深入数据库——只解决一个非常实操的问题:机器到手了,你怎么亲手把磁盘扒个底朝天,确认自己买到的到底是本地 NVMe、SATA SSD、还是被虚标/超售的货。
读完你会得到:一套可直接抄的 fio 命令、读懂 IOPS / BW / 延迟三行的方法、用 ioping 看延迟的小技巧、队列深度对结果的影响,以及识别「假 NVMe」的几种典型套路。全程不依赖任何商家宣传语,只认你亲自跑出来的数字。
一、动手前先准备
登录机器第一件事,不要急着跑分,先确认你要把测试写到哪块盘。多数 VPS 只有一块系统盘,那就在根目录测;如果你的套餐含独立数据盘(比如 /www、/data),建议单独测它,避免被系统盘的好成绩带偏。还需要确认两件事:
- 安装 fio:Debian/Ubuntu 用
apt install fio -y;CentOS/RHEL 用yum install fio -y或dnf install fio -y。别用 dd 顶替——dd 只能测顺序写,完全反映不了数据库那种随机小文件负载。 - 留足测试空间:下面命令默认生成 1G 临时文件,确保所在分区有至少 2G 余量,否则会中途写满、结果失真。跑完记得手动删掉测试文件。
一个小提醒:VPS 是共享环境,邻居的 IO 会污染你的成绩。所以测试时间很重要(文末专讲),但先把命令装对。
二、完整 fio 命令集(可直接抄)
下面三条是验货的最小可用集合,覆盖「4K 随机读、4K 随机写、顺序读吞吐」三个核心维度。建议照抄,先跑随机读——它最能暴露货不对板。
apt install fio -y
# 1) 4K 随机读(最关键的「真 NVMe」判据)
fio --name=randread --ioengine=libaio --direct=1 --bs=4k --numjobs=4 --size=1G --runtime=60 --iodepth=64 --rw=randread --group_reporting
# 2) 4K 随机写
fio --name=randwrite --ioengine=libaio --direct=1 --bs=4k --numjobs=4 --size=1G --runtime=60 --iodepth=64 --rw=randwrite --group_reporting
# 3) 顺序读吞吐(bs=1M,看带宽上限)
fio --name=seqread --ioengine=libaio --direct=1 --bs=1M --numjobs=1 --size=1G --runtime=60 --iodepth=64 --rw=read --group_reporting
每个参数都别随手改,含义如下:
- --ioengine=libaio:使用 Linux 原生的异步 IO 引擎。相比同步引擎,它能真正把队列深度(iodepth)用起来,否则你设再大的 iodepth 也压不出真实并发,结果会偏保守、不准。
- --direct=1:这是整条命令的命门。它走 O_DIRECT,绕过系统的页缓存(page cache),强制读写落到真实磁盘。如果漏掉这一项,你测的其实是服务器内存的速度,数字虚高几倍,毫无意义。务必保留。
- --bs=4k / --bs=1M:block size,单次 IO 的块大小。4k 模拟数据库、小文件那种随机小块负载;1M 模拟大文件拷贝。两者反映的能力完全不同,必须分开测。
- --iodepth=64:每个任务的队列深度,即「同时 outstanding 的 IO 请求数」。它决定你能不能在盘里塞满并行度(详见第五节)。
- --numjobs=4:并发进程数。多个 numjobs 相当于把负载放大,更贴近多核、多连接下的真实压力。
- --rw=randread / randwrite / read:读写模式。rand 是随机地址,read/write 是顺序。数据库吃 randread/randwrite,传文件吃 read/write。
- --size / --runtime / --group_reporting:测试文件大小、跑多久、以及把多 numjobs 的结果汇总成一行报告。group_reporting 让输出更干净,建议常开。
想单独测数据盘,加 --filename=/www/test_io 指向目标目录即可;不加则在当前目录生成文件。--filename 不影响判据,只是换被测对象。
三、怎么读 fio 结果:盯住三行
跑完别被满屏数字吓到,真正要盯的就三行(每个测试段各出现一次):
- IOPS=:每秒完成的 IO 操作数,随机 4k 的硬指标。它是识别介质的第一抓手,下文判据全看它。
- BW=:带宽(MB/s),顺序测试(bs=1M)里主要看它,反映「大文件能跑多快」。
- clat(完成延迟):看 avg 和 99.00th 百分位。latency 是骗不了人的硬指标——真 NVMe 在百微秒级,SATA 在几百微秒,网络存储会直接蹦到毫秒级。延迟高意味着即使带宽够,单次请求也会卡。
随机读 IOPS 的三档判据(这是本篇最重要的记忆点):
- 随机读 IOPS > 5 万 ≈ 真 NVMe。能摸到这个量级,基本坐实本地 NVMe(共享池也行)。
- 随机读 IOPS 在 8 千 – 5 万 ≈ SATA SSD。这是 SATA 区间,别被页面上的「SSD」字样误导成 NVMe。
- 随机读 IOPS < 1 千 ≈ HDD 或严重超售。机械盘或邻居抢爆的盘才会这么惨,能退就退。
也就是说:4k 随机读低于 1 千直接判 HDD / 超售;8 千到 5 万判 SATA;过 5 万才谈得上 NVMe。配合 clat 一起看更稳——NVMe 的随机读延迟通常在百微秒,SATA 几百微秒,网络存储 5 毫秒以上。
四、ioping 看延迟的技巧
fio 偏吞吐,延迟想看得更直观、更接近「单次请求体感」,推荐再装一个 ioping。它像 ping 一样持续打小 IO,把延迟抖动画出来,比 fio 单次更敏感。
apt install ioping -y
ioping -c 100 .
技巧:
- 看 avg 和 min 的差距:真本地盘 min 很低、avg 稳定;网络块存储的 avg 比 min 高一截,且抖动大,说明每次请求都要等网络往返。
- 对比 fio 的 clat:ioping 的 avg 大致等于 fio 的 clat avg。两者一个量级才算自洽;如果 ioping 显示毫秒级而 fio 看起来还行,多半是 fio 的高 iodepth 把延迟藏在了并行里(见下节)。
- 用 -s 调块大小:
ioping -s 4k -c 100 .专门测 4k 小 IO 延迟,更贴近数据库心跳。
ioping 不替代 fio,它补的是「延迟体感」这一维,尤其擅长抓网络存储那种「带宽还行、延迟崩了」的伪装。
五、队列深度(queue depth)对结果的影响
这是新手最容易踩的坑:iodepth 越大,测出的 IOPS 往往越高,但那是「理想并发态」,不是「你每次请求的体感」。原因有二:
- 高队列深度把大量 IO 同时塞进盘里,盘用内部并行(多通道、多 Die)把总吞吐叠上去,掩盖了单次延迟。一个慢盘在高 iodepth 下也能凑出不丑的聚合 IOPS,只是每个请求都在排队。
- VPS 邻居闲着时你才压得满;邻居一忙,高 iodepth 的聚合数字会瞬间塌方。
实用做法:默认用 iodepth=64 看「峰值天花板」(上面命令集就是),用来横向对比档次;再补一条 iodepth=1、numjobs=1 的「诚实设置」看单次延迟:
fio --name=randread_qd1 --ioengine=libaio --direct=1 --bs=4k --rw=randread --iodepth=1 --numjobs=1 --size=256M --runtime=20 --time_based --group_reporting
队列深度 1 下慢盘没法用并行藏延迟,真 NVMe 单任务 4k 随机读仍能到 10 万 IOPS 上下,SATA 多在 3 万以下,网络存储会露出 5 毫秒以上的 clat。这条数主机伪造不了,是验货的终极裁判。
六、识别「假 NVMe」的几种套路
设备名会骗人,但数据不会。下面这些套路,本质都是「标称 / 展示层」和「底层介质」不一致:
- 只写 SSD、不写 NVMe:页面写「SSD / 云硬盘」却不写「本地 NVMe」,背后大概率是 SATA 或网络存储。只有明确写「Local NVMe SSD」的才相对可信。
- RAID10 的 SATA:商家用多块 SATA SSD 做 RAID10,吞吐被做高了,但单盘本质还是 SATA,4k 随机 IOPS 卡在 SATA 区间(8 千–5 万),不是 NVMe。RAID 提升了冗余和顺序带宽,救不了随机 IOPS 的物理上限。
- HDD 当 Storage VPS 卖:部分「存储型 / 大硬盘」套餐底层是机械盘,随机 4k 读只有几百 IOPS、延迟 10 毫秒以上。它适合冷备份,不适合任何随机负载,却常被包装成通用 VPS。
- 共享盘 IOPS 限速:即便底层真是 NVMe,一块盘塞几十台 VM 再叠加 I/O 限速(比如 cgroup io limit),分到你头上可能只有几千 IOPS,实测和 SATA 甚至 HDD 没两样。
- 网络块存储走网络:Ceph / SAN 这类网络卷,IO 要先走网络再落盘,延迟天然高一个量级(5 毫秒以上),4k 随机通常只有万把 IOPS,却常按 NVMe 价格卖。识别铁律:顺序看着还行、随机 4k 极差(例如顺序 500 MB/s 但随机只有 1 千 IOPS)几乎可断定是网络存储或严重超售。
七、务必业务高峰测,别挑凌晨
很多人验货习惯凌晨跑,图安静。但这恰恰最容易翻车:凌晨邻居都在睡,你测出的是「这台机器最好的时候」,上线后发现白天卡成狗。正确姿势:
- 在业务高峰重跑:把你预期的忙时段(比如国内晚 8–11 点、欧美工作时段)拿来跑同一套 fio / ioping,看 IOPS 和 clat 比凌晨掉多少。掉得越多,超售越狠。
- 连续多时段采样:至少取 凌晨 / 午后 / 晚高峰 三个点,画出曲线。一条平线说明独享感强;剧烈锯齿说明邻居抢盘严重。
- 别只看一次性峰值:商家可以临时挪资源给你「首测好看」,连续几天同一时段都稳才作数。
记住:验货的目的不是拿漂亮数字发帖,而是确认你付的钱在真实负载下不缩水。
八、三步走验收清单
把上面浓缩成动作,到手照做即可:
- 第一步 跑命令:用第二节的 fio 三连(随机读 / 随机写 / 顺序读),加一条 iodepth=1 的诚实延迟测试。
- 第二步 读三行:随机读 IOPS >5 万判 NVMe,8 千–5 万判 SATA,<1 千判 HDD / 超售;再看 clat 是否毫秒级露馅。
- 第三步 多时段复核:业务高峰再跑一遍,确认不掉档;必要时用 ioping 补延迟体感。
如果三步跑下来随机读 IOPS 低于 1 千、或高峰 clat 飙到毫秒级,而页面写着 NVMe——恭喜,你抓到假 NVMe 了,该退退、该换换。下一篇(03 厂商篇)可以帮你下单前先对号入座,避免买回来再退货。
💡 延伸阅读:关于架构与基础设施的更多深潜指南,请前往 VPS 主题导读中心 (Hub) 获取全盘策略。