首页/系统/Linux 内核与性能调优速查/steal time 判读(虚拟化)
CPU 与调度60 条

steal time 判读(虚拟化)

虚拟机 CPU 时间被宿主或其他租户抢占的部分记为 steal;持续偏高说明资源超卖或邻居争抢,虚机内部优化无法根治。

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 列采样间隔内的被抢占时间占比,最常用
topst 列短窗口瞬时值,波动大
/proc/statcpu 行的第 9 字段自开机累计,必须做差分
vmstat无 steal 列需结合 r、wa 等列间接推断
steal 只在「有任务想运行但拿不到物理 CPU」时累计,低负载虚机即使宿主超卖也可能长期显示 0。因此 steal 为 0 不能证明平台没有超卖,需要结合压测与延迟指标一起判断。
不同虚拟化平台的记账粒度并不一致(是否包含宿主中断处理开销、按 vCPU 还是按实例统计等),跨厂商比较 %steal 的绝对值意义有限,应更看重同一实例自身的历史趋势与业务延迟的相关性。

易错点

  • 在虚机内部调参试图消除 steal:时间根本没给到虚机,调整内核参数无法要回被宿主占用的 CPU
  • 看到 steal 为 0 就断定平台无超卖:空载或没有就绪任务时不会累计,需在压测中观察
  • 只看整体均值不看单 vCPU:个别 vCPU 被严重抢占时,平均值会被其余核稀释掉
  • 把 %steal 与 %sys、%iowait 相加:steal 是独立分类,重复计算会得出错误的 CPU 水位
  • 采样窗口过短就下结论:steal 的尖峰与业务尾延迟通常同源,需要较长窗口与业务指标对齐观察

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst(/proc/stat)
  • sysstat 文档 mpstat(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌