CPU steal 时间高但宿主机空闲的 vmware-tools / hypervisor 调度问题

6次阅读

CPU steal 时间是linux中表示虚拟机就绪却遭hypervisor暂停而无法获得CPU的比例;在vmware中虚高常因调度策略或vmware-tools协作异常导致误报,非宿主机真实过载。

CPU steal 时间高但宿主机空闲的 vmware-tools / hypervisor 调度问题

什么是 CPU steal 时间,它为什么在 VMware 中会虚高

CPU steal 时间(steal%)是 Linux topvmstat 中的一个指标,表示虚拟机就绪但被 hypervisor 暂停、无法获得 CPU 时间的比例。关键点在于:它只反映“hypervisor 拒绝调度”的次数,并不区分原因——可能是宿主机真忙,也可能是 VMware 的调度策略或 vmware-tools 与内核协作异常导致的误报。

常见现象是:top 显示 steal% 长期 >20%,而宿主机 esxtop%USED%RDY 均很低(

vmware-tools 版本和 tsc clocksource 是核心变量

旧版 vmware-tools(尤其是 open-vm-tools idle% 或 sys% 的时间计入 steal%

  • 检查当前 clocksource:cat /sys/devices/system/clocksource/clocksource0/current_clocksource —— 正常应为 tsc,若为 hpetacpi_pm,说明 TSC 同步失败,steal 会显著偏高
  • 升级 open-vm-tools 到 11.3.5+(Ubuntu 22.04+/RHEL 8.6+ 自带)或手动安装最新版;闭源工具请至少到 12.4.0
  • 强制启用 TSC(如 BIOS 支持):echo 'tsc' | sudo tee /sys/devices/system/clocksource/clocksource0/current_clocksource(临时),并确认 kernel.tsc=reliable 在启动参数中

VMware 设置里几个容易被忽略的 CPU 相关选项

即使宿主机空闲,某些 VMware 配置也会触发不必要的 vCPU 抢占或调度延迟,间接抬高 steal 计数:

  • cpu.hotadd = "FALSE"(默认)—— 若开启热添加,vCPU 热插拔过程会引发短暂但高频的 steal 尖峰,建议关闭除非真需要
  • monitor_control.restrict_backdoor = "TRUE" —— 关闭后,guest 可能通过 backdoor 调用干扰 hypervisor 时间管理,导致 steal 统计失真;生产环境应保持为 TRUE
  • vCPU 数量 ≠ 宿主机物理核心数时,避免设置 numvcpus = 3 这类非 2 的幂值;ESXi 调度器对 2/4/8 等更友好,非对称分配易造成隐式等待

如何验证是不是假 steal,而不是真实性能瓶颈

别只盯着 steal% 数字。真正影响应用的是延迟和吞吐,不是统计值本身:

  • perf sched latency 查看实际调度延迟分布,如果 99% 的调度延迟
  • 运行 stress-ng --cpu 1 --timeout 30s,观察 steal% 是否随负载线性上升 —— 如果空载高、满载反而下降,基本可断定是 clocksource 或 tools 协作问题
  • 对比 /proc/statsteal 字段增长速率和 guest 字段(vmware-tools 上报的 guest CPU 使用)是否严重偏离;若 steal 增速远超 guest,就是上报失准

最麻烦的情况是:clocksource 正确、tools 最新、配置干净,但 steal 仍持续偏高 —— 这往往意味着 ESXi 主机开启了 CPU resource limits 或 shares 不均,即使整体空闲,该 VM 的配额被其他低优先级 VM 无意挤占,得查 esxtopMLMT(memory limit)和 SWAP 列是否异常,它们有时会连带影响 CPU 调度权重。

text=ZqhQzanResources