cpu steal长期>10%本质是vcpu调度延迟,需先判断宿主机是否真忙:若%id高而%st高,则重点查vcpu绑定、超售比(建议≤1.5×)、c-state、irq集中及thp等干扰因素。

虚拟机中 CPU steal(st)长期高于 10%,说明 vCPU 被宿主机调度器“跳过”执行,本质是时间片争抢导致的调度延迟,而非 guest 自身计算密集。关键要区分:宿主机是否真忙?还是资源分配不合理?
先确认 steal 高是不是真问题
运行 top 或 vmstat 1,看 %st 值是否持续 >10%,同时观察其他字段:
- 如果 %id(空闲)也高(比如 >50%),而宿主机整体负载低,基本可排除物理 CPU 不足,重点查虚拟化层配置
- 如果 %wa 同时升高,需先排查 I/O 阻塞——D 状态进程堆积也会间接抬高 steal(因调度器反复尝试唤醒被阻塞的 vCPU)
- 若 %sy 或 %si 异常高,可能是 guest 内频繁系统调用或软中断压垮了单个 vCPU,造成调度不均
检查 vCPU 分配与物理核绑定
steal 高往往源于多个 vCPU 挤在少数物理核上。执行以下命令:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
virsh vcpuinfo
:查看每个 vCPU 当前运行在哪个 pCPU 上,是否全部落在同一 NUMA 节点或几个核心 - lscpu && numactl --hardware:确认宿主机 NUMA 拓扑和物理核心分布
-
virsh vcpupin
:检查是否做了显式绑核;未绑定时 CFS 默认调度易形成热点
若发现 vCPU 集中绑定,可用 virsh vcpupin
核查超售比例与节流设置
统计所有运行中 VM 的 vCPU 总数,对比宿主机逻辑 CPU 数量:
- 计算公式:总 vCPU ÷ 物理线程数。建议比值 ≤ 1.5×(高负载场景),超过 2.5× 就极易引发 steal
- 检查是否启用 cgroups v2 或 CPU bandwidth 控制。未限制时,CFS 会推迟低优先级 vCPU,推高 steal
- 对关键 VM,设置硬上限:virsh schedinfo
--set cpu_quota=50000 --set cpu_period=100000 (即强制限制为 50% CPU)
排查宿主机侧干扰因素
steal 是“本该轮到我,却被跳过”,除 vCPU 竞争外,还受以下影响:
- C-state 过深:运行 cat /sys/module/intel_idle/parameters/max_cstate,若值 ≥ 3,尝试加内核启动参数 intel_idle.max_cstate=1,减少唤醒延迟抖动
-
IRQ 绑定不均:执行 cat /proc/interrupts | grep -E "(eth|nvme)",确认网卡、NVMe 中断是否集中在一个 CPU;用 echo
> /proc/irq/ 分散处理/smp_affinity_list - 透明大页(THP):在 KVM 场景下,THP 启用可能导致内存分配延迟放大调度偏差,可临时禁用:echo never > /sys/kernel/mm/transparent_hugepage/enabled










