性能瓶颈找不到?ftrace+perf组合拳,5分钟定位内核问题 性能瓶颈找不到ftraceperf组合拳5分钟定位内核问题嵌入式Linux最让人头秃的场景系统卡了但你不知道卡在哪。CPU跑满了吗谁在吃CPU是内核态还是用户态中断太多了还是调度出问题了还是DMA卡住了不用猜ftrace和perf这两个Linux自带的工具连安装都不用能回答你所有问题。先说perf——谁在吃CPUperf是基于硬件性能计数器的采样工具开销极低适合不知道问题在哪的盲搜阶段。1. 看CPU使用率# 看CPU在忙什么perftop按比例显示各函数占用的CPU。看到irq_work排第一那八成是中断风暴。看到do_sys_open排第一有人在疯狂打开关闭文件。2. 热点函数定位# 采样10秒存数据perf record-g-a--sleep10# 分析热点perf report-g记录调用链-a所有CPU。看完就知道最热的函数是谁调起来的。3. 上下文切换分析怀疑系统在频繁切换进程perf sched record --sleep5perf sched latency输出每个进程的调度延迟。看到某个进程平均延迟几十ms那它可能被优先级更高的中断或实时线程饿死了。真实案例一次监控摄像头画面卡顿。perf top一看copy_page占CPU 40%——哪个缺德的在大量拷贝内存perf report看调用链定位到v4l2的vb2 buffer queue里有个不合理的memcpy。加上dma_buf直接映射后CPU直接降到5%。再说ftrace——内核内部的printk但不用重编ftrace是内核自带的trace框架几乎不耗资源就可以trace内核函数的调用。新版内核用tracefs挂在/sys/kernel/tracing老的在debugfs。1. 打开function graphcd/sys/kernel/tracing# 设置要trace的函数echo__alloc_pages_nodemaskset_graph_functionechofunction_graphcurrent_tracerecho1tracing_onsleep3echo0tracing_on# 看结果cattrace|head-50输出类似kworker/1:0-98 [001] ... 1234.5678: __alloc_pages_nodemask() { kworker/1:0-98 [001] ... 1234.5679: get_page_from_freelist() { kworker/1:0-98 [001] ... 1234.5680: zone_watermark_ok() { kworker/1:0-98 [001] ... 1234.5680: } ... kworker/1:0-98 [001] ... 1234.5695: } kworker/1:0-98 [001] ... 1234.5696: }每一层缩进代表函数调用深度秒级看出谁慢。2. 中断/调度跟踪echo0tracing_onechotrace# 清空缓冲区echoirq:irq_handler_entryset_eventechosched:sched_switchset_eventecho1tracing_onsleep3echo0tracing_oncattrace可以看到每个中断的发生频率、处理时间以及每次调度切换的原进程→目标进程。3. 动态事件最狠的不想trace内核函数想trace你自己的驱动不用改代码echop:myprobe my_driver_write arg1$arg1 arg2$arg2kprobe_eventsecho1events/kprobes/myprobe/enable甚至可以在函数返回时看返回值echor:myret my_driver_read $retvalkprobe_events不用重新编译内核不用加printk不用重新部署驱动。这就是ftrace最狠的地方。CPU繁忙调度延迟IO等待内核函数中断/调度自定义驱动系统卡顿perf top 初步扫描perf record/report 定位热点函数perf sched latencyiostat perf需要更细的trace?ftrace function_graphftrace event tracekprobe 动态插桩找到瓶颈perf ftrace 组合拳实战光讲单个工具没意思来一个真实场景CPU idle时功耗居高不下。第一步perf top扫一下Events: 1K cycles 43.21% [kernel] [k] __do_softirq好软中断太频繁。第二步perf record看谁发的中断perf record-eirq:irq_handler_entry-a--sleep5perf script看到/proc/interrupts里eth0的TX中断每秒触发了2000次。但这设备明明没多少数据在发。第三步ftrace看中断处理过程echofunction_graphcurrent_tracerechoeth_irq_handlerset_graph_functionecho1tracing_on;sleep2;echo0tracing_oncattrace发现中断处理函数里调了一个wake_up_process唤醒了一个worker线程但那worker大部分时间无事可做又schedule回去了——白忙一场。第四步解决方案原来网卡驱动在NAPI poll模式下每次中断都调用了napi_schedule。但没判断实际是否有数据。加上空包检测后中断次数从2000次/秒降到300次/秒CPU idle时的功耗直接降了0.5W。这个案例里没有perf和ftrace你只能在代码里一行行看、加printk重编、部署、复现——一个下午就没了。用工具10分钟。速查表场景工具命令谁在吃CPUperf topperf top热点函数调用链perf record/reportperf record -g -a sleep 10调度延迟perf schedperf sched latencyCache Missperf statperf stat -e cache-misses ./app内核函数调用图ftraceecho function_graph current_tracer中断频率ftrace eventecho irq:irq_handler_entry set_event函数参数/返回值kprobeecho p:... kprobe_events谁调了特定函数ftrace filterecho func set_ftrace_filter一句话总结perf告诉你哪慢ftrace告诉你为什么慢。两个加起来嵌入式Linux性能问题99%都能在10分钟内定位。别再只会topprintk了那是上一个十年的玩法。

相关新闻

最新新闻

Hydra 9.5 SSH爆破实战:Kali 2024 环境配置与 3 种字典优化策略

Hydra 9.5 SSH爆破实战:Kali 2024 环境配置与 3 种字典优化策略

Hydra 9.5 SSH爆破实战:Kali 2024 环境配置与 3 种字典优化策略在网络安全领域,渗透测试是评估系统安全性的重要手段之一。作为渗透测试工程师,掌握高效的工具使用技巧至关重要。Hydra作为一款久经考验的暴力破解工具,在SSH服务测…

2026/7/11 22:02:05
PIC微控制器与压电蜂鸣器的音频控制方案

PIC微控制器与压电蜂鸣器的音频控制方案

1. 项目概述:为DIY项目注入声音的灵魂在创客和电子DIY领域,声音交互一直是提升项目体验的关键要素。最近我在几个智能家居和互动装置项目中,尝试使用PIC18F86J11微控制器搭配CMT-8540S-SMT蜂鸣器模块,意外发现这个组合在成本、性能…

2026/7/11 22:02:05
人生梦想是想出来的吗?

人生梦想是想出来的吗?

有一部分是想出来的,但绝大多数真正稳定的人生梦想,不是想出来的,而是"活出来、做出来、验证出来"的。这是心理学、职业发展研究以及很多人的实际经历都支持的一种观点。为什么很多人一直"想",却找不到梦想&a…

2026/7/11 22:02:05
明确的梦想底层原理的最小单位是什么?

明确的梦想底层原理的最小单位是什么?

"明确的梦想"不是人生的起点,而是人生长期积累后的产物。很多人以为: 先找到梦想↓ 再开始行动但现实中,很多人的梦想恰恰是在不断尝试、反馈和成长中逐渐清晰的。第一步:什么是"明确的梦想"? 很多…

2026/7/11 22:02:05
在子线程中会失效的情况

在子线程中会失效的情况

在子线程中,很多东西会失效或不可用,这是开发中非常容易踩的坑。我按影响从大到小给你列出来:🔴 一、事务管理(Transactional)完全失效这是最大的坑! Spring 的 Transactional 基于 ThreadLocal…

2026/7/11 22:02:05
如何彻底移除Windows Defender:5步终极指南释放系统性能 [特殊字符]

如何彻底移除Windows Defender:5步终极指南释放系统性能 [特殊字符]

如何彻底移除Windows Defender:5步终极指南释放系统性能 🚀 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.co…

2026/7/11 21:57:05

月新闻