三种机器,用同一张监控表来分
账单上的名字可以很满:云服务器、云主机、VPS、独立服务器、裸金属。 换机器之前,先把它们收成监控里能核对的三列:CPU 时间被谁拿走,内存上限卡在哪,磁盘等待堆在谁的队列里。 对得上自己的曲线,再决定留在云上还是换成整机。
云服务器
常见云服务器是 KVM 一类虚拟机,宿主上还有别的租户。 客户机里能看到 steal:你的 vCPU 已经可以运行,这段时间却分给了别人。 磁盘多半是网络卷,IOPS 按规格或积分计算。内存有规格上限,宿主还可能用 balloon 把暂时用不到的页收回去。 独立服务器和云服务器的区别,先看这三列有没有「别人」。
VPS
VPS 先分清是虚拟机还是容器。虚拟机形态的 VPS 和云主机是同一套曲线,核数和内存上限通常更小。 容器形态没有 steal 这一列。CPU 被配额卡住时,数字出现在 cgroup 的节流次数里;内存上限写在内存控制器上。 把容器节流读成「机器故障」会误判。把它读成「规格到顶」,才和虚拟机的 steal 对得上。 VPS 和独立服务器的区别也在这里:VPS 仍是从一台宿主上切出来的一份,整机则把调度器交给一个租户。
独立服务器与裸金属
独立服务器和裸金属在这篇里指同一件事:整机交给一个租户。 宿主操作系统里,steal 应接近 0,因为调度队列上没有另一家客户。 磁盘是插在这台机器上的 NVMe。内存是这台上的物理条,容量在下单时选定。 裸金属服务器和云服务器的区别,用这三列就能核对,不必先背一份产品定义。
整机拿掉的是共享调度。慢 SQL、缺索引、锁等待还在原处。用户离机房很远时,往返时间也不会因为 steal 消失而变短。先确认慢在算力和磁盘,再算月租。
CPU 被抢走时,steal 会连续偏高
steal 是客户机里「我想跑,宿主持有 CPU」的时间。
Linux 上 vmstat 的 st、top 的 %st,都是这个百分比。
用 Prometheus 时,取 node_cpu_seconds_total 的 steal 模式做 rate,再按核平均。
取样放在业务高峰,间隔 1 秒或 10 秒,至少盖住 5 个工作日。凌晨备份单独看,不要和午高峰合成一条结论。
偶发几秒到十几秒的 steal,是邻居的短时突发,云主机可以继续留。 规格没变、业务也没变,高峰里 steal 多次爬到大约 10% 以上,每次维持好几分钟,接口 p95 同时抬高:CPU 是被邻居长期抢走的。 这时加 vCPU 常常帮不上。核更多,在已经挤满的宿主上只是多排一次队。
另一种高峰要分开记。user 加 sys 接近打满,steal 接近 0:算力是你自己用完的。 先在云上加大 CPU 规格。加大之后,steal 仍在业务时段反复出现,再把换整机放上桌面。 只凭「CPU 很高」搬家,会把一台仅仅需要加核的云主机,换成一块用不满的整机。
它不是告警规范。延迟预算更紧,线就画低一些;批处理可以等,线就画高一些。要一起成立的是:连续多个业务日,而且 p95 同向移动。
容器 VPS 没有 st 列。去 CPU 控制器的 cpu.stat 读 nr_throttled 和 throttled_usec。
业务时段里节流时间持续增加,含义和 steal 同类:配额到了。
配额已经加到这家 VPS 的上限,节流还在,就和虚拟机 steal 用同一条判断。
整机的宿主系统上,steal 应停在 0 附近。 你若再在上面开自己的虚拟机,客户机里仍会出现 steal。那是这 32 核在你自己的虚拟机之间分配,来源是你的调度,旁边没有另一家租户。
内存工作集过了云主机上限
工作集是这段时间里被反复碰到、必须留在内存里的页。
Linux 会把空闲内存拿去当缓存。MemAvailable 偏低、延迟却稳,多半还在缓存区,继续留在云上。
看到「内存使用率 90%」就换整机,经常买到一块用来装缓存的内存。
该记下的是这几件一起出现。业务时段 vmstat 的 si、so 持续不为 0。
主要缺页升高,数据库延迟跟着走。内核日志里出现 OOM。
数据库想要的缓冲池已经大于这台云主机的内存上限,云厂商的规格表里没有更大一档,或者下一档换成了你不能用的机型。
balloon 会让客户机在进程看起来还没占满时就感到压力,因为宿主把页收回去了。先确认压力来自气球还是来自工作集,再决定加内存还是离开这台宿主。
工作集大约 32GB、没有 swap、没有 OOM:在云上加一档内存即可。 工作集已经顶到这家云卖给你的最大内存,下一档不存在,才轮到整机的两档。 两档都是 DDR4-3200 ECC RDIMM,128GB 或 256GB。下单后不能加条。 按高峰工作集,加上操作系统和页缓存要留的余量来选。工作集放不进 128GB,选 256GB,月租 $592。 两档都放不下,这台机器的内存上限也接不住,换过来解决不了。
可用内存低、延迟稳定,先当作缓存。业务时段持续换页、OOM,或缓冲池已经大于云主机内存上限,再把工作集记成一条成立的信号。
磁盘队列把数据库提交拖慢
数据库变慢时,先看数据盘队列,再看网卡流量。
iostat -xz 1 里,数据盘的 aqu-sz 是平均队列长度,w_await 是写等待。
OLTP 在意提交时的 fsync。备份时的顺序读带宽说明不了白天的提交。
业务高峰里,数据盘 aqu-sz 经常大于 1,w_await 走到几十毫秒,慢日志里的 commit 时间一起变长:队列已经在拖数据库。
这时吞吐可以仍然不高,每秒写入的兆字节解释不了等待。
云上的网络卷还会叠 IOPS 积分。积分用完,等待突然变长,过几个小时又恢复。
每天同一时段变慢、重启应用也没用,就是这种曲线。
把 IOPS 买到这家云的最高档,等待仍在业务日里重复出现,限制在共享存储或共享调度上。 账单上的 IOPS 数字已经到顶,队列还在。
夜间备份把磁盘打满、白天 w_await 正常:这是备份窗口,把备份挪到低峰。
等待很低、慢查询却是锁或全表扫描:先改 SQL。
这两种都留在云上处理。NVMe 上 %util 接近 100,也不要单独当成饱和;队列长度和写等待更有用。换到整机之后同样用这两列,避免把新盘的利用率误读成排队。
| 高峰里看到的 | 留在云上 | 再算整机 |
|---|---|---|
| steal 只跳几秒,p95 不动 | 维持现有规格 | 信号不成立 |
| steal 多次到约 10% 以上并维持数分钟,p95 同向;加 vCPU 后仍如此 | 加核已经试过 | CPU 被邻居长期抢走 |
| user 加 sys 打满,steal 接近 0 | 加大云主机 CPU | 先不要搬 |
| 容器节流在高峰持续增加,配额已到顶 | 与 steal 同一结论 | 配额到顶后仍节流 |
| 可用内存低,无换页,延迟稳 | 当作缓存留下 | 信号不成立 |
| 业务时段持续换页或 OOM,缓冲池大于云主机内存上限 | 云上已无更大内存 | 按工作集选 128GB 或 256GB |
| 只有备份时段磁盘忙,白天写等待正常 | 挪开备份窗口 | 信号不成立 |
| 数据盘队列经常大于 1,写等待到几十毫秒,commit 变慢,IOPS 已到顶 | 盘型已经换过 | 队列来自共享存储 |
同一个业务周里,三条一起判
单看一条曲线容易搬早。CPU 偶发、内存其实是缓存、磁盘只在备份时忙,三条都不构成换整机的理由。 数完一个业务周再下结论。三条里对上两条,并且都落在高峰、不落在备份窗口,再打开价目算月租。 只对上一条:steal 就先加大 CPU,或换一台调度更松的云规格;内存就加内存;磁盘就加 IOPS 或换盘型。下一周用同一窗口重测。 三条都只闪了几分钟,维持现状。
对上了也不必当天搬。先把慢拆开。延迟若主要来自用户到机房的距离,整机消掉 steal,消不掉那段往返。 物理机部署于日本东京。到日本及邻近地区的路径,和到更远地区的路径,要分开看。 应用锁、缺索引、跨区调用,也都不在这三条信号里。监控对得上,才进入配置;对不上,云主机继续用。
一条成立,先在云上改规格并重测一周。两条在业务高峰连续多日成立,再把整机月租和当前云账单放在一起看。
在现有机器上把这三组数取出来
下面四步用的是你现在的云主机或 VPS。整机还没买的时候,就能做完。命令只负责取样,判断写在取样外面。
-
1
高峰取样,盖住五个工作日
每个业务高峰跑
vmstat 1。留下us、sy、st、si、so。同一窗口导出接口 p95。备份时段另存一份,不并进高峰结论。 -
2
分清缓存和工作集
读
MemAvailable,对照数据库缓冲池配置和高峰实际占用。有 OOM 就留下内核日志。容器再读内存上限和内存事件。可用内存低但没有换页,记成缓存。 -
3
只记数据盘的队列和写等待
跑
iostat -xz 1。记下数据盘的aqu-sz和w_await,并对照慢日志里的 commit。系统盘和备份盘分开,避免把备份流量算成数据库排队。 -
4
收成三行再决定
每行一个信号:有或没有、落在哪些天、p95 是否同向。两行「有」,再去配置页比价。一行「有」,先在云上改规格,下一周重测。
vmstat 1
iostat -xz 1
vmstat 里 us 是用户态,sy 是内核态,id 是空闲,wa 是等待磁盘,st 是 steal。
si 和 so 是换入、换出。
iostat 里优先看数据盘的队列和写等待。把这两条命令的高峰输出和 p95 放在同一张表里,三行结论就有处可对。
容器机器另外记下 nr_throttled 的增量,和 st 并列,缺一列就不要给 CPU 下结论。
换上整机之后,曲线应当落到哪
两条信号已经成立,接下来核的是整机能不能接住那两条曲线。 CPU 是单路 AMD EPYC 7543P,32 核 / 64 线程,2.8–3.7 GHz。一个租户使用这颗 CPU。 宿主系统里,steal 应接近 0。你自己再切虚拟机时,客户机里的 steal 只反映这 32 核怎么分。
内存两档:128GB 月租 $465,256GB 月租 $592,都是 DDR4-3200 ECC RDIMM。 按高峰工作集选档。不能事后加条。工作集清楚落在 128GB 以内,就不要为了「以后也许不够」直接选 256GB。
磁盘默认是 2 × 1TB NVMe,无硬件 RAID,盘独立直连,可用容量按 2TB 理解。 队列若来自网络卷,换到本机 NVMe 之后,写等待通常会先降下来。降不下来,再查 SQL,或看一块盘是否不够。 还可以加 0 到 2 块 2TB,每块月租 $83,同样独立直连,不会自动并进阵列。 要盘级冗余就自己做软 RAID,可用容量会回到大约 1TB。备份仍放到机外。
带宽默认 250 Mbps,不限流量。磁盘队列是存储等待,先不要为了 fsync 把带宽升到 1G(月加 $251)或 2G(月加 $749)。 出口流量本身把 250M 打满,再升带宽。默认含 1 个 IPv4。还要地址就按个加,每个月 $2,一台合计最多 256 个,不按子网打包。 系统可以选 Ubuntu 24.04。要 Windows,再选 Standard,月加 $21,或 Datacenter,月加 $27。Linux 用 SSH,Windows 用 RDP。
月租等于机型价,加上加盘块数乘 83、带宽加价、额外 IP 个数乘 2、系统加价。 应付等于月租乘周期月数。月付、季付、半年付、年付都按这个乘,不打折。无安装费。 物理机部署于日本东京。三条里若只有磁盘队列成立,CPU 和内存都安静,仍先把云上的盘型换到顶,再和 $465 起的月租比较。 工作集和队列都轻的业务,留在云上通常更合适。信号对上两条,再打开配置页选 128GB 或 256GB。