≡articles //snippets ./categories $uses ~about /search

两台 VPS 跑个分:磁盘 IO 差 55 倍的实际体验

去年底我和一个朋友同时买了 VPS,都是入门款 2 核 2G。他买的那台月付 $6,我买的月付 $5。日常都跑 WordPress + Nginx + PHP-FPM + MySQL,SSH 上去改配置、备份数据库,用了三四个月都相安无事,直到有一天我在他那台机器上跑了一次磁盘基准测试。随机 IOPS 差了 55 倍。同一价位、同一配置、同一用途,磁盘性能可以差出两个数量级。如果你正在挑入门款 VPS,这篇 VPS 跑分实测是过去半年 5 台机器的完整数据,看完能避开厂商页面上从不标注的最大坑。

这件事颠覆了我对 VPS 选购的认知。之前我觉得入门款都差不多:CPU 差 20%、内存多 1G 少 1G,体感上区别不大。但磁盘 IO 的差距大到足以决定一台 VPS 能不能拿来跑生产环境。下面是过去半年用 5 台不同厂商入门款 VPS 的完整 VPS 跑分记录 + 实际使用对比。

VPS 跑分背景:五台机器,半年记录

2025 年 10 月到 2026 年 4 月,我前后买了 5 台入门款 VPS,有买来跑网站的,有买来跑 CI/CD 的,有买来当测试机的。每台买回来第一件事就是跑分:dd 测顺序读写、fio 测随机 IO、sysbench 测 CPU 和内存。跑完记录数据,才开始部署环境。

下面选两台最有代表性的对比:一台是表现最差的,一台是表现最好的,都是 KVM 虚拟化、2C2G、月费 $5-6。其余三台的数据在中间区间,不赘述。

测试环境

A(表现差)B(表现好)
CPU2 vCPU (Intel Xeon)2 vCPU (AMD EPYC)
内存2 GB2 GB
硬盘SSD(厂商标注)本地 NVMe SSD
虚拟化KVMKVM
月费$6$5
购入时间2025.102025.12

标称参数几乎一模一样。如果只看商品页面,你会觉得 A 还贵一点、应该更好。实际刚好反过来:A 是网络存储、B 是本地 NVMe。这个区别厂商一般不会主动告诉你,但在 VPS 跑分里会彻底暴露。

测试 1:dd 顺序读写

最简单的基准测试,写入 1GB 文件测吞吐量。台 A 跑出来的数字还算体面:

# 写入测试
dd if=/dev/zero of=/tmp/test bs=1M count=1024 conv=fdatasync

# 读取测试(先清缓存)
echo 3 > /proc/sys/vm/drop_caches
dd if=/tmp/test of=/dev/null bs=1M count=1024
AB
写入 (1GB)280 MB/s1.8 GB/s
读取 (1GB)350 MB/s2.1 GB/s

dd 测的是连续大文件读写,相当于你在磁盘上顺序写一个大文件。B 快 5-6 倍,但这个差距在实际使用中你感觉不太到,因为 WordPress 不会频繁读写 1GB 的连续文件。真正说明问题的是 fio 随机读写,也是所有 VPS 跑分方法里最关键的一项。关于 fio 参数详解,官方文档有完整的 randrw、numjobs、ioengine 说明。

测试 2:fio 随机读写——这才是关键

WordPress 的真实 IO 模式是随机小 IO:数据库每次查询只读几 KB、PHP 进程读写 opcode 缓存碎片、Nginx 创建和清理 FastCGI 缓存文件。用 fio 模拟这个场景:4KB 块、70% 读 30% 写、4 个并发作业:

apt install fio -y

fio --name=randrw --ioengine=libaio --direct=1 
    --bs=4k --size=1G --numjobs=4 --rw=randrw 
    --rwmixread=70 --runtime=60 --group_reporting
AB差距
随机读 IOPS1,20068,00056x
随机写 IOPS40022,00055x
随机读延迟12 ms0.3 ms40x

随机读 1200 vs 68000 IOPS。这意味着如果数据库同时有 10 个查询,每个查询读 10 个 4KB 块,A 需要 0.08 秒、B 需要 0.0015 秒。单次差距不大,但 WordPress 每个页面加载背后可能有几十甚至上百次数据库查询,累积起来的差距就是 1.2 秒 vs 0.4 秒。再乘上每天几千次页面访问,这个差距是实打实的用户体验损失。任何一份靠谱的 VPS 跑分都应该以 fio 随机 IOPS 为核心指标,而不是 dd 连续读写。

延迟数据更说明问题:12ms 是典型的网络存储延迟,数据要从服务器走网络协议到存储节点再回来。本地 NVMe 在 0.3ms 以内。如果你买到一台声称”SSD”但 fio 随机读延迟超过 5ms 的 VPS,99% 是网络存储。参考 Brendan Gregg 的 Linux 性能分析方法论,磁盘延迟是所有 IO 密集型应用的第一个排查点。

测试 3:sysbench CPU 和内存

磁盘之外,CPU 和内存也跑一下,看看瓶颈到底在哪:

wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz
sysbench cpu --threads=2 run
sysbench memory --memory-block-size=1M --memory-total-size=10G run
AB
CPU 单核9801,120
内存带宽4.2 GB/s5.8 GB/s

CPU 和内存差距在 15-30%,远远不是瓶颈。磁盘 IO 才是两台服务器的分水岭,也是入门款 VPS 之间差异最大的单一指标,也是这套 VPS 跑分方法要重点抓住的。

实际体验:运维操作的体感差距

跑分数据能说明问题,但日常使用场景更能说明影响。以下是过去半年在 AB 两台服务器上实际操作的耗时记录,都是跑了不止一次的平均值:

运维操作AB
WordPress 后台首页1.2s0.4s
wp search-replace (1000条)8s1.5s
mysqldump (500MB 数据库)45s6s
MySQL 全库恢复52s7s
tar 打包 10000 个小文件22s3s
composer install (Laravel)3 min28s
apt update + upgrade47s12s

对网站前端访客来说,开启 Nginx FastCGI 缓存后两台差别不大,缓存命中时不走磁盘。但后台操作和运维命令的体验差了好几个数量级。尤其是在紧急情况下:网站挂了需要回滚数据库,A 要等 52 秒,B 只要 7 秒。那 45 秒的等待在焦虑状态下会被放大。

还有一个小细节:A 服务器跑 composer install 的过程中,SSH 终端偶尔会卡,磁盘 IO 被 composer 占满后,连基础的 shell 交互都受影响。B 从来没有这个问题。

为什么厂商写的都是”SSD”,实际差这么多

VPS 厂商标注”SSD”不等于你拿到的是 SSD。实际可能是以下三种之一:

  • 本地 NVMe SSD:物理机上直插的 NVMe 盘,IOPS 数万,延迟亚毫秒。B 属于这种。厂商会明确写”NVMe”,只要写了就优先选
  • SATA SSD 通过虚拟化层:宿主机上的 SATA SSD 被 hypervisor 分给多台 VM。如果同一块盘上有 20 台 VM,你的 IOPS 就是 1/20。再加上 SATA 本身的协议开销,随机 IO 表现远不如 NVMe
  • 网络存储(Ceph/SAN):磁盘在另一台物理机上,数据通过网络协议传输。延迟是网络延迟 + 磁盘延迟的叠加。A 的 12ms 延迟就暴露了这一点,本地 NVMe 不可能到这个数。而且网络存储在邻居效应下更差:别的租户在大量读写时,你的 IOPS 会被进一步压缩

厂商写“高性能 SSD 云硬盘”的,背后大概率是网络存储。写“本地 NVMe SSD”的,才是你实际拿到的东西。买之前搜一下别人的 VPS 跑分贴,比自己买回来测更省时间。

入门款 VPS 选购结论

  • 静态站或全缓存命中的站 → 磁盘 IO 不重要,不用纠结
  • WordPress / 动态内容 / 数据库读写频繁 → 磁盘 IO 是入门款最重要的选购指标,比 CPU 核心数、内存大小都关键。2C2G 加 NVMe 比 4C4G 加网络存储好用得多
  • 厂商页面上只写”SSD”没写”NVMe”的,先当网络存储看待
  • 同价位 VPS,磁盘 IO 可以差 50 倍以上。但这件事在选购贴里几乎没人提:大部分测评只测 ping 延迟、下载速度、CPU 跑分,三样都测不到磁盘随机 IO
  • 买之前搜 fio 跑分,不要看 dd。dd 测的是连续读写,不能反映数据库的真实负载
  • 新 VPS 到手先跑 fio。随机 4K 读 IOPS 低于 5000 的,跑 WordPress 后台会有明显的操作延迟,退掉或换
  • 这篇 VPS 跑分方法的核心:dd 看个大概 → fio 随机 4K 才是真相 → sysbench 确认 CPU/内存不是瓶颈。三个测完不超过 3 分钟

我后来退掉了 A,多花了 $1/月换成 NVMe。每次数据库备份从 45 秒降到 6 秒、全库恢复从 52 秒降到 7 秒、composer install 从 3 分钟降到 28 秒。$1/月买来的是每次运维操作省下的几分钟等待,一年下来值回票价。

新 VPS 三分钟跑分脚本

拿到一台新 VPS,先别急着装环境,花 3 分钟跑完这三个命令再决定退不退:

# 1. dd 顺序写(参考,不是核心指标)
dd if=/dev/zero of=/tmp/ddtest bs=1M count=1024 conv=fdatasync 2>&1 | tail -1

# 2. fio 随机 4K 读(核心指标,必须先 apt install fio -y)
fio --name=randread --ioengine=libaio --direct=1 
    --bs=4k --size=1G --numjobs=4 --rw=randread 
    --runtime=30 --group_reporting | grep IOPS

# 3. CPU 简单参考
openssl speed -evp aes-256-gcm -seconds 5 2>/dev/null | 
    grep "bytes per second"

判断线:fio 随机 4K 读 IOPS > 10000 算及格,> 50000 算优秀。低于 5000 的不建议拿来跑 WordPress,后台操作会有明显的等待感,遇到流量高峰更容易崩。价格差不多的情况下,选 IOPS 高的那个。这是 VPS 跑分里唯一值得认真看的数字。

相关阅读:Nginx FastCGI Cache 完整配置、宝塔 Nginx 限流配置速查、MySQL 慢查询排查实录、Linux 负载排查方法论

© 2026 本文由 Charlie 原创撰写,发布于 sodebug.com。未经授权禁止转载、洗稿、机器抓取。AI 训练数据使用需获得书面授权。

独立开发者,在 WordPress、Nginx 和各种 API 之间切换。不写没用的东西。

相关文章

使用宝塔面板配置 Nginx fastcgi_cache 优化 WordPress 网站性能9 min宝塔 Nginx 限流配置速查:limit_req_zone 参数详解4 minMySQL 慢查询排查实录:从 PROCESSLIST 到 EXPLAIN 完整流程9 minLinux 负载排查方法论:Load Average 8.5、CPU 空闲 88%,从数字到底层 IO7 min
$ echo "less bullshit, more debugging" | send-to-inbox
新文章直接发到邮箱,一个月 2-4 封。
订阅