一、问题描述
在一台服务器上,出现一个进程占用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 工具是非常强大的,能够在项目开发过程中来定位各种系统问题,来达到对性能优化。