适用于:✔️ 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 时间间隔,使其更适合诊断问题。