启动与虚拟机故障

排查 Linux 中的 CPU 使用率过高问题 - Virtual Machines

· 52CE 我爱测

适用于:✔️ Linux VM 总结 本文介绍如何使用性能监视工具排查 Azure Linux 虚拟机(VM)上的 CPU 性能问题。 可以将以下工具用于此任务。 | 资源 | 工具 | | --- | --- | | CPU | top、vmstat、sysstat、pidstat、htop、mpstat | top 该工具 top 是一种主要 CPU 监视工具,提供 CPU 使用情况的详细视图。 它提供服务器性能的实时见解。 下面是具有两个 CPU 核

适用于:✔️ Linux VM

总结

本文介绍如何使用性能监视工具排查 Azure Linux 虚拟机(VM)上的 CPU 性能问题。 可以将以下工具用于此任务。

资源 工具
CPU top、vmstat、sysstat、pidstat、htop、mpstat

top

该工具 top 是一种主要 CPU 监视工具,提供 CPU 使用情况的详细视图。 它提供服务器性能的实时见解。 下面是具有两个 CPU 核心的 VM 的 top 报表示例:

top - 03:12:38 up  1:53,  3 users,  load average: 1.72, 0.62, 0.25
Tasks: 198 total,   1 running, 197 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  1.4 sy,  0.0 ni, 15.2 id, 82.5 wa,  0.2 hi,  0.3 si,  0.0 st
MiB Mem :   7697.8 total,   3672.6 free,    576.6 used,   3448.5 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   6838.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM      TIME+ COMMAND
  17038 root      20   0    8476   2984   1984 D   3.7   0.0   0:00.77 dd
  17039 root      20   0    8476   2928   1916 D   3.7   0.0   0:01.14 dd
  16979 root      20   0       0      0      0 D   1.3   0.0   0:00.14 kworker+
    858 root      20   0 1176440  31088   4580 S   0.7   0.4   0:43.16 auoms
   1679 omsagent  20   0  350232  68976   9944 S   0.7   0.9   0:18.52 omsagent
    521 root      20   0       0      0      0 S   0.3   0.0   0:00.05 xfsaild+
  16018 root      20   0       0      0      0 I   0.3   0.0   0:00.29 kworker+
  16933 root      20   0   54400   4384   3756 R   0.3   0.1   0:00.21 top
      1 root      20   0  175948  14356   9180 S   0.0   0.2   0:04.02 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.10 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par+
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_fl+
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+
     10 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_perc+
     11 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tas+
     12 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tas+

关键指标:

  • load average (位于顶部行右侧):表示在特定时间间隔内运行或等待 CPU 时间的平均进程数。 在示例输出中, load average: 1.72, 0.62, 0.25 表示:

    • 1.72:过去 1 分钟的平均负载。
    • 0.62:过去 5 分钟内的平均负载。
    • 0.25:过去 15 分钟内的平均负载。
  • Tasks total:概述系统中当前加载的进程总数。

  • running:指示有多少进程正在使用 CPU 时间。

  • zombie:显示运行已完成但在进程表中仍有记录的进程。

  • us:表示为用户进程消耗的 CPU 量的百分比。

  • sy:表示系统进程消耗的 CPU 量的百分比。

  • id:表示每个 CPU 的空闲百分比。

  • wa:指示等待 I/O 操作完成的 CPU 时间百分比。

分析报表

此 VM 包含两个 CPU 核心。 因此,负载平均值为 2.0 意味着两个核心都完全使用。 在此示例中, load average 过去 1 分钟的值为 1.72。 这表示系统负载正在接近其完整容量。 该值 15.2 id 还指示 CPU 以低容量运行(CPU 的空闲速率为 15.2%)。

小窍门

  • 可以通过运行 nproc 命令快速确定 CPU 计数。
  • 若要在报表中 top 显示每 CPU 使用率,请按“1”键。
  • 如果进程是多线程进程且跨越多个 CPU,则顶部报表将显示总使用量超过 100%。

接下来,检查 dd 示例输出中的进程行:

PID USER        PR  NI    VIRT    RES    SHR S  %CPU  %MEM TIME+COMMAND
17038 root      20   0    8476   2984   1984 D   3.7   0.0   0:00.77 dd
17039 root      20   0    8476   2928   1916 D   3.7   0.0   0:01.14 dd
  • %CPU:指示单个核心的 CPU 负载百分比。 你可能会看到该值超过 100%。 这意味着它占用了完整的 CPU 核心和其他 CPU 核心。
  • S:列出进程的状态。 此处, D 状态(TASK_UNINTERRUPTIBLE)是在内核代码路径中发生的状态,在处理任务时无法中断执行。

状态示例 D 可能是低级别驱动程序,因为它与硬件交互。 例如:

  • 从网卡检索网络数据包数据。
  • 访问硬盘驱动器上的数据块。

附注 (ps)

该 ps 命令显示正在运行的进程,可以按 CPU 或内存进行排序。 可以使用以下命令 ps 列出前五个 CPU 消耗的进程:

sudo ps -eo pcpu,pmem,pid,user,args | sort -r -k1 | head -6

示例输出:

%CPU %MEM     PID USER     COMMAND
33.3  0.0   17039 root     dd if=/dev/zero of=/cases/file1.bin bs=1M count=2048 status=progress
21.0  0.0   17038 root     dd if=/dev/zero of=/cases/file2.bin bs=1M count=2048 status=progress
 0.6  0.3     858 root     /opt/microsoft/auoms/bin/auoms
 0.3  1.7    1057 root     /opt/microsoft/mdatp/sbin/wdavdaemon
 0.3  0.4    2034 root     /usr/libexec/platform-python -u bin/WALinuxAgent-2.11.1.4-py3.9.egg -run-exthandlers

CPU 资源指标

CPU 使用率取决于请求访问 CPU 的资源。 内核包含一个负责调度资源的调度程序。 此过程将优先级分配给不同的资源。 以下列表描述了从高到低的优先级:

  • Hardware Interrupts:由系统上的硬件创建以处理数据的请求。 硬件中断发送请求,而无需等待当前程序完成。 请求是无条件的且即时的。 例如,当数据包到达时,它们可能是击键、鼠标移动或来自网络适配器的信号。
  • Soft Interrupts:用于内核维护的内核软件中断。 例如,内核时钟计时周期线程是软中断。 定期检查,以确保进程不会在处理器上超出其分配的时间。
  • Real Time Threads:实时进程可能在 CPU 上运行并抢占内核。
  • Kernel Threads:内核线程是内核实体,例如进程和中断处理程序。 它是由系统计划程序处理的实体。 操作系统直接处理内核级线程。
  • User Threads:此空间通常称为“用户土地”。所有软件应用程序都在用户空间中运行。 此空间在内核计划机制中优先级最低。

若要了解内核如何管理这些不同的资源,我们必须首先了解一些关键概念,例如上下文切换、运行队列和使用情况。

合成孔径雷达

该工具 sar 由提供其他统计报告工具的 sysstat 包提供,例如 iostat。 默认情况下,未安装 sysstat 包。

若要配置并启用 sar 以在系统启动时启动,请运行以下命令:

sudo systemctl enable sysstat
sudo systemctl start sysstat

如何使用 sar

它 sar 以各种方式提供价值,无论是直接或间接的:

  • 这是系统性能的总体晴雨表。 在对系统工作但对其“正常”状态没有清晰理解时,检查sar过去几天的数据以建立标准活动的基线是有用的。
  • 它提供有关 CPU 负载、负载平均值、内存使用率等的见解。
  • 它会检测可能导致系统停止响应(崩溃或挂起)的活动。 这使你可以在关键事件之前监视系统统计信息。
  • 默认情况下,它每 10 分钟记录一次统计信息。

基本用法

显示 VM 上所有处理器的详细 CPU 使用率统计信息:

sudo sar -t -P ALL

显示日志文件 sa10中的 CPU 使用率统计信息:

sar -t -u -f /var/log/sa/sa10

有关详细信息,请参阅“使用 sar 监视 Linux 中的资源”

vmstat

该工具 vmstat 简要概述了单个窗格中的 CPU、内存和磁盘 I/O 使用情况。

通常,使用以下数值参数运行 vmstat:

vmstat [delay] [count]
  • delay:指定刷新间隔(以秒为单位)
  • count:定义输出刷新次数。

如果仅提供其中一个参数,则它被视为刷新间隔,输出将在无限循环上刷新。

命令 dd 运行时的高 I/O 活动期间的示例输出

在下面的示例中,报表 2 3 0 33639696 ...的第一行包含自上次重启计算机以来的平均值。 报表中的所有其他行都表示各自的当前值。

vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  3      0 3639696   9500 3634812    0    0    43   326   45  357  2  1 96  1  0
 0  3      0 3452428   9500 3821728    0    0     0 71700  127  972  1  2  1 96  0
 1  3      0 3266588   9500 4011400    0    0     0 68612  144 1266  2  4  6 88  0
 0  3      0 3096384   9500 4181596    0    0     0 107520  114  952  1  2  4 93  0
 0  3      0 2931908   9500 4346168    0    0     0 74770   81  759  0  1  0 98  0
 1  2      0 2765040   9500 4512992    0    0     0 61442   73  756  0  2  4 94  0
 0  3      0 2608596   9500 4669520    0    0     0 74758  111  862  1  1  6 92  0
 0  3      0 2440972   9500 4836968    0    0     0 108544   91  789  0  2  1 97  0

Procs

  • r:等待运行时的进程数
  • b:不间断睡眠中的进程数

System

  • in:每秒中断数,包括时钟
  • cs:每秒上下文切换数

中央处理器

这些是总 CPU 时间的百分比:

  • 我们:运行非内核代码所用的时间(用户时间,包括 CPU 低优先级处理时间)
  • sy:运行内核代码所用的时间(系统时间)
  • id:空闲时间
  • wa:等待 I/O 所花费的时间
  • 从 VM 中被剥夺的时间

如何确定哪个进程导致高上下文切换

若要确定哪个进程导致 I/O 活动过高,可以使用 pidstat 该命令。 此命令监视 Linux 内核管理的各个任务。

若要检查哪个进程导致问题,请运行以下命令。 与vmstat选项用法类似,此命令以 2 秒间隔运行五次。

sudo pidstat -wt 2 5
  • -w:报告任务切换活动
  • -t:显示与所选任务关联的线程的统计信息

运行vmstat命令时,将生成以下pidstat报表和stress-ng --cpu 2 --switch 50 --timeout 60s报表。 此命令故意生成高 CPU 上下文切换。

在 CPU 频繁进行上下文切换时 vmstat 的输出

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
107  0      0 5632724  11576 1571512    0    0    41    33   45   33  2  2 96  0  0
104  0      0 5630920  11576 1571600    0    0     0    52   30 203814 13 87  0  0  0
104  0      0 5630196  11576 1571700    0    0     0     8   29 203877 12 88  0  0  0
103  0      0 5626776  11576 1571916    0    0     0     8   42 200318 15 85  0  0  0

在高 CPU 环境下运行上下文切换时的 pidstat 输出

Linux 4.18.0-553.16.1.el8_10.x86_64 (rhel8)     09/19/2024      _x86_64_       (2 CPU)

06:05:09 AM   UID      TGID       TID   cswch/s nvcswch/s  Command

06:11:38 AM     0     32321         -    728.09      0.53  stress-ng-switc
06:11:38 AM     0         -     32321    728.09      0.53  |__stress-ng-switc
06:11:38 AM     0     32322         -    853.80      0.62  stress-ng-switc
06:11:38 AM     0         -     32322    853.80      0.62  |__stress-ng-switc
06:11:38 AM     0     32323         -    744.08      0.27  stress-ng-switc
06:11:38 AM     0         -     32323    744.08      0.27  |__stress-ng-switc
06:11:38 AM     0     32324         -    708.30      0.18  stress-ng-switc
06:11:38 AM     0         -     32324    708.30      0.18  |__stress-ng-switc
06:11:38 AM     0     32325         -    804.77      0.27  stress-ng-switc
06:11:38 AM     0         -     32325    804.77      0.27  |__stress-ng-switc
06:11:38 AM     0     32326         -    907.16      0.62  stress-ng-switc
06:11:38 AM     0         -     32326    907.16      0.62  |__stress-ng-switc
06:11:38 AM     0     32327         -    789.05      0.62  stress-ng-switc
06:11:38 AM     0         -     32327    789.05      0.62  |__stress-ng-switc

常见问题解答

如何确定最近或间歇性发生的高 CPU 问题的根本原因? 应检查哪些日志?

为了确定高 CPU 问题的根本原因,必须启用性能监视器工具,并在 sysstat 出现问题时运行此类工具。 我们需要在问题发生时的 sar 日志(包括在 SOSREPORT 日志捆绑包中)。

sar如果没有日志,我们无法在出现性能问题时建立比较基线。 这使得在高峰使用期间,很难确定性能降级的程度。

如果使用第三方监视工具,请在联系Microsoft 支持部门时提供有关这些工具的详细信息。 支持代理在将这些信息与从本机 Linux 命令行工具检索到的数据进行比较时,了解详细信息(如指标的定义)至关重要。

VM 当前 CPU 使用率较高。 如何确定根本原因?

可以使用诸如top和ps这样的工具来标识问题,如前面所述。

我已识别到高 CPU 进程。 是否可以对其进行调试?

若要检索线程列表,可以使用以下脚本。 它显示了前三个高 CPU 进程的每个线程的堆栈:

for H_PID in $(ps -eo pcpu,pid,ppid,user,args | sort -k1 -r | grep -v PID | head -3 | awk '{print $2}'); do ps -Llp $H_PID; sudo cat /proc/$H_PID/stack; echo; done

某个高 CPU 问题间歇性地发生,并每隔几分钟短暂地持续一段时间。 我们的sosreport已启用sysstat功能。 如何检查 sar 日志以确定根本原因?

默认 sar 收集间隔为 10 分钟。 如果问题在间隔太短或太短暂的情况下发生, sar 则可能不会显示问题,因为指标结果已聚合。 如果默认的 10 分钟间隔未提供必要的解决方法,则可以调整 sar 时间间隔,使其更适合诊断问题。

资料来源与适用范围

资料来源
微软官方 Linux 虚拟机排障文档
适用范围
Azure Linux 虚拟机;按正文发行版、内核及代理版本
内容语言
中文;命令、路径和错误标识保留技术原文
本地收录日期
2026-10-26
授权说明
CC BY 4.0

正文与所需资源由本站本地存储。查看来源及更新记录 ↗

请按适用版本和实际日志确认原因;本站没有对每一种系统或设备逐项执行文中的操作。