文章

机器没跑满却越来越慢:先盯 CPU 那一行里的 st

静水流深 昨天 07:40 · 1,340 字 · 约 4 分钟 · 23 次阅读
我发布了文章:《机器没跑满却越来越慢:先盯 CPU 那一行里的 st》

便宜机上最难受的不是慢,是慢得说不清

同一台 1 核 1G 的小机器,前几天还好好的,这两天开个后台页面要等三四秒。登上去看进程,没有一个在吃 CPU,load average 也不高,内存还剩一半。这时候八成人会怀疑自己装的什么东西写崩了。其实先把目光从进程列表挪到顶上那行 CPU 统计,答案多半就躺在那儿。

st 这一列到底在说什么

top 顶部第二行是 CPU 时间的去向,默认长这样:us, sy, ni, id, wa, hi, si, st。最后那个 st,man page 的解释很干脆:time stolen from this vm by the hypervisor,被宿主机从你这台虚拟机里偷走的时间。说人话就是:你的进程想跑,物理核被别人占着,CPU 没轮到你。

vmstat 里同样有这一列,含义一致:st: Time stolen from a virtual machine。旁边还有个 gu,是真正跑在 guest 里的时间。看这两个数字的关系,比盯 load 靠谱得多。

三个最容易看错的地方

第一,vmstat 的第一行是开机至今的平均值,不是当下。想看现在,一定带间隔跑:vmstat 1,让它每秒刷一行,或者加 -y 直接把那行开机均值跳掉。拿一台开机 30 天的平均值去判断今晚卡不卡,等于没看。

第二,别把 wa 当成被抢。wa 是等 I/O,磁盘慢、数据库在刷盘都会让它高,那是另一回事。wa 高而 st 低,问题在盘;st 高而 wa 低,问题出在 CPU 配额。

第三,不是每台机器都给这一列。man page 里写得很清楚:Depending on your kernel version, the st field may not be shown。没这列不代表没事,只代表这台机器给不了你这个视角。

我的判断线,以及它证明不了什么

先说清楚,下面不是任何行业标准,是我自己用的经验值:持续采样下 st 长期在个位数百分比,便宜机上可以接受,别折腾;时不时冲到十几二十,说明母机确实挤,别在上面放对响应敏感的东西;常年两位数,这台机器就当它没有 CPU 保障,能用,但别把业务押上去。

它也不能当超卖的铁证。st 高只说明你要的 CPU 没拿到,原因可能是邻居在抢,也可能是商家给你的本身就是限速档,这两件事从 guest 里看长得一模一样。真要定性,得拿连续采样的数据去问工单。

留证据比吵赢工单重要

我习惯开机器头几天就跑一次基线,之后固定时段再采,把输出直接追加进同一个文件:

vmstat -y -t 1 60 >> ~/st-baseline.txt   # 采 60 秒,带时间戳,跳过开机均值
top -b -n 1 | head -5 >> ~/st-baseline.txt

-t 给每行加时间戳,-y 去掉那行开机均值;top -b 是批处理模式,适合丢进脚本和定时任务。攒上三四次,商家有没有在悄悄缩水,一眼看得出来。

拿到数字之后干什么,取决于你在哪个窗口:还在退款期里,直接开工单贴采样,要求换母机或者退款;过了窗口,就把数据留着当迁移依据。别在工单里跟人吵“你是不是超卖了”——对方永远不会承认,但看到你把采样贴出来,多半会给你换个节点。

最后一句边界:本文说的只是 CPU 时间这一项,磁盘被邻居抢走是另一套判断。而且 st 跟线路质量完全无关,这台机器到中国大陆访问怎么样得另外实测,测不了就写未测试。

登录 后参与评论

还没有人评论,来抢沙发