文章目录
- [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;
}