[Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化

文章目录

  • [Linux性能优化] 线程卡顿优化。
  • 0、省流版本
  • 一、问题定位:CPU 资源分析
  • 二、线程卡顿现场复现
    • 线程优化前图片
  • 三、线程卡顿优化方向
    • 1.如果是轮询方式
    • 2.如果是事件驱动方式
  • 四、修改方式
    • 线程优化后图片

[Linux性能优化] 线程卡顿优化。

0、省流版本

如果采用的是轮询方式,即使用while(1)或者其他死循环的循环结束里面加延时,可以大幅度降低CPU占用率。

一、问题定位:CPU 资源分析

线程卡顿通常与 CPU 资源竞争、线程调度异常相关,第一步需通过系统监控工具定位资源瓶颈。
查看 CPU 使用率及线程状态
可参考这博客篇:
📖Linux 性能分析:TOP 命令深度解析(含 CPU / 线程监控指南)
1. 快速定位工具:top命令基础用法
如需实时查看 CPU 占用情况,可通过以下命令进入监控界面:

top -d 1  # 每秒刷新一次系统状态

按 H 键切换至线程级监控模式(显示所有 LWP 轻量级进程)
按 P 键按 CPU 占用率排序,快速定位高负载线程
(详细操作指南请参考前文链接)

二、线程卡顿现场复现

1. 优化前 CPU 线程分布(示例)

线程优化前图片

热插拔未优化
图注:TOP 线程界面显示某进程下多个线程 CPU 占用率超过 100%,存在资源竞争
图中显示 __check_usb_hot 线程(PID 1062)当前处于运行状态(R),占用 42.5% 的 CPU 资源,该线程属于 /mnt/bin/sctr1 程序,负责 USB 热插拔检测。正常情况下,热插拔检测程序不应长时间占用较高 CPU 资源,此情况可能由以下原因导致:

  • 程序逻辑问题:若检测机制未设置合理休眠时间,可能导致其高频查询 USB 状态,造成 CPU 资源浪费。
  • USB 设备异常:如设备接触不良、硬件故障或驱动问题,可能触发程序持续检测处理,增加 CPU 负担。

建议按以下步骤排查优化:

  • 检查 USB 设备:确认是否有设备异常插拔、接触不良或硬件故障,尝试更换 USB 设备或接口。
  • 审视程序逻辑:查看 __check_usb_hot 线程代码,优化检测频率(如增加检测间隔),避免无意义的高频检测。
  • 监控持续观察:使用 top -d 1 -p 1062 持续监控该线程 CPU 占用情况,结合系统日志分析是否有其他关联异常。
    通过以上排查,可定位具体原因并针对性优化,避免该线程对系统资源的不合理占用。

三、线程卡顿优化方向

1.如果是轮询方式

  • 降低轮询频率:
  • 目前轮询频率可能过高,导致 CPU 占用率较高。可以通过适当增大轮询间隔时间来降低 CPU 使用率。例如,原本每 100 毫秒轮询一次,可以尝试调整为每 500 毫秒或 1 秒轮询一次。
  • 动态调整轮询间隔:根据系统负载或 USB 设备的活动情况,动态调整轮询间隔。例如,在系统负载较高时,适当增大轮询间隔;在检测到有 USB 设备活动后,暂时减小轮询间隔以确保及时捕捉后续事件。
  • 减少不必要的操作:
  • 在每次轮询时,检查是否真的有必要遍历所有的 USB 设备。可以记录上次轮询时的设备列表,仅对新增或移除的设备进行详细处理,避免对未变化的设备进行重复操作。
  • 优化设备状态检查逻辑,避免不必要的系统调用或复杂计算。例如,如果只是检查设备是否存在,可以通过检查设备节点是否存在来快速判断,而不是进行完整的设备信息查询。

2.如果是事件驱动方式

  • 确保事件监听的正确性:
  • 检查事件监听的代码逻辑,确保能够正确捕获所有 USB 热插拔事件。可能存在事件丢失或未正确处理的情况。
  • 确认使用的事件机制是否是最新和最有效的。例如,在较新的 Linux 内核中,可能有更高效的 USB 事件通知方式。
  • 优化事件处理流程:
  • 事件处理函数中可能存在耗时操作,导致后续事件处理延迟。将耗时操作(如设备信息解析、日志记录等)移到单独的线程或异步任务中处理,以确保事件处理的及时性。
  • 对事件处理函数进行性能分析,找出可能的瓶颈并进行优化。例如,减少不必要的函数调用、优化数据结构等。

四、修改方式

static void *__check_usb_hotplug(void *pArgs)
{// .....略while(usb_hotpulg_running_check){// .....略USLEEP(1000*1000);//因为采用的是轮询方式,所以使用加延时。}return NULL;
}

线程优化后图片

热插拔优化后图

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

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

相关文章

ip与mac-数据包传输过程学习

你管这破玩意叫网络? 内容来源于飞天闪客,以前没有学习过网络的相关基础知识,只会去瞎设置,现在终于是弄明白了。 多台电脑之间想要通信,可以直接通过一条网线进行连接。但是随着网线的增加,这个就会比较…

数值分析知识重构

数值分析知识重构 一 Question 请构造一下数值分析中的误差概念以及每一个具体数值方法的误差是如何估计的? 二 Question 已知 n 1 n1 n1个数据点 ( x i , y i ) , i 0 , 1 , ⋯ , n (x_i,y_i),i0,1,\cdots,n (xi​,yi​),i0,1,⋯,n,请使用多种方法建立数据之间…

使用 Qt QGraphicsView/QGraphicsScene 绘制色轮

使用 Qt QGraphicsView/QGraphicsScene 绘制色轮 本文介绍如何在 Qt 中利用 QGraphicsView 和 QGraphicsScene 实现基础圆形绘制,以及进阶的色轮(Color Wheel)效果。 色轮是色彩选择器的常见控件,广泛应用于图形设计、绘画和 UI …

移除链表元素数据结构oj题(力扣题206)

目录 题目描述: 题目解读(分析) 解决代码 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 题目解读(分析&#…

GLPK(GNU线性规划工具包)中建模语言MathProg的使用

GNU MathProg是一种用于描述线性数学规划模型的建模语言。用GNU MathProg语言编写的模型描述由一组语句和数据块组成。 在MathProg中,模型以集合、参数、变量、约束和目标(sets, parameters, variables, constraints, objectives称为模型对象)的形式进行描述。 在Ma…

《Python星球日记》 第77天:模型部署与总结

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、模型部署技术1. 模型文件导出不同模型格式对比2. 使用Flask构建RESTful API3. 使用FastAPI构建高性能API4. 部署优化与最佳实践二、部署架构…

【JavaWeb】MySQL(准备篇)

1 MySQL安装 1.1 解压 下载完成后我们得到的是一个压缩包(所有文件均在文末安装包中),将其解压,我们就可以得到MySQL 8.0.34 的软件本体了(就是一个文件夹),我们可以把它放在你想安装的位置 。 1.2 配置 1.2.1 配置…

国产数据库工具突围:SQLynx如何解决Navicat的三大痛点?深度体验报告

引言:Navicat的"中国困境" 当开发者面对达梦数据库的存储过程调试,或是在人大金仓中处理复杂查询时,Navicat突然变得力不从心——这不是个例。 真实痛点:某政务系统迁移至OceanBase后,开发团队发现Navicat无…

ETL数据集成产品选型需要关注哪些方面?

ETL(Extract,Transform,Load)工具作为数据仓库和数据分析流程中的关键环节,其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年,通过自身产品的实践应用,对 ETL 产品选型…

数据结构实验10.1:内部排序的基本运算

文章目录 一,实验目的二,实验内容1. 数据生成与初始化2. 排序算法实现(1)直接插入排序(2)二分插入排序(3)希尔排序(4)冒泡排序(5)快速…

从秒开到丝滑体验!WebAssembly助力ZKmall商城重构 B2B2C 商城性能基线

在 B2B2C 电商领域,用户对页面加载速度与交互流畅度的要求日益严苛。传统 Web 技术在处理复杂业务逻辑、海量数据渲染时,常出现卡顿、延迟等问题,导致用户流失。ZKmall 商城创新性地引入 WebAssembly(简称 Wasm)技术&a…

FD+Mysql的Insert时的字段赋值乱码问题

方法一 FDQuery4.SQL.Text : INSERT INTO 信息表 (中心, 分组) values(:中心,:分组); FDQuery4.Params[0].DataType : ftWideString; //必须加这个数据类型的定义,否则会有乱码 FDQuery4.Params[1].DataType : ftWideString; //ftstring就不行,必须是…

vue2.0 组件生命周期

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…

使用GmSSL v3.1.1实现SM2证书认证

1、首先使用gmssl命令生成根证书、客户端公私钥,然后使用根证书签发客户端证书; 2、然后编写代码完成认证功能,使用根证书验证客户端证书是否由自己签发,然后使用客户端证书验证客户端私钥对随机数的签名是否正确。 第一部分生成根…

升级mysql (rpm安装)

#备份以防万一 备份配置文件: /etc/my.cnf.d/server.cnf 备份数据: mysqldump -u your_username -p --all-databases > all_databases.sql #停止 systemctl stop mysql #卸载旧版 yum remove mariadb #安装新版( 通过yum安装报错,死活安装不了,只能rpm安装) 下载地址…

深入理解pip:Python包管理的核心工具与实战指南

# 深入理解pip:Python包管理的核心工具与实战指南 在Python开发中,第三方库是提升效率的关键。而pip作为Python官方的包管理工具,承担着安装、卸载、升级和管理库的重要职责。本文将全面解析pip的核心命令,结合实例演示用法&#…

Linux配置SSH密钥认证

介绍 配置SS秘钥认证后,可以通过shell脚本免密删除文件或执行命令。 # 生成密钥对(如果还没有) ssh-keygen -t rsa# 将公钥复制到服务器 ssh-copy-id "$remote_user$remote_host"

python打卡第30天

知识点回顾: 一,导入官方库的三种手段。 使用 import 直接导入整个模块 import module_name 使用 from ... import ... 导入特定功能 from module_name import function_name 使用 as 关键字重命名模块或功能 import module_name as alias # 或 from mod…

Java基础(网络编程)

一、概述 目的:网络通信: 1、设备和设备 2、进程和进程 1)不同设备之间 2)本地设备之间 需要解决的问题: 如何准确地发送到对方的主机 - IP地址 - 唯一的定位网络中的一台主机 如何准确的发送到对方主机的进程 -…

第二届parloo杯的RSA_Quartic_Quandary

(害,还是太菜了,上去秒了一道题之后就动不了了,今晚做个记录,一点点的往回拾起吧) # from Crypto.Util.number import getPrime, bytes_to_long # import math # # FLAG b************** # # # def gene…