Linux性能分析实战:用trace揪出卡顿、高CPU的“真凶”

3932 2026-02-04

Linux开发或运维的你,是否常被这些问题困扰:服务突然卡顿却找不到根源,CPU占用率飙升但查不到罪魁祸首,系统响应变慢却摸不清瓶颈?其实,Linux内核早已为我们准备了透视镜”——trace跟踪技术,今天就手把手教你从生成trace文件到可视化分析,搞定性能难题!

wKgZPGkanJaAQBRoAAMpnATTzdc834.png

一、先搞懂:trace分析的核心工具

在开始实操前,我们先理清几个关键工具的作用,避免知其然不知其所以然

debugfs/tracefsLinux内核提供的调试文件系统,是trace分析的基础设施debugfs用于暴露内核调试信息,tracefs专门记录内核/应用的事件(如CPU调度、系统调用),后续工具都依赖这两个文件系统。

atraceAndroid团队推出的跟踪工具(也适用于Linux),能收集内核事件(sched调度、syscalls系统调用)和应用活动(如线程状态),生成原始trace文件。

catapultGoogle开源的性能分析套件,其中trace2html工具能将原始trace文件转成交互式HTML报告,让我们用可视化方式快速定位问题。

adb:跨设备传输工具,当我们在嵌入式Linux(如开发板)或Android设备上分析时,用它实现本地电脑与目标设备的文件传输。

二、手把手实操:从0生成trace分析报告

接下来我们以分析某Linux服务卡顿为例,按步骤完成整个流程,所有命令都已标注细节,新手也能跟着做!

步骤1:检查核心文件系统是否挂载

首先要确认debugfstracefs已挂载——这是后续操作的前提,没挂载的话工具会罢工

在目标Linux设备(或通过adb连接的远程设备)上执行:

#检查debugfs是否挂载

mount | grep debugfs

#检查tracefs是否挂载

mount | grep trace

关键补充:

如果执行后无输出(文件系统未挂载),手动挂载(需root权限):

#挂载debugfs到默认路径

mount -t debugfs debugfs /sys/kernel/debug

#挂载tracefs到默认路径

mount -t tracefs tracefs /sys/kernel/tracing

不同Linux发行版路径可能有差异(如部分嵌入式设备是/debug),可通过find / -name debugfs查找实际路径。

步骤2:上传工具到目标设备

我们需要将两个关键文件传到目标设备:atrace.sh(封装atrace命令的脚本,简化参数配置)和catapult-main.zip(可视化工具包)。

在本地电脑(Windows为例)打开命令行,执行adb传输命令:

# 1.上传atrace.sh脚本到目标设备的根目录(/

adb push C:Usersmdg_rDesktoppullatrace.sh /

# 2.上传catapult工具压缩包到根目录

adb push C:Usersmdg_rDesktoppullcatapult-main.zip /

# 3.atrace.sh添加可执行权限(Linux文件默认无执行权)

adb shell chmod 777 /atrace.sh

小知识:

chmod 777表示所有用户(所有者、组、其他)都有读、写、执行权限,测试环境用很方便;生产环境建议缩小权限(如chmod 700,仅所有者可执行)。

如果目标设备不是Android(如Ubuntu服务器),无需用adb,直接用scp传输文件:scp C:xxxatrace.sh user@服务器IP:/

步骤3:生成原始trace文件

执行atrace.sh脚本,收集系统运行数据。脚本参数my_trace是输出文件名,3表示跟踪3(根据需求调整,建议1-5秒,避免文件过大)。

在目标设备上执行:

#进入根目录

cd /

#运行脚本,跟踪3秒,输出到my_trace文件

./atrace.sh my_trace 3

深入理解:

atrace.sh本质是封装了atrace命令,你也可以直接用原生命令自定义跟踪内容,比如只跟踪CPU调度和系统调用:

#原生atrace命令:跟踪sched(调度)、syscalls(系统调用),持续3

atrace --set_events sched,syscalls -o my_trace 3

常见跟踪事件类型:schedCPU调度)、gfx(图形渲染,适合UI场景)、disk(磁盘I/O)、mem(内存活动),根据性能问题类型选择。

步骤4:将trace文件转成可视化HTML

原始trace文件是纯文本,几百行甚至几十万行数据,直接看根本看不懂——这时候catapulttrace2html就派上用场了,能把数据转成带时间轴的交互式报告。

先解压catapult工具包,再执行转换命令:

# 1.解压catapult压缩包(如果已解压可跳过)

unzip catapult-main.zip

# 2.执行trace2html,生成HTML报告

./catapult-main/tracing/bin/trace2html --config chrome --output my_trace.html my_trace

关键说明:

--config chrome表示按Chrome浏览器的报告格式生成(最常用,支持丰富的视图);

执行后会生成my_trace.html文件,这个就是我们最终要分析的性能报告

步骤5:拉取报告到本地分析

目标设备(如开发板)可能没有浏览器,把HTML文件拉回本地电脑,用ChromeEdge等浏览器打开分析。

在本地电脑执行adb拉取命令:

adb pull /my_trace.html C:Usersmdg_rDesktoppull

至此,我们就完成了从收集数据生成报告的全流程,接下来就是最核心的——分析报告找问题

三、核心技巧:怎么从HTML报告中揪出性能瓶颈?

打开my_trace.html后,主要关注3个核心视图,90%的性能问题都能在这里找到答案:

1.时间轴视图(Timeline):看卡顿点

这是最直观的视图,横向是时间(从跟踪开始到结束),纵向分3层:

CPU核心层:每个CPU核心的运行状态(绿色=运行,灰色=空闲,橙色=中断);

进程层:每个进程的活动时间线;

线程层:每个线程的状态(Running =运行,Waiting =等待,Sleeping =休眠)。

分析方法:

异常等待:如果某个业务线程长时间处于Waiting状态(比如超过100ms),可能是CPU资源不足(被其他进程抢占)或锁竞争(线程等锁);

时间断层:如果整个时间轴突然有一段无活动(灰色),可能是系统调用阻塞(如磁盘I/O卡住)。

2. CPU占用视图(CPU Usage):找CPU的进程

这个视图用柱状图或折线图展示每个CPU核心的占用率,以及每个进程对CPU的消耗占比。

分析方法:

峰值:如果某进程的CPU占用率突然飙升到90%以上,且持续时间长,那它很可能是性能瓶颈;

核心负载均衡:如果只有1CPU核心占用率高,其他核心空闲,可能是进程线程数太少,或存在单线程瓶颈。

3.事件详情视图(Event Details):查耗时操作

点击时间轴上的任意事件(如sys_read系统调用、sched_switch调度事件),会弹出详情面板,显示:

事件开始/结束时间、持续时长;

关键参数(如sys_read的文件描述符、读取字节数);

调用栈(如果开启了栈跟踪)。

分析方法:

长耗时事件:比如sys_write耗时超过50ms,可能是磁盘写入速度慢;sched_switch频繁,可能是进程切换太频繁(上下文切换开销大);

调用栈:如果某函数调用耗时久,可顺着调用栈定位到具体代码(需配合符号表)。

四、避坑指南:这些问题别踩!

1.trace有性能开销,生产环境慎用

跟踪过程会消耗CPU和内存(尤其是跟踪事件多、时长久时),生产环境建议:缩短跟踪时长(1-3秒);只跟踪关键事件(如只跟踪sched+syscalls);避开业务高峰期。

2.权限不够?先提权!

挂载tracefs/debugfs、运行atrace都需要root权限,执行命令前加sudo(如sudo ./atrace.sh),或切换到root用户(su root)。

3.文件太大打不开?先筛选事件

如果trace文件超过100MBHTML报告可能加载缓慢,建议在生成trace时用--set_events筛选事件,比如只跟踪与业务相关的进程:atrace -p 1234(进程ID-o my_trace 3

4.工具兼容性问题

atrace在非Android设备上需安装依赖:Ubuntu/CentOS可执行sudo apt install android-tools-adb(部分系统需手动编译atrace);

catapult需要Python环境(Python 2.73.x),如果执行trace2html报错,先检查Python是否安装:python --version

五、总结

今天我们用检查文件系统上传工具生成trace→HTML→分析报告的流程,完整走了一遍Linux trace性能分析。这套方法的核心优势是:

底层可见:能看到内核级事件(如调度、系统调用),比topps等工具更深入;

可视化直观HTML报告比纯文本日志更容易定位问题;

跨场景适用:嵌入式Linux、服务器、Android设备都能用。

如果你的项目中遇到了特殊的性能问题(比如内存泄漏、网络延迟),或者对trace分析有疑问,欢迎在评论区留言!需要atrace.sh脚本模板或catapult工具包的朋友,也可以私信我获取~