超卖(Overcommit)是云服务厂商(如AWS、Azure、Google Cloud等)或虚拟化平台提供商(如VMware、KVM等)常用的一种资源管理策略。
服务器超卖(Overcommit,又叫超分)是虚拟化平台中最常见、也最容易被忽视的问题之一。很多人第一次遇到虚拟机卡顿、进程突然变慢、业务性能抖动、top 里 st 飙升,其实背后核心就是:物理机被“超卖”了。
这篇文章带你彻底搞懂:
- 什么是超卖(Overcommit)
- CPU、内存、IO 三种资源如何超卖
- 如何判断当前物理机是否超卖
- “st(steal time)”到底代表什么
- 超卖对虚拟机的真实影响
- 应该把超卖比例控制在多少
- 如何避免业务被超卖带来的性能抖动

一、什么是服务器超卖?
什么是 cpu steal time?如果你在物理机上查看这个指标,这个指标必然是 0,只有虚拟机才需要关注这个指标。我们看一下 CPU steal time 的定义(来自 ibm.com):
Steal time is the percentage of time a virtual CPU waits for a real CPU while the hypervisor is servicing another virtual processor.
虚拟机毕竟是被虚拟出来的,虚拟机要用到 CPU,最终还是要通过宿主机的CPU来完成,如果宿主机的 CPU 正在为其他虚拟机服务,那么当前虚拟机就会等待,这个等待的时间就是 steal time。
超卖(Overcommit)是云服务厂商(如AWS、Azure、Google Cloud等)或虚拟化平台提供商(如VMware、KVM等)常用的一种资源管理策略。云服务厂商的硬件资源(如CPU、内存、GPU、存储等)有限,为了提高资源利用率,降低成本。通过超卖,厂商能更高效利用资源。实现以下目标:
- 提高资源利用率:许多用户资源使用率不高,存在明显波峰波谷,超卖可充分利用闲置资源。
- 降低成本:用更少硬件资源支持更多用户,降低单位成本。
- 灵活定价:提供更灵活的定价模型(如按需付费、预留实例等),吸引更多用户。
你购买的云主机也可能出现超卖问题哦!
一句话总结:超卖 = 分配给虚拟机的资源 > 物理机的真实资源。
比如一个物理机有16核CPU,但你创建的虚拟机总 CPU 数量却是:
VM1:6 vCPU
VM2:8 vCPU
VM3:4 vCPU
VM4:6 vCPU
总和 = 24 vCPU
24 vCPU > 16 实际核➡️ 这就是CPU 超卖。
同样道理:
- 分配 256GB 内存,但物理机只有 128GB ➝内存超卖
- 多台 VM 同时读写同一块磁盘 ➝IO 超卖
虚拟化允许这样做,但必须控制比例,否则性能会严重下降。
二、为什么要超卖?
因为:
- 大部分业务不可能同时把 CPU 跑满
- 内存使用也经常有波峰波谷
- 资源利用率不超卖会很低
超卖让虚拟化平台能“压榨”物理机资源,提高成本利用率。
但——过度超卖会导致业务性能动荡、抖动、延迟升高。
三、最常见的三种超卖类型
1. CPU 超卖(最影响性能)
虚拟化平台把 vCPU 调度到物理 CPU 核心上执行。
如果分配的 vCPU 太多,超过了物理核心的承载:
- VM 需要 CPU 时,却抢不到
- top 中 CPU usage 不高,但是业务很卡
- VM 内看到大量st(steal time)
👉 CPU 超卖是导致“虚拟机卡顿”最常见的元凶。
2. 内存超卖
表现为:
- 使用了KSM(内存页合并)
- 或内存 balloon(气球)机制
- 一旦所有 VM 都需要内存,就会触发swap,性能极差
一般建议:内存不要超卖或超卖比例一个管理周期内需非常低。
3. 磁盘/IO 超卖
多个 VM 同时访问一块物理磁盘:
- IOPS 不够
- 延迟飙升
- MySQL / Redis / ES 等服务出现延迟、请求堆积
IO 超卖是最“隐性的”性能杀手。
四、如何判断物理机是否超卖?
⭐ ST(Steal Time)是判断超卖的核心指标!
在虚拟机内执行:top,你会看到:

它的含义是:虚拟机本应该得到 CPU,但10.4%的时间被物理机抢走了。
换句话说:
- ST 低(<2%) → 正常
- ST 高(>5%) → 有干扰,可以感知到卡顿
- ST >10% → 明显过载
- ST >20% → 业务明显受损,虚拟机随时可能抖动
这是判断 CPU 是否超分的最直接办法。
五、看真实例子:虚拟机显示 6 vCPU ≠ 实际 6 核
你提到的现象非常典型:
“虚拟机分了 6 vCPU,但实际是不是能拿到 6 核?”
答案:
- ✔如果没有超卖 → 是的,你能获得完整 6 核性能
- ❌如果超卖严重 → 实际可能只能拿到 2~3 核,甚至更低
你看到 6 核只是“虚拟 CPU”,不是实际 CPU。
六、超卖对服务的影响
CPU 超卖 → 服务卡顿、延迟高:
- 请求累计
- Redis 延迟飙升
- Java stop-the-world 更频繁
- k8s 节点上 Pod 莫名超时
- Web 服务 QPS 波动大
内存超卖 → 持续 swap、服务抖动:
- MySQL / ES lock
- Redis 出现 fork 卡死(导致 AOF 重写失败)
- JVM OOM 频发
IO 超卖 → 数据库延迟秒级:
- MySQL QPS 明显下降
- Kafka lag 迅速增加
- 各种 timeout
七、超卖比例应该控制多少?(经验结论)
|
类型 |
建议超卖比例 |
原因 |
|
CPU |
1.5 ~ 2 倍 |
大多数应用 CPU 不满载 |
|
内存 |
0 ~ 1.1 倍 |
大量交换会崩盘 |
|
IOPS |
不建议超卖 |
IO 冲突对敏感应用影响极大 |
举例:
物理机有 16 核 CPU
最多分配 24 ~ 32 vCPU(超卖 1.5~2 倍)
如果是云厂商,比例可以更高(但那是商业行为)。
八、如何避免业务被超卖影响?
1. 强烈建议业务机器固定性能:
给关键虚机绑定真实 CPU(pinned CPU)如 PVE/KVM:
taskset / CPU pinning
2. 禁止在数据库/中间件上做 CPU 超卖
尤其:
- MySQL
- Redis
- ES
- Kafka
- Zookeeper
这些IO / CPU 强依赖组件必须避免ST增高。
3. 持续监控 ST
你的监控体系应该包含:
- 虚机 st(steal)
- 宿主机 CPU load
- 宿主机 IO 延迟
4. 不要混跑离散型和连续型业务
例如:❌ 在同一物理机上跑
- 大数据 Spark、Hadoop 作业
- 在线业务 Web / Redis
这必炸。
©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

微信扫码打赏
支付宝扫码打赏
