本文译自 kikomono.com 英文原文《Check VPS disk speed before you trust the NVMe label》,作者 Rita。原文链接:https://kikomono.com/guides/check-vps-disk-speed/
简短回答
在共享 VPS 上,销售页上的硬盘不是你实际拿到的硬盘。你拿到的是它的一份,与邻居共享、可能被限速,也可能只在突发额度还没用完时才快。检查工具是 fio,标准的 Linux 磁盘基准测试:一次小数据块随机读测试,一次大数据块顺序测试,两次都用直接 I/O,这样页面缓存就没法把结果美化。每项测试至少在一天的不同时段各跑两次,跑在事后要删掉的临时文件上。先把几次运行结果相互比较,再去和别的任何东西比较——一台凌晨 3 点很快、晚上 8 点很慢的磁盘,告诉你的是主机的情况,不是你的工作负载的情况。
这项测试要在试用期或退款期内做,在测试服务器或全新安装上做,不要在正式数据库上做。写测试会写入真实数据,在生产卷上跑基准测试是风险,不是测量。
磁盘速度决定什么——以及不决定什么
磁盘速度决定服务器在真正等待磁盘时读写有多快:没命中缓存的数据库查询、图片上传、备份、日志写入,以及还没有任何缓存的页面的首次加载。它不决定一切感觉慢的东西。一个在等慢数据库查询、过载 CPU 或远方访客的页面,放在世界上最快的硬盘上还是慢。所以这项检查要放在其他购买检查旁边,而不是代替它们:英文原文中的 NVMe 验证指南确认你实际拿到的是哪种硬盘,英文原文中的偷取时间检查告诉你 CPU 是不是被借给了邻居。磁盘速度是同一条凳子的第三条腿。
磁盘测试会得出三个数字,分别回答三个不同的问题:
- 吞吐量(MB/s)——每秒移动多少数据。这个数字对备份、上传和大顺序读取重要。
- IOPS——每秒完成多少次小操作。这个数字对数据库和繁忙网站重要,因为那里的工作是成千上万次小读写,而不是一个大文件。
- 延迟(ms)——一次操作要等多久。吞吐量不错但延迟高,意味着请求在排队:即使总量看起来没问题,页面给人的感觉还是迟缓。
只报其中一个数字的销售页,是在藏起另外两个。一台小 VPS 的顺序吞吐量可以很好看,而随机 IOPS 在数据库负载下垮掉,而这正是不断增长的网站实际跑的工作负载。
测试:两次 fio 运行,直接 I/O,只用临时文件
fio 是常用的工具,大多数发行版的软件仓库里都有。如果没有装,只在测试服务器上装——永远不要只为了跑基准测试就在正式网站上装。在有足够空闲空间的空目录里跑两次测试,跑完删掉测试文件。
测试一:随机读,4K 数据块——数据库测试
fio --name=randread --rw=randread --bs=4k --size=1G --numjobs=1 --runtime=60 --time_based --direct=1 --group_reporting
随机 4K 读是最接近数据库和小文件工作的简单替代。--direct=1 这个标志最重要:没有它,Linux 会从内存缓存里提供大部分测试内容,你最后测的是内存,不是磁盘。--size=1G 的文件必须能宽松地放进空闲空间——在小磁盘上,宁可把它改小,也不要把卷填满。
测试二:顺序写,1M 数据块——备份测试
fio --name=seqwrite --rw=write --bs=1M --size=1G --numjobs=1 --runtime=60 --time_based --direct=1 --group_reporting
顺序写是备份和上传测试:大块、有序,而且是硬盘最容易出好成绩的数字。跑它的意义正在于此。连最简单的测试都慢,磁盘就是慢。简单测试快、随机测试不快,说明这块盘适合存文件、不适合数据库——你现在知道它适合哪种网站了。
两次跑完之后,删掉测试文件(在测试目录里运行 rm -f randread.* seqwrite.*,或者用 fio 报告的文件名),再用 df -h 确认空间回来了。在一块 25 GB 的盘上留下一个 1 GB 的基准测试文件,基准测试本身就已经改变了它测量的服务器。
为什么一次运行会骗人:缓存、邻居和突发额度
三种效应会让单次基准测试不可信,每种的修正办法都不同:
- 缓存。没有直接 I/O,读操作来自内存,看起来快得不可能。修正办法:始终使用
--direct=1,对任何快到硬盘不可能做到的结果都存疑。 - 邻居。在共享主机上,另一个客户的备份或构建可能让你的数字一小时内减半。修正办法:在一天的不同时段重复测试,包括一个繁忙的晚间时段,并把时间戳和结果一起保存。
- 突发额度。有些套餐允许磁盘在信用额度用完之前高速运行,之后就限速。在突发窗口里跑一次短测试,测到的是突发速度,不是持续速度。修正办法:跑更长的测试(至少 60 秒),第二天再重复一次,留意第一次和第二次运行之间是不是出现了大幅下降。
如果数字在几次运行之间变化很大,这种变化本身就是结论。一块随机读 IOPS 每天晚上都减半的磁盘,不管它最好的那次运行说什么,都不是你能拿来规划不断增长的网站的磁盘。
不用阈值表,怎么读输出
你找不到一份已公布的共享 VPS 套餐“最低可接受 IOPS”,因为服务商没有承诺过这个数字——任何印出通过/不通过分界线的文章,都是在编造一个没人签过的规格。改用比较的方法来读输出:
- 把几次运行相互比较。同一台服务器、同一个测试、不同时段。数字稳定意味着份额稳定;剧烈波动意味着争用。
- 把两次测试相互比较。顺序远高于随机是正常的;顺序飞快、随机接近于零,就是对数据库工作的警告。
- 把延迟和吞吐量一起读。在 fio 的输出里,
lat一节显示平均延迟和百分位延迟。一次吞吐量体面、但 95 百分位延迟达到几十毫秒的运行,访客会觉得慢,因为二十分之一的请求就要等那么久。 - 对照你的工作负载比较,而不是对照另一台服务器的头条数字。只提供缓存页面的静态网站几乎不碰磁盘;WooCommerce 或论坛数据库几乎每次请求都要碰磁盘。同样的数字,对前者可能绰绰有余,对后者可能是瓶颈。
把带日期和时间的原始输出保存下来。它是客服工单需要的证据(“随机读 IOPS 每天晚上都减半,这里是三天的运行记录”),也是你在任何迁移、升级或“服务器变慢了”的投诉之后重新跑的基线。
数字说搬家、升级还是接受时
这项检查只会得出三个决定,而且只有三个:
- 接受:数字在不同日期和时段都稳定,实际工作负载下的延迟也保持低位。一块稳定但平庸的磁盘,胜过一块先快后被限速的磁盘。
- 换节点或换服务商:数字随一天中的时段剧烈波动,或者吞吐量保持而延迟飙升。这种模式指向共享主机,而不是你的配置,服务器里的任何设置都修不好它。搬家之前的配套检查是英文原文中的备份恢复测试:一个无法恢复的快磁盘不是升级。
- 升级磁盘档次,而不是整台服务器:数字稳定,但持续低于你的工作负载需要。更多的 CPU 修不好磁盘瓶颈,为了逃离慢磁盘而买更大的服务器,是买存储速度最贵的方法。
如果数字只在试用第一个小时里不好,在笔记里写明这一点,决定之前再测一次——一台刚装好、正在做首次更新的新服务器不是公平的样本。但如果这种模式持续了好几天,就要相信模式,而不是销售页。标签上写的是 NVMe;基准测试说的是你实际分到的那一份到底有多快。
本文事实来源
以上全部是标准的 Linux 工具和共享主机行为,不是厂商说法:fio 的标志、直接 I/O 和延迟百分位都在它自己的手册里有记录,而且没有一家服务商会为共享套餐公布有保证的 IOPS 数字——这正是本指南给你比较方法、而不是阈值表的原因。本指南不含联盟链接——如果某条链接将来会产生收益,我们会在承载它的句子里说明。配套检查见英文原文中的 NVMe 验证、CPU 偷取时间检查和小 VPS 先坏什么。
发表回复