本文适用版本:ESXi 8.0 U1/U2 → U3 升级场景(7.0 U3 也有类似问题)
阅读时长:约 7 分钟
难度:⭐⭐(BIOS 改动需要重启,但 esxcli 改动不需要)
一、踩坑笔记:上周帮同事排查的"假慢"故障
📝 起因
上周四,隔壁组的小李端着咖啡过来:"张哥,我们组升级 ESXi 8.0 到 U3,业务部门反映系统慢,vSphere 里看 CPU Ready 一直在 8% 左右,你能帮忙看看不?"
我一看告警:"CPU Ready 高于 5%,VM 性能受影响"。这种问题他之前拖了两个月没修,业务投诉才来找我。
SSH 进去esxtop,看物理 CPU 的 C-State,好家伙,%C6 一路飙到 40%——CPU 在深度休眠被频繁唤醒,VM 等调度的时间自然就长。
解决方案其实就一行命令,但要把里面几个细节讲清楚,我还是写一篇文档,免得他下次升级又踩。
踩完坑顺便记一下,后面再有人问就直接甩链接。
二、原理:CPU Ready 到底是什么?为什么会高?
CPU Ready 时间(也称 "%RDY"):VM 等待物理 CPU 调度的时间百分比。
VM 发出 CPU 请求 │ ▼ ESXi CPU 调度器排队 │ ← 如果物理 CPU 正在深度休眠(C6/C7 状态), │ 从休眠唤醒需要 100~300 微秒, │ 这个等待时间就算进 "CPU Ready" ▼ 分配物理 CPU 执行CPU Ready 的官方标准:
| %RDY 范围 | 健康度 | 业务感知 |
|---|---|---|
| < 2.5% | 🟢 优秀 | 无感知 |
| 2.5%–5% | 🟡 良好 | 无感知 |
| 5%–10% | 🟠 注意 | 偶发卡顿 |
| > 10% | 🔴 严重 | 明显慢 |
U3 升级后变高的 3 个根因:
- 电源策略:U3 默认启用更激进的节能模式,C-State 更深,唤醒延迟更高
- NUMA 调度:U3 调整了 NUMA 节点权重,VM 跨 NUMA 调度变慢
- Turbo Boost:U3 在高负载时关闭部分核的 Turbo,整体调度被拉慢
三、3 步定位:确认是电源问题还是资源问题
# 第 1 步:看 CPU Ready 实际值 esxtop # 按 "v" 切换到 VM 视图 # 看 %RDY 列,识别哪些 VM 是元凶 # 第 2 步:看物理 CPU 的 C-State 占用 # 还是在 esxtop 里,按 "p" 切换到物理 CPU 视图 # 看 %C0 / %C1 / %C6 列 # 如果 %C6 高(>30%),说明 CPU 在深度休眠频繁唤醒 # 第 3 步:看当前电源策略 esxcli system settings advanced list -o /Power # 应该输出 /Power/CpuPolicy = "Balanced" 或 "High Performance"结论对照表:
| 现象 | 根因 | 解法 |
|---|---|---|
| %C6 高 + %RDY 高 | 电源策略太激进 | 改 High Performance |
| 单台 VM %RDY 高,其他正常 | VM vCPU 过多 | 降低 VM vCPU 数 |
| 所有 VM %RDY 都高 | 主机 CPU 资源不足 | 减 VM 数 / 加主机 |
| NUMA 跨节点调度多 | VM 内存跨 NUMA | 绑 NUMA 节点 |
四、解法:从轻到重 4 档
方案 A:esxcli 改电源策略(最快,80% 有效)
# SSH 进 ESXi 改电源策略(立即生效,无需重启) esxcli system settings advanced set \ -o /Power/CpuPolicy \ -i "High Performance" # 验证 esxcli system settings advanced list -o /Power # 输出应该包含:Path: /Power/CpuPolicy, Config: High Performance3 种策略对比:
| 策略 | 节能 | 性能 | 适用场景 |
|---|---|---|---|
| Power Saver | 🟢 强 | 🔴 弱 | 边缘节点 |
| Balanced(默认) | 🟡 中 | 🟡 中 | 一般业务 |
| High Performance | 🔴 弱 | 🟢 强 | 关键生产 |
方案 B:BIOS 里关闭 CPU 节能特性
BIOS 改完需要重启主机(影响 VM),建议维护窗口操作:
# Dell 服务器: # System Setup → System Profile → Custom # CPU Power Management → Disabled # C-State → Disabled # Turbo Boost → Enabled # Save → Exit # HPE 服务器: # BIOS/Platform Configuration → Power Management # HP Power Profile → Custom # HP Power Regulator → HP Static High Performance # Intel Turbo Boost → Enabled # Save → Exit # Lenovo 服务器: # System Settings → Power → Active Energy Manager # Mode → Disabled # Save → Exit方案 C:调整 VM vCPU 数量
有时问题不在电源,而是 VM 自己 vCPU 给太多,超过物理核数反而拖慢调度。
# PowerCLI 找出所有 vCPU > 8 的 VM Get-VM | Where-Object { $_.NumCpu -gt 8 } | Select Name, NumCpu, MemoryGB | Format-Table -AutoSize # 批量调整(谨慎使用) Get-VM "DB-*" | ForEach-Object { $newCpu = [Math]::Min($_.NumCpu, 8) if ($newCpu -lt $_.NumCpu) { $spec = New-Object VMware.Vim.VirtualMachineConfigSpec $spec.NumCpu = $newCpu $_.ReconfigVM($spec) Write-Host "$($_.Name) vCPU: $($_.NumCpu) → $newCpu" } }经验值:vCPU 数 ≤ 物理核数,且 VM 数 × vCPU ≤ 物理核数 × 0.7。
方案 D:绑定 NUMA 节点(进阶)
大内存 VM(>64GB)跨 NUMA 调度会显著拉高 %RDY,需要手动绑定:
# PowerCLI 绑定 NUMA 节点 Get-VM "DB-Heavy-01" | %{ $spec = New-Object VMware.Vim.VirtualMachineConfigSpec $spec.NumVirtualCoresPerSocket = 8 $spec.MemoryMB = $_.MemoryMB $spec.VirtualMachineConfigSpec = $null # 关键设置 $numaSpec = New-Object VMware.Vim.VirtualMachineConfigSpec $numaSpec.ExtraConfig = @( (New-Object VMware.Vim.OptionValue( 0, "numa.vcpu.preferHT", "false")) ) $_.ReconfigVM($numaSpec) }五、防患于未然:3 个最佳实践
1. 升级后立即检查电源策略
ESXi 大版本升级(7.0→8.0)或小版本升级(8.0U1→U3)后,先把电源策略统一改成 High Performance,再观察一周。
# 批量给所有主机设置(走 vCenter) Get-VMHost | %{ (Get-View $_.ExtensionData).ReconfigureHost( (New-Object VMware.Vim.HostConfigSpec( (New-Object VMware.Vim.HostPowerSystemSpec("High Performance"))))) }2. 监控 CPU Ready 趋势
# zabbix 自定义监控(5 分钟轮询) UserParameter=esxi.cpu.ready[*],/usr/bin/esxcli vm process list 2>/dev/null # 或者用 vCenter API 取 cpu.ready.summation # 告警阈值:%RDY > 5% 持续 30 分钟3. VM 容量规划
每季度跑一次容量检查,确保所有 VM 的 vCPU 总量不超过物理核数的 70%。
# 容量检查脚本 Get-Cluster "Production-Cluster" | %{ $cpuTotal = ($_ | Get-VMHost | Measure-Object -Property CpuTotalMhz -Sum).Sum $cpuUsed = ($_ | Get-VM | Measure-Object -Property CpuUsageMhz -Sum).Sum $vCpuTotal = ($_ | Get-VM | Measure-Object -Property NumCpu -Sum).Sum $pCpuTotal = ($_ | Get-VMHost | Measure-Object -Property NumCpu -Sum).Sum Write-Host "CPU 整体使用率:[$(($cpuUsed/$cpuTotal*100).ToString('0.0'))%]" Write-Host "vCPU / pCPU:$vCpuTotal / $pCpuTotal" if ($vCpuTotal / $pCpuTotal -gt 0.7) { Write-Warning "⚠️ vCPU 已超 pCPU 的 70%,建议扩容" } }六、速查命令卡(可收藏转发)
# 1. 核心修复(电源策略) esxcli system settings advanced set \ -o /Power/CpuPolicy -i "High Performance" # 2. esxtop 看 %RDY esxtop # 按 v 看 VM,按 p 看物理 CPU # 3. 看当前电源策略 esxcli system settings advanced list -o /Power # 4. BIOS 关闭节能(Dell 示例) # System Setup → System Profile → Custom # → CPU Power Management → Disabled # 5. 批量给所有主机设电源策略 Get-VMHost | %{ (Get-View $_.ExtensionData).ReconfigureHost( (New-Object VMware.Vim.HostConfigSpec( (New-Object VMware.Vim.HostPowerSystemSpec("High Performance"))))) } # 6. 容量检查 Get-Cluster | %{ /* 见正文 */ }