【调试工具】perf 定位cpu占用100%

133 阅读2分钟

一、问题描述

在一台服务器上,出现一个进程占用cpu百分比,如下 在这里插入图片描述 tips:

什么是 kworker? kworker表示进行“工作”(处理系统调用)的Linux内核进程。在进程列表中可以有多个:kworker/35:1 在第 35 个 CPU 内核上 kworker/35:1 是一个,在第二个CPU内核上是一个,依此类推。

二、perf 源码编译

1.嵌入式linux 内核源码目录中 tools 目录中有 perf 工具源码,编译就可以了

make ARCH=arm64 CROSS_COMPILE=~/bin/arm-histbv320-linux- perf LDFLAGS+=--static NO_LIBELF=1 V=1 WERROR=0 NO_SLANG=1 NO_GTK2=1 NO_LIBAUDIT=1 NO_LIBNUMA=1 NO_LIBPERL=1 NO_STRLCPY=1

发布文件位置:tools 目录 tips:交叉编译只需更改CROSS_COMPILE=<交叉编译工具的路径>

2.通用服务器 安装perf需要根据你的Linux发行版和版本进行区别对待。下面是在Ubuntu系统上安装perf的步骤:

1. sudo apt-get update
2. sudo apt install linux-tools-common
3. uname -r
4. sudo apt-get install linux-tools-内核版本(uname -r)

perf -v

三、问题定位

在出问题的设备上只需记录采集信息

perf record -g -a sleep 10

结束就会生成 perf.data 文件 在这里插入图片描述

perf report

在这里插入图片描述 可以看到:fsl_scan_event 函数占用是最高的,接着就可以去找对应的函数代码了。

四、问题原因

fsl_scan_event 函数内是一个while 循环,如下 在这里插入图片描述 以4ms的频率去做轮询,经调整将轮询时间间隔由4ms改为10ms,cpu 使用就正常了。在代码中需要注意对于不同的cpu处理能力是不一样的,在类似这种死循环中,其中的循环时间间隔要考虑实际情况去配置。

五、总结

perf 工具是非常强大的,能够在项目开发过程中来定位各种系统问题,来达到对性能优化。