教你看懂 %st 乱飙!深入揭秘 VPS 厂商的 CPU 偷窃(Steal Time)与 IO 限制套路
2026-08-14 · DevCraft Studio
明明买的是 2 核 VPS,用起来却比别人的 1 核还卡?这篇用大白话讲清 CPU 偷窃时间(%st)、磁盘 IO 的"爆高→限速"套路,以及共享 CPU 和独享 CPU 到底差在哪、该怎么选。
一、先说个扎心的事:我买的 2 核,为啥比别人的 1 核还卡?
不少朋友买 VPS 时都踩过这个坑:配置表上清清楚楚写着"2 vCPU / 2GB RAM",价格也不算便宜,结果一上手——编译个程序卡半天,网站晚高峰响应慢得想砸键盘,用 top 一看自己的程序 CPU 占用才 30%,可机器就是慢。转头问群友,人家一台 1 核十几块钱一年的机器反而飞快。
这时候你心里大概率会冒出一句:"这商家是不是骗我,给我的核是假的?"
其实不是核假,而是——这台物理服务器上,不止你一个人在用。你买的"2 核",是和一堆邻居共享同一颗真实物理 CPU 的。等邻居们都在干活的时候,分给你的那点算力就所剩无几了。这就是圈内常说的"超卖",而它最直接的证据,就藏在 top 命令里那个不起眼的 %st 指标上。
这篇我们就把这个 %st(CPU Steal Time,中文叫"偷窃时间")彻底讲明白,顺便把磁盘 IO 上另一个常见套路——"开机爆快、五分钟后变软盘"——也一并拆穿。看完你就能自己动手,判断一台 VPS 到底有没有被超卖、被坑了多少。
二、%st 到底是什么?先把它从 top 里揪出来
%st 是 CPU 统计行里的最后一列,全称 steal time(偷窃时间)。在 Linux 里,你敲 top 命令,最上面那行 %Cpu(s): 就是它:
top
%Cpu(s): 2.3 us, 1.1 sy, 0.0 ni, 78.4 id, 0.2 wa, 0.0 hi, 0.1 si, 17.9 st这串字母分别代表:us(用户进程占用)、sy(系统占用)、ni(调整过优先级的)、id(空闲)、wa(等 IO)、hi/si(硬/软中断),最后的 st 就是偷窃时间。
它说的是这么一件事:你的虚拟 CPU 早就准备好要干活了,但宿主机(hypervisor)却把这块物理 CPU 时间给了别的虚拟机。换句话说,你的算力被"偷"去给别人用了,你只能在旁边干等。
除了 top,还有两个更常用的命令能看它:
# 方法一:vmstat,每秒刷新一次,最后一列 st 就是偷窃时间
vmstat 1
# 方法二:mpstat,按核心显示,%steal 列就是,适合观察每个核
apt install sysstat -y # Debian/Ubuntu
yum install sysstat -y # CentOS
mpstat -P ALL 5新手记住一个结论就够了:st 长期接近 0,说明你买到的 CPU 是真金白银的;st 长期两位数,说明你的机器正在被邻居挤占。
三、用大白话讲清:你的算力是怎么被"偷走"的
要理解这个"偷",得先知道 VPS 是怎么造出来的。
数据中心里有一台真实的物理服务器,上面插着一颗(或几颗)物理 CPU,比如一颗 32 核的 AMD EPYC。商家用一套叫"hypervisor(虚拟化层,常见的是 KVM、Xen)"的软件,把这台物理机切成很多台小虚拟机卖给你。你拿到的"2 vCPU",本质上是虚拟化层分配给你的一段"使用物理 CPU 的权利"。
问题在于:物理核就那么多,可商家卖出去的 vCPU 总数,往往远超物理核数。 比如一颗 32 核的物理机,商家可能卖出去 64 个 vCPU(超卖 2 倍),激进的甚至卖 320 个 vCPU(超卖 10 倍)。
平时大家都不怎么用,皆大欢喜,每台机器都能跑满。可一到晚高峰,邻居们同时开始跑任务,物理 CPU 就不够分了。这时候虚拟化层就得像个交警一样,按权重轮流分配时间片。轮到你时你确实在用,但轮到别人的时候,你就被"挂起"在门口等着——这段你干等着、啥也没干成的时间,操作系统就记成了 steal time。
所以一个简单的模型是:如果 st 长期是 20%,那就相当于——你那个理论上 2 核的机器,实际能稳定用到的只有大概 1.6 核的算力(粗略按 1/(1−0.2)≈1.25 倍时间膨胀来想)。一个本来 60 秒能跑完的活,实际要拖到 75 秒左右。偷得越狠,你越卡,而且这种卡从你机器内部是"看不见原因"的——你的程序 CPU 占用不高,可就是慢,因为真正的瓶颈在宿主机那一层,不在你里面。
四、%st 多少算正常?别自己吓自己,也别掉以轻心
很多新手一看到 st 有个 3%、5% 就慌了,其实大可不必。行业里普遍参考的经验值是这样的:
- 0% ~ 3%:优秀 / 正常。几乎感觉不到,属于虚拟化共享的正常开销。
- 3% ~ 5%:轻微争抢。偶尔有邻居在用,基本不影响体验。
- 5% ~ 10%:开始影响性能。延时会出现抖动,单个请求偶尔会莫名卡一下。
- 10% ~ 20%:超卖比较明显。吞吐下降,响应时间明显变"毛刺",交互类业务能持续感觉到。
- 20% 以上:资源紧张,得认真考虑换机器了。
- 50% 以上:严重争抢,这时候你买几核都白搭,大部分时间都在排队等 CPU。
还有个关键判断技巧:别只看一瞬间,要拉长看。 邻居半夜跑个备份、临时编译个大项目,st 瞬间飙一下很正常;真正要命的是"在你自己流量平稳的时候,st 长期、持续地高"。那种才说明这台母机被超卖得厉害。
另外要学会区分三种"慢":
- us/sy 高、st 接近 0:是你自己的程序在吃 CPU。病根在你代码里,优化代码或加核就能解决。
- st 明显高、但 us+sy 死活到不了顶:是宿主机在让你等。这个从机器里面怎么调都没用,唯一的治本办法是换一台不超卖的、或买独享 CPU。
- wa 高:那是在等磁盘 IO,跟 CPU 抢不抢完全不是一回事,得去查硬盘那一层。
五、一个小提醒:%st 高 ≠ 商家超售了 50%(很多人搞错)
这里必须纠正一个圈内流传很广的误区。经常有人拍胸脯说:"st 显示 50%,说明这台机器超售了 50%!"——这话不对。
st = 50% 只说明:你的 VPS 大概有一半时间在排队等 CPU 调度。它并不能反推出母机超售了多少。原因是你作为用户,根本不知道母机真实有多少物理核、开了多少台 VPS、总共分配了多少 vCPU、用的什么调度权重。
举个极端的例子就好懂了:
- 场景 A:物理机 32 核,总共卖出 64 个 vCPU(超售 2 倍)。
- 场景 B:物理机 32 核,总共卖出 320 个 vCPU(超售 10 倍)。
这两种情况下,因为你和邻居的使用习惯不同,完全可能测出一模一样的 st 值。所以 st 反映的是"此刻抢得凶不凶",而不是"超售比是多少"。超售比只有商家自己心里有数。
那 st 还有没有用?有,而且很有用——它不能告诉你超售比例,但能客观告诉你"我现在被挤占得厉不厉害"。配合下面这招更准:分别在白天、晚高峰、凌晨各测一遍。如果晚高峰 st 明显比凌晨高一大截,那就基本坐实了"这台机器资源共享很重",该考虑搬家了。
六、磁盘 IO 的套路:开机 460MB/s,5 分钟后变"软盘速度"
CPU 的坑讲完了,再说硬盘的坑。这个套路更隐蔽,因为几乎每个商家开机那一刻给你的速度都是真的快。
很多便宜 VPS 用的是一套"突发额度(burst credit)"机制:你刚开机、磁盘还干净、额度还满着的时候,读写能跑到几百 MB/s,IOPS 好几万,测速截图发群里特别好看。可这套额度是有限的"池子",你猛写几分钟就把池子抽干了,于是限速立刻生效,把你摁到一个很低很稳的"地板值"。
有实测数据很说明问题:某大牌便宜 VPS,4K 随机写开机爆发能到 24800 IOPS,但大约 8 分钟后就掉到稳定地板 11600 IOPS;顺序写开机 460 MB/s,12 分钟后掉到 185 MB/s,之后 70 多个小时都稳定在这个低速上。注意——它不是坏了,是商家故意这么设计的:给你一个好看的爆发值当门面,真要长时间写,就按地板走。
更惨的是某些"灵车"机器,地板值低到离谱,长时间一写直接掉到几十 MB/s,跟二十年前的软盘一个量级,数据库一跑迁移就卡死。这种机器,单看开机第一分钟的测速,你永远发现不了。
七、怎么测 IO 限速?dd 和 fio 两板斧
想识破这个套路,光跑一次 dd 不够,得拉长测、分步测。
第一板斧:dd 看顺序写入(图个直观)
dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=directoflag=direct 很关键,它绕过系统缓存,测的是真实磁盘而不是内存速度。连续跑两次取平均,能看个大概。但要提醒一句:dd 只能看顺序写,测不出随机 IO,参考价值有限,别全信它。
第二板斧:fio 看真实 IOPS 和"掉速点"(重点)
# 随机 4K 读写(数据库最吃这个),跑 30 秒
fio --name=randtest --ioengine=libaio --direct=1 --bs=4k \
--iodepth=32 --size=512M --rw=randrw --rwmixread=70 --runtime=30
# 顺序 1M 读(日志/备份场景),跑 30 秒
fio --name=seqtest --ioengine=libaio --direct=1 --bs=1M \
--iodepth=16 --size=1G --rw=read --runtime=30想抓"开机快、五分钟后慢"的掉速把戏,关键是用 --status-interval=10 把每秒 IOPS 打出来,连跑 5 分钟:
fio --name=burstdetect --ioengine=libaio --iodepth=64 \
--rw=randread --bs=4k --direct=1 --size=5G \
--numjobs=4 --runtime=300 --group_reporting --status-interval=10盯着 IOPS 那一列,如果前 30~90 秒很高、之后"啪"地掉到一个很低的平台并稳住,那低下来的那个数,就是你这台机器每天 24 小时真实能用的速度。判读经验:好的 NVMe 混合随机读写能到 4 万~8 万 IOPS;普通 SATA SSD 大概 5 千~1.5 万;如果开了 direct=1 还低于 3000 IOPS,基本就是被限速或用了机械盘了。
八、共享 CPU / 独享 CPU / 突发 CPU,到底差在哪?
讲了这么多"被偷",根源都在于你的 CPU 是共享的。现在把三种 CPU 类型一次性说清:
1)共享 vCPU(Shared / Burstable,最常见、最便宜) 一颗物理核同时卖给 4 个、8 个甚至 10 个用户。你邻居闲着时,你能用满整颗核,机器飞快;邻居一忙,你的算力就被分走。行业把这种"一个核卖给几个人"叫 overcommit(超售/超分配),常见比例:
- 4:1:比较温和,体验通常能接受;
- 8:1:激进,晚高峰能明显感觉到慢;
- 10:1 及以上:严重超售,表现很不可预测。
打个比方:你跟另外 9 个人共用一条车道。凌晨 3 点路上空荡荡,你一路全速;下午 5 点下班高峰,10 辆车挤一块,大家全龟速。共享 CPU 就是这么回事——你完全看不见邻居在干啥,也预测不了他们啥时候忙,只能感觉到自己突然变慢了。
2)独享 CPU(Dedicated vCPU / VDS) 物理核被单独钉(pin)给你一个人,不跟任何人共享、不超售。你付 2 核,就真有 2 颗物理核 24 小时归你独占,凌晨和晚高峰表现一模一样。代价是贵不少,因为商家一颗核只能卖一次。
3)突发 CPU(Burstable,云计算里常见,如 AWS T 系列) 给你一个很低的"基线"算力保证,平时闲时你可以"借"额度飙到很高;等到额度(burst credit)耗尽,性能就掉下去,表现出来就是 st 突然飙高。适合白天闲、偶发忙的轻量业务。
一句话总结区别:共享 = 拼人品看邻居;独享 = 花钱买确定性;突发 = 平时省、偶尔冲。
九、到底该选哪种?给你一张对号入座的表
别一听"共享会被偷"就觉得非独享不可,那是浪费钱。按用途选才聪明:
- 挂博客 / 跑脚本 / 学 Linux / 个人练手:共享 CPU 完全够。这类活儿都是"突发型"的,99% 时间空闲,邻居也大多空闲,抢不到 CPU 的概率很低。RackNerd、ColoCrossing、CloudCone 这种十几块一年的共享机器,干这个绰绰有余。
- Docker / 自建工具 / 小型动态网站:共享也基本 OK,但建议挑口碑稳、超售轻的商家,并养成看
%st的习惯。 - 数据库 / 游戏服务器 / 实时 API / 晚高峰必须稳的业务:上独享 CPU。这类活儿最怕尾部延迟抖动,被邻居偷一下就超时,花独享的钱买的是"确定性"。
- 短期测试 / 多地区切换:用 Vultr 这种按小时计费的,用几天就删,独享还是共享随你挑,不心疼。
还有个特别实用的小技巧:新机器到手,先建个"性能基线"。 刚开机跑一遍 vmstat 1 和 fio,把正常的 st、IOPS 数值记下来。过一两周如果突然变慢,再测一遍对比——是母机被超卖加重了,还是你自己程序长大了,一眼就分清,不用瞎猜。
结论
总结一下今天说的三件事:
- %st 是 VPS 超卖的"照妖镜"。
top里 st 长期接近 0 说明算力没被偷;长期两位数说明你正和一堆邻居抢一颗物理核。但它只反映"抢得凶不凶",不等于超售比例,判断时记得在白天、晚高峰、凌晨分三次测。 - 磁盘 IO 的套路是"爆发→限速"。 开机几百分 MB/s 是给你看的门面,真正要命的是 5~10 分钟后的地板速度。用
fio --status-interval=10拉长跑,低下来的那个数才是你每天真实能用到的。 - 共享 / 独享 / 突发,本质是"省钱"和"确定性"的取舍。 博客脚本用共享就够,数据库和实时业务就乖乖上独享,别为了省几块钱把正经业务搭进去。
买便宜 VPS 不丢人,丢人的是买了被超卖得妈都不认识还不知道。下次机器一卡,别急着骂商家,先敲个 top 看看 %st——数据不会骗你。
延伸阅读
更多相关攻略推荐:【发行版选型 10】如何选择合适的 Linux 发行版、主机商涨价或跑路怎么办?基于 Docker 与 Restic 的 V、VPS 装什么系统好?Ubuntu、Debian、CentOS 大白、【安全基线 01】加固 SSH 与 Fail2ban、【购买指南 01】新手如何选购第一台 VPS:配置/线路/支付/退款。