steal time 是什么
steal time 是虚拟化环境特有的 CPU 时间分类:vCPU 已经就绪、本应被调度运行,却因为宿主在跑别的 vCPU 或承担虚拟化开销而没有拿到物理 CPU,这段时间就记为该虚机的 steal。它衡量的是「被平台拿走的时间」,因此在 guest 内部优化代码或调内核参数都无法根治,只能作为向平台反馈、调整规格或迁移实例的依据。
基本信息
| 查看方式 | mpstat 的 %steal、top 的 st 列、/proc/stat 的 steal 计数 |
|---|---|
| 统计口径 | 与 user/system/idle 并列的独立 CPU 时间分类,累计计数需差分 |
| 前提 | 仅在虚拟化环境有意义,裸机上恒为 0 |
| 常见伴随现象 | 运行队列 r 偏高、PSI 压力上升、尾延迟波动 |
| 阈值 | 没有统一标准,取决于业务对延迟的敏感度,重点看趋势与相关性 |
| 反馈对象 | 云平台或虚拟化管理员:实例超卖、宿主争抢、规格选择 |
典型使用场景
- 定位虚机性能波动:自身 CPU 使用率不高但延迟抖动大,steal 是常见解释
- 为「更换实例规格或可用区」提供可复核的数据依据
- 区分算力不足与平台争抢:结合 r 列与 PSI,判断是排队还是被剥夺
- 容量规划:把平均 steal 计入可用算力折扣,避免按标称核数估算
- 云主机尾延迟投诉时,用趋势数据与平台侧沟通,而不是反复改应用参数
采样与判读
采样与判读
mpstat -P ALL 1 5 # 逐 vCPU 看 %steal,注意是否集中在个别 vCPU
mpstat 1 5 | grep -E 'Average|all' # 只看整体均值,方便快速判断
top -bn1 | head -5 # st 列是短窗口瞬时值,需与 mpstat 对照
awk '/^cpu /{print "steal="$9}' /proc/stat # 累计计数(第 9 字段),两次相减求增量
vmstat 1 5 # r 高且 st 明显时,说明排队与平台抢占同时存在
cat /proc/pressure/cpu # PSI 交叉验证:停顿是否与 steal 同步上升各工具口径
| 工具 | 位置 | 说明 |
|---|---|---|
| mpstat | %steal 列 | 采样间隔内的被抢占时间占比,最常用 |
| top | st 列 | 短窗口瞬时值,波动大 |
| /proc/stat | cpu 行的第 9 字段 | 自开机累计,必须做差分 |
| vmstat | 无 steal 列 | 需结合 r、wa 等列间接推断 |
steal 只在「有任务想运行但拿不到物理 CPU」时累计,低负载虚机即使宿主超卖也可能长期显示 0。因此 steal 为 0 不能证明平台没有超卖,需要结合压测与延迟指标一起判断。
不同虚拟化平台的记账粒度并不一致(是否包含宿主中断处理开销、按 vCPU 还是按实例统计等),跨厂商比较 %steal 的绝对值意义有限,应更看重同一实例自身的历史趋势与业务延迟的相关性。