开发车载软件app,除了常用Android操作系统外,还可能是基于Linux系统开发。对于web应用基本也都部署在Linux系统上,所以,进行系统性能分析,很大情况下都是对Linux系统进行性能分析。此篇博客将重点介绍如果收集CPU相关指标以及对这些指标进行分析。
Linux系统CPU收集分析哪些指标数据
在对Linux系统进行性能指标收集和分析时,通常需要观察平均负载,cpu使用率,上下文切换次数,中断次数指标。下图从这四个方面进行了整理总结,给出了收集这些指标的常用命令,以及一些核心分析思路观点。具体如下图所示:
常用命令工具使用介绍
前面的图只是概括性的说明使用哪些命令收集性能指标数据,接下来会重点介绍其中的一些命令使用。
uptime命令:查看cpu负载信息,这个命令非常简单。
mpstat命令:是一个用于报告 CPU 使用情况的 Linux 命令。
-P
:指定要显示的 CPU,-P ALL
显示所有 CPU,-P 0
显示特定 CPU 0 的信息。-I
:显示中断统计信息。-I SUM
显示中断总数,-I CPU
显示每个 CPU 的中断信息。
如下图所示:mpstat命令除显示cpu使用情况外,还显示了硬中断和软中断数量。
top命令也是常用的查询cpu指标信息的命令,和top命令相比,mpstat可以显示中断数据信息。top命令中还显示了zombie进程数量,sleeping进程数量。另外,还显示了不同进程的各个指标数据,其中S列表示状态:不同状态值含义如下所示,如果某个状态的进程数量很大,就需要关注分析了。
R (Running):进程正在运行或者在运行队列中等待 CPU 时间。
S (Sleeping):进程处于休眠状态,等待某个事件(如 I/O 操作)完成。
D (Uninterruptible Sleep):进程在不可中断的睡眠状态中,通常是等待 I/O 操作。这种状态下,进程无法被信号打断。
T (Stopped):进程已被停止,通常是由于接收到 SIGSTOP 信号。
Z (Zombie):僵尸进程,已经完成执行但仍在进程表中保留记录,等待父进程读取其退出状态。
I (Idle):表示进程处于空闲状态,通常与线程有关。
pidstat命令:是一个强大的工具,用于收集和显示关于系统上各个进程的统计信息。它可以提供 CPU 使用率、内存使用率、I/O 使用情况等多种性能指标。
-u:显示每个进程的 CPU 使用情况。
-r:显示每个进程的内存使用情况。
-d:显示每个进程的 I/O 使用情况。
-p:指定进程 ID(PID)进行监控。-p 1234 监控 PID 为1234的进程,-p ALL 监控所有进程。
-t:显示线程的统计信息。
-w:显示每个进程的上下文任务切换情况。
如下图所示:
在实际项目,可以先通过top或者mpstat,vmstat等命令查看总体情况后,在使用pidstat命令查看某个具体进程的资源占用情况,进行下一步分析。
vmstat命令:该命令比较简单,通过该命令可以查看cs上下文切换次数,in:中断数量。
perf命令:
//ubuntu中安装perf工具
sudo apt update
sudo apt install linux-tools-common linux-tools-generic linux-tools-$(uname -r)
sudo perf record -a -g -- sleep 10 (--后面是要执行的命令)
sudo perf report
-a:全系统模式(system-wide),即收集整个系统上的所有 CPU 的性能数据,而不仅仅是当前运行的进程。
-g:启用调用图(call graph)记录。此选项用于收集函数调用栈信息,以便在分析时可以看到函数调用链。这有助于了解性能瓶颈发生在什么上下文中。
-p:记录特定进程的事件,通过进程ID指定。
-t:记录特定线程的事件,通过线程ID指定。
-e:指定要记录的事件类型。例如,cycles, instructions, cache-references, cache-misses 等。perf list可以列举所有的事件。
-o:指定输出文件,默认为 perf.data
执行perf命令后,通过perf report查看到的信息如下所示:下图中各列数据含义是:
OverHead/Children:表示该符号或函数消耗的 CPU 时间占整个采样期间的百分比。
Command:表示运行该符号或函数的进程的名称。
Shared Object:表示包含该符号或函数的共享对象或二进制文件名称,例如可执行文件或共享库
Symbol:表示采样期间的具体符号或函数名称。
对于各个指标数据的分析思路如下所示:
1. 识别高 Overhead 项
找出 Overhead 值较高的符号或函数,这些是系统的主要性能瓶颈。
例如,native_safe_halt 和 intel_idle 占用了较高的 CPU 时间,可能与系统的空闲状态管理相关。
2. 分析 Command
识别哪个进程(如 swapper、firefox、chrome)消耗了最多的 CPU 资源。系统进程(如 swapper)通常涉及内核级别的操作,而用户进程(如 firefox)涉及应用程序级别的操作。
3. 分析 Shared Object
确定性能瓶颈是来自于内核(如 [kernel.kallsyms])还是用户空间库(如 libxul.so)。内核符号表明系统级别的问题,而用户空间库表明应用程序的问题。
4. 分析 Symbol
具体到函数级别,了解性能瓶颈所在的代码段。如 js::RunScript 和 v8::internal::Compiler::Compile 表明 JavaScript 引擎在处理脚本或编译过程中存在性能问题。
对于Linux系统的分析,繁杂的内容在于,命令很多,不同的命令收集的指标,有些有重叠,有些有所不同。当需要查看某个指标信息时,需要大概知道可以通过哪些命令进行查看。下图统计了不同性能指标数据可以使用的命令。(备注:该图来源于极客时间-Linux性能优化专栏)
以上就是关于Linux系统cpu性能分析内容总体介绍。