技术指南
VPS 测评协议:保留原始样本、波动与适用边界
先固定场景、环境、测试预算和停止条件,再用重复样本、原始输出与波动范围形成可复查的 VPS 测评结论。
可信的 VPS 测评不是把几张峰值截图排成名次,而是让另一位测试者知道:测了哪台实例、为哪个负载、在什么环境和时间窗、消耗了多少资源、原始样本如何波动,以及结论到哪里失效。先写实验契约,再运行命令;单次结果只能成为一个样本,不能直接变成“稳定”“线路好”或“适合生产”的判断。
先把用户问题写成可证伪的测试契约
| 字段 | 要写清楚什么 | 避免的误判 |
|---|---|---|
| 场景 | 静态站、数据库、CI、代理或学习机 | 所有负载共用一个总分 |
| 成功条件 | 例如 p95 响应、并发、恢复时间或构建时长 | 只比较峰值吞吐 |
| 实例边界 | 套餐、区域、虚拟化、镜像、内核、购买周期 | 同名套餐长期不变 |
| 测试预算 | 持续时间、样本数、文件/流量上限、冷却时间 | 无限压测才更准确 |
| 停止条件 | 空间、温度/负载、业务延迟、错误率和费用阈值 | 为了凑结果继续施压 |
| 复查触发 | 迁移、套餐/价格/线路变化或异常反馈 | 一次结果永久有效 |
scenario: static-site-origin
success:
p95_total_ms: '< 250'
error_rate: '< 0.1%'
instance:
plan: replace-me
region: replace-me
measurement:
samples: 5
windows_utc: ['03:00', '12:00']
max_test_gib: 1
stop_if:
disk_free_percent: '< 20'
workload_p95_ms: '> 400'每轮先保存机器、负载和存储基线
date --utc --iso-8601=seconds
uname -srmo
systemd-detect-virt
lscpu --json
free --bytes --wide
lsblk --json --bytes --output NAME,TYPE,SIZE,ROTA,PHY-SEC,LOG-SEC,MOUNTPOINTS
df --block-size=1 --output=source,fstype,size,avail,target /path/to/test
cat /proc/loadavg`free` 的 available 是在不发生交换的前提下启动新应用可用内存的估算,不等于 free 列;`lsblk` 的默认列会变化,脚本应显式指定列,并用 MOUNTPOINTS 保留一个文件系统的全部挂载点。CPU 型号、vCPU 数和磁盘名称也不足以证明独占资源,应同时记录虚拟化、steal/load、文件系统和测试时的其他进程。
一类指标只回答一个问题
| 测量 | 可以支持的判断 | 不能单独证明 |
|---|---|---|
| CPU 固定算法 | 同一算法和版本下的吞吐与波动 | 通用应用性能或持续配额 |
| 文件 I/O | 指定文件系统、块大小、队列模型的结果 | 云卷所有 IOPS/延迟场景 |
| ICMP RTT/丢包 | 该协议、源和目标之间的样本 | HTTP 可用性或带宽 |
| iperf3 | 两个受控端点间的 TCP/UDP 吞吐 | 所有用户地区和目的服务 |
| curl 时间 | DNS/连接/TLS/首字节/总耗时分段 | 服务端内部根因 |
| 路径追踪 | 某时刻可见的转发路径 | 运营商产品标签或反向路径 |
每个结果都要绑定工具与版本、完整命令、UTC 时间、源/目标、IP 协议、样本数、冷/热状态和原始输出。先定义派生指标,再计算中位数、p95 或 spread;只发布平均值会隐藏长尾,只发布最好值会隐藏竞争。
CPU 微基准固定算法、时长和并行度
for run in 1 2 3; do
openssl speed -elapsed -seconds 1 -bytes 16384 -mr sha256 \
>"cpu-${run}.out" 2>&1
sleep 1
done运行前后都保存 load、steal、频率/调度信息和失败状态。共享 vCPU 若在不同时间窗出现明显 spread,应报告分布和最差窗口,而不是增加线程把总吞吐做大。跨架构比较必须说明算法实现和硬件加速差异。
磁盘测试只写受控临时文件
workdir=$(mktemp -d /tmp/vps-review.XXXXXX)
trap 'find "$workdir" -depth -delete' EXIT
test "$(df --output=avail -B1 "$workdir" | tail -1)" -gt $((512*1024*1024))
for run in 1 2 3; do
time head --bytes=67108864 /dev/zero >"$workdir/io.bin"
sync -d "$workdir/io.bin"
time sha256sum "$workdir/io.bin" >/dev/null
done| 必须固定 | 原因 |
|---|---|
| 路径与文件系统 | 不同挂载和云卷不是同一存储层 |
| 文件大小与块大小 | 缓存命中和 I/O 合并会改变结果 |
| direct/sync 语义 | durability 与 page cache 边界不同 |
| 读写/顺序/随机/队列深度 | 它们代表不同工作负载 |
| 预热、运行时长与冷却 | 突发额度和后台回收会制造峰值 |
| 总写入量 | 保护 SSD 寿命、配额和邻居 |
GNU `dd` 的 `direct` flag 会请求 direct I/O,但内核可能施加对齐限制;`fdatasync` 只在结束前同步输出数据。需要随机读写、延迟分位数和队列深度时,使用适合的基准工具及经过审查的 job file;不要从 `dd` 的单个 MB/s 推导 IOPS 或数据库延迟。
网络结论拆成可达、时延、吞吐、路径和应用五层
| 层 | 对端要求 | 最少输出 |
|---|---|---|
| 可达性 | 真实服务端口 | DNS、TCP/TLS/HTTP 状态与失败原因 |
| RTT/丢包 | 多个用户区域探针 | 源、目标、IPv4/IPv6、count、min/avg/max/mdev |
| 吞吐 | 自己控制的 iperf3 两端 | 方向、时长、streams、sender/receiver 与 JSON |
| 路径 | 目标用户网络中的探针 | UTC、源 ASN/地区、每跳地址和丢失 |
| 应用 | 代表性 URL/请求 | 状态、内容校验、分段时间和并发 |
ping -4 -n -c 20 -W 1 -I SOURCE_ADDRESS TARGET
ping -6 -n -c 20 -W 1 -I SOURCE_INTERFACE TARGET
# ICMP 只验证该路径样本;再检查实际服务
curl --fail --silent --show-error --output /dev/null https://TARGET/health`ping` 使用 ICMP Echo,能明确 count、deadline、timeout、源接口和 IPv4/IPv6,但目标可能限速或禁用 ICMP。0% ICMP 丢包不等于应用健康,ICMP 丢包也不必然等于 TCP/QUIC 同比例丢包;结论必须回到真实端口和用户区域。
吞吐只在两个受控端点间测
# server: limit duration and run only on an authorized host
iperf3 --server --one-off --server-max-duration 30
# client: save upload and reverse-direction JSON separately
iperf3 --client SERVER --time 15 --omit 3 --json > upload.json
iperf3 --client SERVER --time 15 --omit 3 --reverse --json > download.json带宽测试与路径测试都要来自目标用户侧,而不只从 VPS 向热门站点发起。至少分开 IPv4/IPv6、上行/下行、不同运营商/地区和不同时段;共享带宽的短时 burst、月流量与超量规则属于套餐证据,不属于测速推断。
路径标签必须由多点原始路径支持
- 保存源地区、运营商/ASN、目标地址、UTC 与工具版本;匿名截图不足以复查。
- 正向和反向路径可能不同,单侧 traceroute 不能证明“回程”。
- 中间跳不回应或限速不表示端到端丢包;先看最终目标和应用证据。
- CN2、AS9929、CMI 等营销标签需要可复查的 ASN/路径样本,并限制到该时间与方向。
- 路由会变化;大促、迁移、异常反馈和定期窗口都应触发复测。
用真实工作负载把资源指标变成用户结果
curl --fail --silent --show-error --output /dev/null \
--write-out '{"code":%{response_code},"dns":%{time_namelookup},"connect":%{time_connect},"tls":%{time_appconnect},"first_byte":%{time_starttransfer},"total":%{time_total},"bytes":%{size_download}}\n' \
https://example.test/representative-path| curl 字段 | 用途 | 边界 |
|---|---|---|
| time_namelookup | 名称解析完成时间 | 受 resolver/cache 影响 |
| time_connect | TCP 建连完成时间 | 包含此前阶段 |
| time_appconnect | TLS 等应用连接完成时间 | 协议与会话复用会改变结果 |
| time_starttransfer | 收到首字节时间 | 包含服务端处理与此前阶段 |
| time_total | 完整传输时间 | 响应大小必须同时保存 |
| response_code / bytes | 确认返回语义与载荷 | 200 仍需内容校验 |
先单请求确认语义,再用代表性并发和数据集测试。记录缓存冷热、数据库规模、TLS/HTTP 版本、连接复用、响应大小、错误率和服务器侧 CPU/内存/I/O。静态文件快不代表 WordPress 或数据库快;本地 loopback 快也不代表用户网络快。
重复样本要跨时间窗,而不是连续刷最好值
| 阶段 | 建议证据 | 何时暂停 |
|---|---|---|
| 预检 | 基线、空间、业务健康、测试预算 | 任何边界不清楚 |
| 预热 | 固定次数并标注不计入统计 | 错误或负载无法恢复 |
| 样本 | 至少三次原始结果与退出状态 | 超过停止条件 |
| 冷却 | load、空间和业务指标回到基线 | 未恢复则不继续 |
| 复测 | 目标用户白天/峰值、IPv4/IPv6 和多区域 | 对端未授权或流量预算不足 |
{
"test_id": "cpu-sha256-20260816T2100Z",
"scenario": "repeatability-fixture",
"command_sha256": "...",
"tool_version": "OpenSSL 3.0.13",
"samples": [265355264, 246071296, 269926400],
"median": 265355264,
"range_over_median_percent": 8.99,
"unit": "bytes_per_second",
"limitations": ["one host", "three one-second samples"]
}发布原始样本、派生值和失败样本
- 给每轮 test_id,保存 stdout/stderr、退出码、UTC 起止时间和命令哈希。
- 原始文件只追加;派生 JSON/表格记录脚本版本,重算不覆盖原样本。
- 中位数与 p95 同时附样本数和 spread;样本太少时不发布长尾百分位。
- 超时、错误和被停止的运行进入结果集,不从图表中删除。
- 日志去除令牌、Cookie、客户数据和不可公开 IP;公开前单独审阅。
- 报告标明未运行的测试、无 IPv6/无目标地区探针等缺口。
价格、条款和利益关系单独取证
- 保存套餐页、结算页、币种、税费、首购/续费、周期、流量、超量和快照/备份费用的核对时间。
- 退款、SLA、滥用和取消规则引用当前官方条款;工单或口碑作为另一类证据,不冒充条款。
- 优惠、库存、线路和配置都加复查日期;无法持续复查时写成历史快照。
- 披露样机、赠金、联盟链接和付费关系,并让相同测试协议也适用于无佣金候选。
- 采购结论纳入迁移、备份恢复、支持和账号风险,不只除以跑分。
结论写成适用矩阵和失效条件
| 结论部分 | 必须回答 |
|---|---|
| 适合 | 哪些场景在本次门禁内通过,证据是什么 |
| 不适合 | 哪项硬门槛失败或尚未验证 |
| 波动 | 中位数、最差窗口、spread 与错误样本 |
| 未知 | 未覆盖的地区、协议、持续时间或工作负载 |
| 成本 | 首购/续费/附加费用和取证日期 |
| 替代 | 如果关键门槛失败,下一候选为什么更合适 |
| 失效 | 何种价格、迁移、路由、硬件或时间变化触发复测 |
本次演练验证了重复采样协议
VPScope 在一次性 0600 临时目录中保存机器可读基线,运行三次 OpenSSL SHA-256 一秒样本、三次 64 MiB direct write/read,以及五次 256 KiB loopback HTTP 和五次 loopback ICMP。CPU 三个样本的 range/median 为 8.99%;direct write 为 17.894%,direct read 为 38.517%。五次 HTTP 都返回 262,144 bytes,但首次 total 为 18.553 ms,之后为 1.463–2.013 ms,中位数 1.890 ms,清楚显示冷启动样本不能被静默丢弃。
演练只验证采集、重复、派生统计、边界与清理:64 MiB 临时文件不足以描述持续存储,loopback 不能描述提供商网络,单台主机单个窗口不能比较商家或长期稳定性。本批次没有安装/运行 iperf3,没有访问外部测速节点、提供商 API 或生产负载;临时目录完整删除。
一篇可发布测评的验收清单
- 场景、硬门槛、实例、时间窗、预算、停止条件和复查触发都已写明。
- 机器、虚拟化、内存、块设备、文件系统、负载和工具版本可复查。
- 每个指标说明能回答和不能回答的问题,不用单次峰值替代稳定性。
- 磁盘只写受控临时文件;网络只测授权对端,并记录方向、IP 族和流量。
- 至少保留三次原始样本、失败样本、退出状态、中位数和 spread。
- 应用探针校验状态、内容、响应大小和分段耗时,并能关联服务端证据。
- 目标用户区域、峰值窗口、IPv4/IPv6 与正反方向的缺口被明确标注。
- 价格、续费、条款、利益关系和取证日期与性能证据分开。
- 结论包含适合、不适合、未知、替代项和明确失效条件。
- 公开文件已经去除凭据和客户数据,原始证据仍可重算。