全面理解 Linux 内核性能问题:分类、实战与调优策略
在 Linux 系统(特别是嵌入式或服务器环境)中,性能问题往往错综复杂、表象多变。只有对常见性能问题进行系统归类、理解其症状与根源,才能有效定位和解决。本文将围绕八大类核心性能问题,结合实战示例,逐类分析其症状、诊断方式与优化建议。
一、CPU 相关问题
1. CPU 占用过高
- 表现:top/htop 工具显示某进程持续占用 CPU 90%+
- 实战案例:一个 camera 服务在未加帧率限制下调用 V4L2 接口拉流,导致
poll()
函数阻塞后立即返回,CPU 核爆炸。 - 分析工具:
top
/htop
/perf top
- 优化思路:引入 sleep 控制帧率,或采用
poll + 超时等待
降低活跃度。
2. 核心负载不均
- 表现:只有 CPU0 忙,其它核心闲置
- 实战案例:某多线程算法未使用 CPU 亲和性绑定,所有线程默认绑定 CPU0
- 分析工具:
htop
、taskset
、mpstat
- 优化思路:合理使用
sched_setaffinity()
或 taskset 工具进行核心绑定
二、内存相关问题
1. 内存泄漏
- 表现:系统长时间运行后 free memory 逐渐下降
- 实战案例:一款 GUI 程序未释放 QImage 内存,leak 随时间线性增长
- 分析工具:
slabtop
、kmemleak
、valgrind - 优化思路:代码审查+动态内存监测,必要时引入 slab shrink 机制
2. OOM 杀进程
- 表现:dmesg 出现“Out of memory: Kill process xxx”
- 实战案例:GStreamer 管道泄露 buffer,累计后触发 OOM Killer
- 分析工具:
dmesg
、free
、vmstat
- 优化思路:查看
oom_score_adj
设置、限制用户态 buffer 数量
三、IO 相关问题
1. 磁盘读写慢
- 表现:应用层读取磁盘速度远低于预期
- 实战案例:嵌入式 Nand 芯片采用不合适的页写入策略,造成系统频繁 sync
- 分析工具:
iotop
、iostat
、blktrace
- 优化思路:使用
fadvise
设定访问模式,或更换文件系统如 F2FS
2. 小文件频繁读写
- 表现:CPU 低、IO 高、吞吐低
- 实战案例:日志系统频繁刷入几十 byte 小日志块
- 分析工具:
strace
、perf record
- 优化思路:采用内存缓冲区,批量刷新,提高 write 聚合度
四、调度相关问题
1. 调度延迟大
- 表现:实时任务响应慢,
cyclictest
抖动大 - 实战案例:某 motor 控制应用需要 1ms 响应,而系统触发 softirq 后延迟长达 20ms
- 分析工具:
cyclictest
、ftrace
、trace-cmd
- 优化思路:使用 PREEMPT_RT、提升优先级、CPU 亲和绑定
2. 优先级反转
- 表现:高优进程卡在低优锁持有上
- 实战案例:高优线程请求 GPIO 锁,因后台线程长持有,阻塞严重
- 分析工具:
ftrace
、perf sched
- 优化思路:引入
rt_mutex
,或调整锁机制,防止抢占失效
五、锁相关问题
1. 死锁 / 饥饿
- 表现:多个线程卡死,CPU 占用低
- 实战案例:驱动 A 请求锁1后再请求锁2,驱动 B 反向请求,造成循环等待
- 分析工具:
sysrq-w
、ps -eLf
、ftrace
- 优化思路:避免循环依赖、按统一顺序加锁
2. 自旋锁冲突
- 表现:CPU 占用高但系统无实质响应
- 实战案例:核心驱动中自旋锁保护临界区,受 IRQ 或 SMP 干扰频繁冲突
- 分析工具:
lockstat
、perf record
- 优化思路:使用
mutex
替代,避免长时间自旋
六、中断相关问题
1. 中断风暴
- 表现:/proc/interrupts 某中断计数持续飞增
- 实战案例:某 GPIO 误触发中断不断激活 ISR
- 分析工具:
cat /proc/interrupts
、ftrace -e irq_handler_entry
- 优化思路:屏蔽中断、消抖处理、增加 IRQ 限流
2. 中断绑核不均衡
- 表现:只在 CPU0 收到中断,其它 CPU 闲置
- 实战案例:未启用 irqbalance,某网卡接收中断全部集中到 CPU0
- 分析工具:
mpstat
、irqbalance
、/proc/interrupts
- 优化思路:合理配置
/proc/irq/*/smp_affinity
七、驱动相关问题
1. probe/init 卡顿
- 表现:系统启动慢卡在设备注册过程
- 实战案例:EEPROM 驱动
at24_probe()
中等待 i2c 响应超时 1s - 分析工具:
ftrace
,function_graph
,bootchart
- 优化思路:分析 probe 函数,尽量避免超时操作
2. read/write 速度慢
- 表现:设备响应慢,程序阻塞明显
- 实战案例:字符设备无 DMA 支持,read 每次仅 4 byte
- 分析工具:
strace
、perf trace
- 优化思路:使用 DMA、缓存聚合,或使用
poll/select
替代阻塞等待
八、网络相关问题
1. 吞吐下降 / 丢包
- 表现:ping 丢包,iperf 带宽未达标
- 实战案例:RTL 网卡驱动未启用 GRO/TCP 分段 offload
- 分析工具:
ethtool -k
、iperf3
、nstat
- 优化思路:启用 TSO/GSO,优化网卡驱动
2. 网络软中断占用高
- 表现:
ksoftirqd/0
CPU 占用高达 60% - 实战案例:大量 UDP 数据包到达,引发高频软中断处理
- 分析工具:
top
、cat /proc/softirqs
- 优化思路:设置 RPS/XPS 分流中断,减轻 CPU 压力
总结:性能问题的分析与修炼建议
- 工具熟练是基础:top、perf、ftrace、slabtop、iotop 等应信手拈来
- 结构理解是核心:必须理解调度器、内存系统、I/O 子系统、锁机制
- 经验积累是保障:多看、多试、多验证,逐步形成问题感知和判断能力
📌 建议建立自己的性能问题定位 checklist 和模板文档,可在实际工作中极大提升效率。
🧠 视频教程请关注 B 站:“嵌入式 Jerry”
相关文章:

全面理解 Linux 内核性能问题:分类、实战与调优策略
在 Linux 系统(特别是嵌入式或服务器环境)中,性能问题往往错综复杂、表象多变。只有对常见性能问题进行系统归类、理解其症状与根源,才能有效定位和解决。本文将围绕八大类核心性能问题,结合实战示例,逐类分…...

算法-多条件排序
1、数对排序的使用 pair<ll,ll> a[31];//cmp为比较规则 ll cmp(pair<ll,ll>a,pair<ll,ll>b){if(a.first!b.first)return a.first>b.first;else return a.second<b.second; }//按照比较规则进行排序 sort(a1,a31,cmp); 2、具体例题 输入样例࿱…...
DelayQueue、ScheduledThreadPoolExecutor 和 PriorityBlockingQueue :怎么利用堆实现定时任务
DelayQueue DelayQueue 的最大亮点: 并不是简单全局锁的“单调队列”实现,而是用Leader-Follower 模式极大减少了线程唤醒的开销。插入与唤醒、等待与 leader 变更,都通过巧妙的锁和条件变量组合完成。 如果只关注“线程安全的优先队列全局…...
Kafka 消息模式实战:从简单队列到流处理(二)
四、Kafka 流处理实战 4.1 Kafka Streams 简介 Kafka Streams 是 Kafka 提供的流处理库,它为开发者提供了一套简洁而强大的 API,用于构建实时流处理应用程序。Kafka Streams 基于 Kafka 的高吞吐量、分布式和容错特性,能够处理大规模的实时…...
大数据(2) 大数据处理架构Hadoop
一、Hadoop简介 1.定义 Hadoop 是一个开源的分布式计算框架,由 Apache 基金会开发,用于处理海量数据,具备高可靠性、高扩展性和高容错性。它主要由两个核心模块组成: HDFS(Hadoop Distributed File System)…...
【Kotlin】注解反射扩展
文章目录 注解用法反射类引用 扩展扩展函数的作用域成员方法优先级总高于扩展函数 被滥用的扩展函数扩展属性静态扩展 标准库中的扩展函数 使用 T.also 函数交换两个变量sNullOrEmpty | isNullOrBlankwith函数repeat函数 调度方式对扩展函数的影响静态与动态调度扩展函数始终静…...

固定ip和非固定ip的区别是什么?如何固定ip地址
在互联网中,我们常会接触到固定IP和非固定IP的概念。它们究竟有何不同?如何固定IP地址?让我们一起来探究这个问题。 一、固定IP和非固定IP的区别是什么 固定IP(静态IP)和非固定IP(动态IP)是两种…...
升级centos 7.9内核到 5.4.x
前面是指南,后面是工作日志。 wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.225-1.el7.elrepo.x86_64.rpm wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.2…...
Nginx 安全设置配置
1、增加header公共文件 文件地址:/etc/nginx/conf.d/security_headers.conf # XSS防护配置add_header X-XSS-Protection "1; modeblock" always; # 其他安全配置add_header X-Content-Type-Options "nosniff";add_header X-Frame-Options &qu…...
协程的常用阻塞函数
以下是一些常见的阻塞函数示例: 1. **Thread.sleep()** 阻塞当前线程一段时间。 kotlin Thread.sleep(1000) // 阻塞线程 1 秒 2. **InputStream.read()** 从输入流中读取数据时会阻塞,直到有数据可用或流结束。 kotlin val inputStream FileInputStre…...
探索NoSQL注入的奥秘:如何消除MongoDB查询中的前置与后置条件
随着互联网技术的飞速发展,数据库作为信息存储与管理的核心,其安全性问题日益凸显。近年来,NoSQL数据库因其灵活性和高性能逐渐成为许多企业的首选,其中MongoDB以其文档存储和JSON-like查询语言在开发社区中广受欢迎。然而&#x…...

使用矩阵乘法+线段树解决区间历史和问题的一种通用解法
文章目录 前言P8868 [NOIP2022] 比赛CF1824DP9990/2020 ICPC EcFinal G 前言 一般解决普通的区间历史和,只需要定义辅助 c h s − t ⋅ a chs-t\cdot a chs−t⋅a, h s hs hs是历史和, a a a是区间和, t t t是时间戳,…...
React Navive初识
文章目录 搭建开发环境安装 Node、homebrew、Watchman安装 Node安装 homebrew安装 watchman 安装 React Native 的命令行工具(react-native-cli)创建新项目编译并运行 React Native 应用在 ios 模拟器上运行 调试访问 App 内的开发菜单 搭建开发环境 在…...
scss(sass)中 的使用说明
在 SCSS(Sass)中,& 符号是一个父选择器引用,它代表当前嵌套规则的外层选择器。主要用途如下: 1. 连接伪类/伪元素 scss 复制 下载 .button {background: blue;&:hover { // 相当于 .button:hoverbackgrou…...

如何从浏览器中导出网站证书
以导出 GitHub 证书为例,点击 小锁 点击 导出 注意:这里需要根据你想要证书格式手动加上后缀名,我的是加 .crt 双击文件打开...

低功耗MQTT物联网架构Java实现揭秘
文章目录 一、引言二、相关技术概述2.1 物联网概述2.2 MQTT协议java三、基于MQTT的Iot物联网架构设计3.1 架构总体设计3.2 MQTT代理服务器选择3.3 物联网设备设计3.4 应用服务器设计四、基于MQTT的Iot物联网架构的Java实现4.1 开发环境搭建4.2 MQTT客户端实现4.3 应用服务器实现…...
总结HTML中的文本标签
总结HTML中的文本标签 文章目录 总结HTML中的文本标签引言一、标题标签(h1 - h6)语法示例使用建议 二、段落标签(p)语法示例使用建议 三、文本节点标签(span)语法示例使用建议 四、粗体标签(b&a…...
python版若依框架开发:前端开发规范
python版若依框架开发 从0起步,扬帆起航。 python版若依部署代码生成指南,迅速落地CURD!项目结构解析前端开发规范文章目录 python版若依框架开发新增 view新增 api新增组件新增样式引⼊依赖新增 view 在 @/views文件下 创建对应的文件夹,一般性一个路由对应⼀个文件, 该…...
AI推理服务的高可用架构设计
AI推理服务的高可用架构设计 在传统业务系统中,高可用架构主要关注服务冗余、数据库容灾、限流熔断等通用能力。而在AI系统中,尤其是大模型推理服务场景下,高可用架构面临更加复杂的挑战,如推理延迟敏感性、GPU资源稀缺性、模型版本切换频繁等问题。本节将专门探讨如何构建…...
GPU集群故障分析:大型AI训练中的硬件问题与影响
GPU集群故障分析:大型AI训练中的硬件问题与影响 核心问题 在大型AI计算集群(如使用上千块GPU卡训练大模型)中: GPU硬件会出哪些毛病?这些问题发生的频率、严重程度如何?最终对AI训练任务有什么影响&#…...

ideal2022.3.1版本编译项目报java: OutOfMemoryError: insufficient memory
最近换了新电脑,用新电脑拉项目配置后,启动时报错,错误描述 idea 启动Springboot项目在编译阶段报错:java: OutOfMemoryError: insufficient memory 2. 处理方案 修改VM参数,分配更多内存 ❌ 刚刚开始以为时JVM内存设置…...

centos7编译安装LNMP架构
一、LNMP概念 LNMP架构是一种常见的网站服务器架构,由Linux操作系统、Nginx Web服务器、MySQL数据库和PHP后端脚本语言组成。 1 用户请求:用户通过浏览器输入网址,请求发送到Nginx Web服务器。 2 Nginx处理:Nginx接收请求后&…...
接口限频算法:漏桶算法、令牌桶算法、滑动窗口算法
文章目录 限频三大算法对比与选型建议一、漏桶算法(Leaky Bucket Algorithm)1.核心原理2.实现3.为什么要限制漏桶容量4.优缺点分析 二、令牌桶算法(Token Bucket Algorithm)1.核心原理2.实现(1)单机实现&am…...

Spring Boot 3.3 + MyBatis 基础教程:从入门到实践
Spring Boot 3.3 MyBatis 基础教程:从入门到实践 在当今的Java开发领域,Spring Boot和MyBatis是构建高效、可维护的后端应用的两个强大工具。Spring Boot简化了Spring应用的初始搭建和开发过程,而MyBatis则提供了一种灵活的ORM(…...

征文投稿:如何写一份实用的技术文档?——以软件配置为例
📝 征文投稿:如何写一份实用的技术文档?——以软件配置为例 目录 [TOC](目录)🧭 技术文档是通往成功的“说明书”💡 一、明确目标读者:他们需要什么?📋 二、结构清晰:让读…...
【后端】RPC
不定期更新。 定义 RPC 是 Remote Procedure Call 的缩写,中文通常翻译为远程过程调用。作用 简化分布式系统开发。实现微服务架构,便于模块化、复用。提高系统性能和可伸缩性。提供高性能通信、负载均衡、容错重试机制。 在现代分布式系统、微服务架构…...
详细讲解Flutter GetX的使用
Flutter GetX 框架详解:状态管理、路由与依赖注入 GetX 是 Flutter 生态中一款强大且轻量级的全功能框架,集成了状态管理、路由管理和依赖注入三大核心功能。其设计理念是简洁高效,通过最小的代码实现最大的功能,特别适合快速开发…...
ReLU 新生:从死亡困境到强势回归
背景 在深度学习领域,激活函数的探索已成为独立研究课题。诸如 GELU、SELU 和 SiLU 等新型激活函数,因具备平滑梯度与出色的收敛特性,正备受关注。经典 ReLU 凭借简洁性、固有稀疏性及其独特优势拓扑特性,依旧受青睐。然而&#…...

tensorflow image_dataset_from_directory 训练数据集构建
以数据集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 目录结构 训练图像数据集要求: 主目录下包含多个子目录,每个子目录代表一个类别。每个子目录中存储属于该类别的图像文件。 例如 main_directory/ ...cat/ ...…...
QuickJS 如何发送一封邮件 ?
参阅:bellard.org : QuickJS 如何使用 qjs 执行 js 脚本 在 QuickJS 中发送邮件需要依赖外部库或调用系统命令,因为 QuickJS 本身不包含 SMTP 功能。以下是两种实现方法: 方法 1:调用系统命令(推荐) 使…...