一起内核线程异常占用CPU资源的排查过程

news2024/9/21 4:30:02

1、软硬件环境

        硬件: NXP LS1043A  4核 cortex-A53

        软件: linux 5.10.35

2、问题现象

      最近有个产品要把内核从4.19升级到 5.10.35版本,产品在内核版本4.19工作正常,升级到5.10.35以后,产品在不接任何外设,不跑应用程序的情况下,发现会有1个核完全被内核异常占用掉,系统启动后,异常现象一直持续。

3、排查过程

单从故障现象看,我们无法判断出具体是那一块的问题。首先看下是否有异常的内核参数。答案是没有。

a. perf top 抓函数热点

尝试用perf top 抓函数热点,看下具体是哪个函数在消耗该CPU的时间

 可以看到内核在不停的在 _raw_spin_unlock_irq  与_raw_spin_unlock_irqrestore 之间 频繁调用。

现在我们已经确定了该CPU在频繁调用 _raw_spin_unlock_irq   函数,但是我们依然无法判断出具体是那一块的问题。

b. ftrace 查看 _raw_spin_unlock_irq   上层调用栈

cd /sys/kernel/debug/tracing/
echo 0 > tracing_on

echo _raw_spin_unlock_irq > set_ftrace_filter
echo function > current_tracer 

echo 1 > options/func_stack_trace

# 过滤下pid, 因为调用_raw_spin_unlock_irq 的线程比较多
echo 57 > set_ftrace_pid

> trace #清除 trace 内容
echo 1 > tracing_on && sleep 1 && echo 0 > tracing_on

 从结果上来,是和usb 有关系,这个我们可以简单的使用内核参数关掉usb功能验证一下

把USB 关掉验证一下,正常了。

cat /proc/cmdline

console=ttyS0,115200 root=/dev/mmcblk0p1 rootwait rw usbcore.nousb

这就说明是usb的问题,但是我们还是没有定位到USB的具体问题。

c. 使用function_graph功能 统计每个函数的执行时间 做一个排序

echo 1 >  ./function_profile_enabled

# 等过2分钟再查看统计 
cat ./trace_stat/function0 | head -100

不过在执行过程中,发现

 应该是该选择没有打开

 重新编译内核后,查看结果 猜测是跟 usb suspend 有关系

d  这里也可以使用火焰图来分析

top 命令可以看到内核线程pid为54 

 然后执行下面命令来获取 perf采集数据

perf record -F 99 -p 54 -g -- sleep 60
record:表示采集系统事件,没有采用 -e 执行采集事件,则默认采集 cycles(即 CPU clock 周期)。

-F 99:指定采样频率为 99Hz(每秒99次),如果 99次都返回同一个函数名, 那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。

-p 54:指定进程号,对某一个进程分析。

-g:表示记录调用栈。

sleep 60:表示持续 60 秒

 可以使用下面命令来简单查看 perf.data内容

perf report -n --stdio
root@localhost:~# perf report -n --stdio
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 3K of event 'cycles:ppp'
# Event count (approx.): 53389208829
#
# Children      Self       Samples  Command         Shared Object      Symbol                                 
# ........  ........  ............  ..............  .................  .......................................
#
   100.00%     0.00%             0  kworker/1:1+pm  [kernel.kallsyms]  [k] worker_thread                      
            |
            ---worker_thread
               |          
               |--99.98%-- process_one_work
               |          |          
               |          |--56.49%-- pm_runtime_work
               |          |          |          
               |          |          |--55.14%-- rpm_idle
               |          |          |          |          
               |          |          |          |--55.09%-- __rpm_callback
               |          |          |          |          |          
               |          |          |          |          |--53.69%-- usb_runtime_idle
               |          |          |          |          |          |          
               |          |          |          |          |          |--53.51%-- __pm_runtime_suspend
               |          |          |          |          |          |          |          
               |          |          |          |          |          |          |--51.24%-- rpm_suspend
               |          |          |          |          |          |          |          rpm_callback
               |          |          |          |          |          |          |          |          
               |          |          |          |          |          |          |          |--51.22%-- __rpm_callback
               |          |          |          |          |          |          |          |          |          
               |          |          |          |          |          |          |          |          |--49.52%-- usb_runtime_suspend
               |          |          |          |          |          |          |          |          |          |          
               |          |          |          |          |          |          |          |          |          |--49.44%-- usb_suspend_both
               |          |          |          |          |          |          |          |          |          |          |          
               |          |          |          |          |          |          |          |          |          |          |--25.99%-- hub_suspend
               |          |          |          |          |          |          |          |          |          |          |          |          
               |          |          |          |          |          |          |          |          |          |          |          |--16.46%-- set_port_feature
               |          |          |          |          |          |          |          |          |          |          |          |          |          
               |          |          |          |          |          |          |          |          |          |          |          |          |--16.39%-- usb_control_msg
               |          |          |          |          |          |          |          |          |          |          |          |          |          |          
               |          |          |          |          |          |          |          |          |          |          |          |          |          |--13.27%-- usb_

 由于这个结果不是很直观,需要我们生产火焰图来进一步来观察

生成火焰图

首先使用 perf script 工具对上面生成的 perf.data 进行解析,先下载我们需要的脚本。

git clone https://github.com/brendangregg/FlameGraph.git 

# 生成折叠后的调用栈
perf script -i perf.data &> perf.unfold

# 生成火焰图
./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded

# 生成svg
./FlameGraph/flamegraph.pl perf.folded > perf.svg

上述三条命令,也可以通过下面的管道命令来操作: 

perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > perf.svg

我们将生成的SVG拷贝到电脑上,用浏览器打开,可以清晰的看到函数的调用情况! 

 函数从下往上调用。左右是条件分支。

从火焰图上更加清晰的可以看到 _raw_spin_unlock_irq  所以的调用流程和条件分支。更有利于我们判断问题!

4 尝试解决

 从上面的分析,看着是卡在usb suspend, 这里尝试将usb autosuspend给关闭掉试试

默认是下面的值

# cat /sys/bus/usb/devices/usb1/power/control

auto

改成 如下,系统CPU资源变成正常

echo on > /sys/bus/usb/devices/usb1/power/control
echo on > /sys/bus/usb/devices/usb2/power/control
echo on > /sys/bus/usb/devices/usb3/power/control
echo on > /sys/bus/usb/devices/usb4/power/control
echo on > /sys/bus/usb/devices/usb5/power/control
echo on > /sys/bus/usb/devices/usb6/power/control

top 和 perf top 均显示正常。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基础1】SQL 数据库分类 代码建库、代码修改属性 代码建表 代码修改数据表属性 代码为数据表插入信息 数据的修改与删除

目录 数据库基础 代码建库 数据完整性 代码建表 数据库基础 系统数据库:master、model、tempdb、madb数据库文件的组成:【数据文件可以放在不同的文件组里】 主数据文件:*.mdf 主数据文件只能有一个次要数据文件:*.ndf日志文…

DolphinScheduler 集群模式部署

文章目录 DolphinScheduler 集群模式部署一、集群规划1、前置准备工作2、解压DolphinScheduler 安装包3、创建元数据库及用户 二、配置一键部署脚本1、初始化数据库2、一键部署 DolphinScheduler3、DolphinScheduler 启停命令 DolphinScheduler 集群模式部署 一、集群规划 集…

01.数据结构和算法概述

前言 数据结构是一个古老的课题。他与程序开发息息相关,但是我们日常开发中,好像很少让我们自己设计一个数据结构。只求程序能跑,并不太关注性能。但是它是我们软件开发人员的基本功,也是拉开普通程序员和高级程序员的一个门槛&a…

Selenium浏览器交互原理与应用,玩转Web自动化测试

目录 前言: 浏览器交互: Selenium的实现方式: Selenium WebDriver: WebDriver的等待机制: 总结: Web自动化测试: 前言: Web自动化测试是现代软件开发中必不可少的一个环节,它可以帮助开发人员快速自动…

ChatGPT4通道开放接入基于OPEN AI 平台你的任何APP 可一键接入AI 智能

你一定很好奇什么是 OPEN AI快速开发平台 顾名思义,开放的OPEN AI平台。 基于这个平台你的上层应用,如何 APP,小程序,H5,WEB, 公众号,任何一切终端都可以轻松接入,AI智能应用。 开发初衷 爆肝一周,我开源了ChatGPT 中文版接口&a…

Win11右键菜单选项变成英文了怎么恢复回来?

Win11右键菜单选项变成英文了怎么恢复回来?有用户在使用Win11系统的时候,遇到了右键菜单选项的一些选项变成英文的情况,导致自己的使用受到了影响。那么这个情况怎么去进行解决呢?来看看以下的解决方法吧。 方法一:直接…

零基础学网络安全?一般人我还是劝你算了吧

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

mathtype公式符号显示不对

文章目录 问题解决方法结果 记录攥写论文遇到的问题及解决方法 问题 使用mathtype编辑公式过后,发现公式显示不对,出现两种问题: 1:部分符号变为方框 2:符号大小异常 例如: 解决方法 第一种&#xff1a…

KDZD5550系列电压击穿试验仪操作说明

一、产品概述 KDZD5550系列电压击穿试验仪根据国家GB1408.1-2006《绝缘材料电气强度试验方法》其作用可称为电气绝缘强度试验仪、介质强度测试仪等。其工作原理是:把一个高于正常工作的电压加在被测设备的绝缘体上,持续一段规定的时间,加在上…

优思学院|DOE试验设计在六西格玛项目的哪个阶段进行?

六西格玛DMAIC是一种用于现有流程改进的方法,其中包括五个阶段:定义阶段(D),测量阶段(M),分析阶段(A),改进阶段(I)和控制阶…

【C++动态内存管理】

目录 一、C/C内存分布二、C中动态内存管理2.1new/delete操作内置类型2.2new/delete操作自定义类型 四、new和delete的实现原理4.1内置类型4.2自定义类型 五、 定位new表达式(placement-new)六、总结 一、C/C内存分布 一张图重温一下C/C内存分布。 二、C中动态内存管理 C中的…

计算物理专题:高维Romberg数值积分方法

有话无话,先上代码,正确与否,先给结论,可信有无,先出文献计算物理,傅哥最强 真计算还得看SCU物拔(不是)(狗头)(骄傲)这种方法的思想是…

Springboot +Flowable,会签、或签简单使用(三)

一.简介 **会签:**在一个流程中的某一个 Task 上,这个 Task 需要多个用户审批,当多个用户全部审批通过,或者多个用户中的某几个用户审批通过,就算通过。 例如:之前的请假流程,假设这个请假流程…

【笔试强训选择题】Day15.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言 一、…

Linux Shell 实现一键部署二进制Python

python 前言 Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使…

监控知识体系

从来没讲过运维,因为我觉得运维这种东西不需要太多的知识面,然后我一个做了运维朋友告诉我大错特错,他就是从3K的运维一步步到40K的,甚至笑着说:我现在感觉自己什么都能做。 既然讲,就讲最重要的吧。 监控…

接口自动化测试分层设计与实践总结

本文以笔者当前使用的自动化测试项目为例,浅谈分层设计的思路,不涉及到具体的代码细节和某个框架的实现原理,重点关注在分层前后的使用对比,可能会以一些伪代码为例来说明举例。 接口测试三要素: 参数构造 发起请求&a…

NA、商业和分销市场通盘布局,华为“四大角色”浮出水面

作者 | 曾响铃 文 | 响铃说 数字经济深化发展,谋求数字化转型的行业、企业客户,越来越渴望满足自身需求的产品或解决方案。 这给从事转型服务的ICT厂商们提出了新的挑战。 在客户面前,拥有核心技术与支持能力的企业,与进击数字…

yolov1

1、对precision(精确度)和recall(召回度)的理解 1、TP TN FP FN的概念 TP(True Positives)意思就是被分为了正样本,而且分对了。 TN(True Negatives)意思就是被分为了负…

原装美国Agilent安捷伦34970A数据采集仪

Agilent安捷伦34970A数据采集仪 3槽主机,内置GPIB和RS232接口 6 1/2 位(22 位)内部 DMM,每秒扫描多达 250 个通道(选件 001 不可用) 8个开关和控制插件模块可供选择 内置信号调理可测量热电偶、RTD 和热敏电…