欢迎光临
我们一直在努力

Linux top中的st高怎么排查

网站响应变慢、SSH 操作卡顿,打开 top 却没有找到明显占满 CPU 的进程,这时可以留意 CPU 汇总行中的 st。

st 与程序自身的 CPU 占用不同。它反映的是虚拟机在 CPU 调度方面的等待情况。不过,看到某一秒 st 偏高,还不足以判断故障原因。

本文介绍 Linux 中 st 的含义,以及怎样通过连续采样、每个 vCPU 的数据和业务表现进行排查。

1. top 中的 st 是什么意思?

st 是 steal time,通常译为 CPU 窃取时间。

在虚拟机环境中,vCPU 需要由虚拟化平台调度到物理 CPU 上运行。当虚拟机有任务需要执行,却没有获得相应的 CPU 运行时间时,这部分等待可能计入 steal time。

因此,st 偏高意味着虚拟机存在 CPU 调度等待,可能影响应用响应速度。它不是某个进程的 CPU 使用率,也不表示某个程序正在“偷用”服务器。

不同虚拟化平台的支持和统计方式可能存在差异。例如,KVM 的相关说明明确指出,vCPU 自身处于空闲状态的时间不计入 steal time。

2. 分清 st、wa 与 sy,避免查错方向

在 top 的 CPU 汇总行中,常见字段可以这样理解:

字段含义排查时关注什么
us普通用户态程序使用的 CPU 时间哪些应用进程正在消耗 CPU
sy内核态使用的 CPU 时间系统调用、内核处理等活动
id空闲时间当前采样窗口内的 CPU 空闲情况
waI/O 等待相关时间是否存在 I/O 等待,并结合其他指标检查
st虚拟化环境中的 CPU 调度等待时间虚拟机是否持续等待获得 CPU

这些字段描述的是不同类型的 CPU 时间,不能混为一谈。比如,sy 高与 st 高,后续需要检查的方向就不一样。

还要注意:wa 不是磁盘使用率,也不能单凭它判断硬盘故障。 Linux 内核文档对 iowait 的统计局限有专门说明,需要结合实际 I/O 和业务情况判断。

处理器、时钟与硬盘组成的Linux CPU指标排查示意图

3. 先连续观察,再查看每个 vCPU

以下安装命令适用于 Debian、Ubuntu。如果相关工具已经安装,可以跳过;使用 root 登录时,可去掉命令前面的 sudo。

sudo apt-get update
sudo apt-get install -y procps sysstat

其中,procps 提供 top、vmstat 等工具,sysstat 提供 mpstat。

先执行:

top

观察 CPU 汇总行中的 st,连续看几个刷新周期。

在 top 界面按数字键 1,可以切换查看每个 CPU 的状态;按 q 退出。不要只保存一张截图就结束观察。

接着执行:

LC_ALL=C mpstat -P ALL 1 10

这条命令每隔 1 秒输出一次数据,共输出 10 次。LC_ALL=C 用于保持输出字段和数字格式一致,便于对照说明。

重点看:

  • %steal:当前采样窗口的 CPU steal 比例。
  • all 行:所有 CPU 的平均情况。
  • 各 CPU 行:判断问题是集中在部分 vCPU,还是普遍存在。

只看平均值可能掩盖单个 vCPU 的异常,因此要把 all 与各 CPU 的数据一起看。

这十秒钟的数据适合初步观察。如果卡顿间歇出现,应在故障发生时继续采样。

4. 用 vmstat 交叉检查,别漏掉内存和 I/O

执行:

LC_ALL=C vmstat -t 1 11

这条命令带时间输出 11 份报告,间隔 1 秒。

第一份报告中的 CPU 数据是开机以来的平均值,后面的报告才反映对应采样间隔。 因此,排查刚刚发生的卡顿时,应重点看后续十份报告。不要把第一份 CPU 数据理解成“上一秒的状态”。

可以重点查看以下字段:

字段含义
r正在运行或等待运行的任务数量
b等待 I/O 的阻塞任务数量
us、sy用户态、内核态 CPU 时间
wa、stI/O 等待与 CPU steal
si、so每秒换入、换出的内存量

注意,vmstat 中的 si 指 swap 换入,top CPU 汇总行中的 si 指软件中断时间,两者不是同一个指标。

再查看内存:

free -h

不要只看 free 列。available 是系统对“不需要发生交换就能供新应用使用的内存”的估计,包含部分可回收缓存。

据此,可以形成几个排查方向:

  • st 持续升高,并与卡顿时间吻合:进一步检查虚拟化调度情况。
  • us 或 sy 持续升高:继续定位应用进程或内核活动。
  • wa、b 同时异常:补充检查存储和 I/O。
  • 可用内存紧张,且 si、so 持续活跃:进一步检查内存压力。

这些是定位线索,需要结合业务表现验证。若主要问题是应用自身消耗 CPU,可以参考本站的 Linux服务器CPU占用100%排查教程。

5. st 多高才需要处理?

实际排查时,不建议套用“超过某个百分比就一定异常”的统一结论。

更有价值的是回答三个问题:

  1. 持续多久? 是偶尔跳高一秒,还是连续多个采样周期偏高?
  2. 是否偏离平时水平? 同样业务负载下,正常时段的数据是什么样?
  3. 是否影响业务? 网站响应、接口耗时或任务完成时间有没有同步恶化?

例如,某一秒 st 突然升高,但业务没有明显变化,可以继续观察;如果卡顿期间持续出现较高 %steal,而正常时段明显降低,就有必要保留完整记录进一步核查。

同样,st 为零只表示该窗口没有记录到 steal time,不能据此证明服务器不存在其他性能瓶颈。

6. 保存一分钟采样日志

为了方便核对故障时间,可以在服务器上一个有写入权限的目录中执行:

report_file="cpu-steal-$(date +%Y%m%d-%H%M%S).log"

{
  date -Is
  uname -r
  LC_ALL=C mpstat -P ALL 1 60
} | tee "$report_file"

命令会持续采样约一分钟,然后自动结束,并在当前目录生成日志文件。终端同时显示采样内容;如果提前按 Ctrl+C,保存的采样时间会相应缩短。

日志中包含服务器时间、时区偏移、内核版本,以及每个 vCPU 的采样结果。

同时记录以下信息,后续核对会更方便:

  • 卡顿发生的准确时间和持续时长。
  • 当时正在执行的业务或任务。
  • 网站响应变慢、接口超时等具体表现。
  • 正常时段同样命令采集的数据。

正常与异常时段使用相同的采样方法,才更容易看出差异。 不要只截取最高的一个数值。

Linux服务器连续采样与故障记录示意图

7. 根据结果处理,并验证业务是否恢复

如果数据主要指向应用自身占用 CPU,应继续检查繁忙进程、定时任务、批量作业和程序处理逻辑,确认是否需要调整并发或错开执行时间。

如果 %steal 持续偏高,并且与业务变慢的时间吻合,可以将日志交给云服务商或虚拟化管理员,请其核查对应时段的宿主机 CPU 负载、vCPU 调度和资源分配情况。

虚拟机内部的数据能够提供线索,但不能单独确认宿主机上的具体原因。Red Hat 的相关文档也将减少资源争用、调整虚拟机资源分配等列为宿主机侧的处理方向。

调整后,在相近的业务负载下重新采样,同时比较:

  • %steal 是否回落。
  • 接口响应时间是否改善。
  • 原本缓慢的任务是否恢复正常。
  • 卡顿是否还会在相同时段出现。

如果希望持续记录网站可用性和访问响应时间,可以参考本站的 Docker搭建Uptime Kuma网站监控。它可以帮助观察网站访问表现;CPU steal 等系统指标仍需要使用系统工具或相应监控方案采集。

8. 结语

Linux top 中的 st 高,说明需要关注虚拟机的 CPU 调度等待情况。排查时,先分清 st、wa 和 sy,再通过 mpstat 查看各个 vCPU,用 vmstat 和内存信息补充判断。

保留连续采样记录,对照业务变慢的时间,并在调整后重新验证,比只看一张截图更容易找到问题所在。

如需准备 Linux 云服务器用于网站部署和运维实践,可以通过莱卡云官网查看配置,并根据实际业务选择 CPU、内存与存储容量。

查看官网购买链接: https://www.lcayun.com

9折优惠码:bloglcayun

赞(0)
未经允许不得转载:莱卡云 » Linux top中的st高怎么排查