独立服务器 · 月付起

三条信号对上了
再来配这台整机

$465 / 月起 · 128GB 机型
开始租用
32 核 / 64 线程 DDR4 ECC

云主机什么时候该换成整机?

写给已经在云上跑业务、监控还开着的人。 独立服务器和云服务器、裸金属和云服务器、VPS 和独立服务器,这三组检索落到曲线上是同一件事:调度器里有没有别人。 先看 CPU 有没有被邻居长期抢走,内存工作集有没有过了这台云主机的上限,磁盘队列有没有把数据库拖慢。 业务高峰连续多日对上两条,再算整机月租。

三种机器,用同一张监控表来分

账单上的名字可以很满:云服务器、云主机、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 很高」搬家,会把一台仅仅需要加核的云主机,换成一块用不满的整机。

st vmstat 里的 steal
约 10% 高峰判断线
5 日 至少覆盖的工作日
p95 要和 steal 同向
10% 是读图用的线

它不是告警规范。延迟预算更紧,线就画低一些;批处理可以等,线就画高一些。要一起成立的是:连续多个业务日,而且 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. 1
    高峰取样,盖住五个工作日

    每个业务高峰跑 vmstat 1。留下 us、sy、st、si、so。同一窗口导出接口 p95。备份时段另存一份,不并进高峰结论。

  2. 2
    分清缓存和工作集

    读 MemAvailable,对照数据库缓冲池配置和高峰实际占用。有 OOM 就留下内核日志。容器再读内存上限和内存事件。可用内存低但没有换页,记成缓存。

  3. 3
    只记数据盘的队列和写等待

    跑 iostat -xz 1。记下数据盘的 aqu-sz 和 w_await,并对照慢日志里的 commit。系统盘和备份盘分开,避免把备份流量算成数据库排队。

  4. 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。

独享物理机 · 月付起

信号对上了,去配置页选内存

128GB 或 256GB。磁盘按 2×1TB 直连理解。 未登录也可以下单。

$465 / 月起
CPUEPYC 7543P
核心32 核 / 64 线程
内存128 / 256GB ECC
磁盘2×1TB 直连
机房日本东京
接入SSH / RDP
安装费无