news 2026/9/4 21:57:41

Linux 性能调优与追踪完整篇:ftrace、perf、eBPF从采样到落地验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 性能调优与追踪完整篇:ftrace、perf、eBPF从采样到落地验证

CPU 被打满却说不清热点、延迟尖刺只能「重启试一下」、上线后回归全靠猜——缺的不是参数列表,而是可复现的观测路径:从 tracepoint/kprobe 到采样火焰图,再到改参与回归对比。本文把 ftrace、perf_event、eBPF/bpftrace、常见调优开关与排障顺序合成一篇闭环。


源码锚点

路径作用
kernel/trace/ftrace.cftrace 核心、function tracer
kernel/trace/trace.ctracefs 环形缓冲与输出
include/linux/ftrace.hftrace API
kernel/events/core.cperf_event子系统
kernel/kprobes.ckprobe 动态插桩
kernel/bpf/eBPF 验证器、地图、运行时
kernel/trace/bpf_trace.cBPF 与 tracing 衔接
fs/tracefs//debugfs用户态控制面(挂载点因发行版而异)
tools/perf/用户态 perf 工具
Documentation/trace/Documentation/bpf/官方追踪与 BPF 文档

ftrace 控制面(示意):

# 通常需要 root;路径可能是 /sys/kernel/tracingmount|greptracefscd/sys/kernel/tracingechofunction>current_tracerechodo_sys_openat2>set_ftrace_filter# 示例符号以本机为准echo1>tracing_oncattrace|headecho0>tracing_on

perf 采样骨架:

perf record-F99-g-- ./app perf report# 或系统范围perftopperf record-a-g--sleep10

调用链

观测数据从内核到用户态

静态

动态函数

PMU 采样

可编程

感兴趣事件

观测手段

tracepoint

kprobe / ftrace filter

perf_event

eBPF 程序

ring buffer / perf mmap

BPF map / ringbuf

用户态工具读取

报告 / 火焰图 / 指标

调优闭环分层

验证

假设与改动

观测

定义问题

延迟? CPU? IO? 唤醒?

建立 baseline

perf / top / iostat

ftrace / trace-cmd

bpftrace / BCC

调度/内存/IO/驱动参数

代码热点修复

同负载复测

回滚开关


重点知识

1. 先定性,再选工具

症状先看深挖
CPU 高perf top/record -g符号、锁、软中断
延迟尖刺cyclictest、调度/中断追踪irqsoff/preemptirqsoff、唤醒链
IO 等iostatperfblock 事件电梯、队列深度、FS 回写
内存/proc/meminfopsireclaim、oom、cgroup 限制

没有 baseline(同负载下的延迟/CPU/带宽数字)就改sysctl,属于盲调。

2. ftrace:低成本看清调用与关闭抢占

  • function / function_graph:看谁调用谁、耗时轮廓。
  • irqsoff / preemptoff:关中断/关抢占过久(驱动里常见)。
  • sched / wakeup:任务为何睡、被谁唤醒。
trace-cmd record-esched:sched_switch-esched:sched_wakeupsleep5trace-cmd report|head

注意:过滤不当时开销与 trace 体积会爆;生产先短时、窄 filter。

3. perf:PMU 采样与火焰图

perf_event把硬件计数器/软件事件接到统一接口;perf record采样调用栈,适合「CPU 花在哪」。

# 权限相关sysctlkernel.perf_event_paranoid# 常见:cache-misses、cycles、page-faultsperfstat-ecycles,cache-misses,page-faults -- ./app

解读要点:采样有偏差;内联/缺符号会「糊」;先保证 vmlinux/debuginfod 或至少 kallsyms 可读。

4. eBPF:验证后可编程观测

流程:编写(或 bpftrace 一行)→verifier保证安全 → 加载 → 挂到 kprobe/tracepoint/XDP 等 → map/ringbuf 汇总。

# 示例:统计 syscall 次数(语法随 bpftrace 版本微调)bpftrace-e'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'

约束:

  • 无 verifier 通过则无法加载——这是特性不是障碍;
  • 生产控制 attach 范围与采样率,避免自扰动;
  • 权限:通常需要CAP_BPF/CAP_PERFMON或 root(视内核与发行版)。

5. kprobe 与开销意识

kprobe 可动态插到几乎任意内核函数,但:

  • 热路径高频命中会显著扰动;
  • 部分函数不可探测或随版本改名;
  • 优先用稳定tracepoint,kprobe 作补充。

6. 配置与安全

# 追踪文件系统mount-ttracefs tracefs /sys/kernel/tracing# BPF 文件系统(部分工具需要)mount-tbpf bpf /sys/fs/bpf
说明
kernel.perf_event_paranoid控制非特权 perf 能力
debugfs/tracefs 权限避免无关用户读内核地址信息
生产追踪限时、限事件、有回滚

7. 从观测到改参:几类高频旋钮(先测后改)

领域示例入口说明
调度schedutil、CPU 亲和、nice/cgroup cpu先确认是否真 CPU 饱和
内存vm.swappinessvfs_cache_pressure、cgroup 限制配合 PSI/meminfo
网络somaxconn、队列、NAPI/中断开销ss/perf再改
块 IO调度器、队列深度、ionice先分清读/写/刷新
驱动线程化 IRQ、合并工作、避免关中断过久irqsoff验证

原则:一次只改一类变量,保留开关与回滚命令。容器/ cgroup 场景下,宿主机sysctl与容器限额要分开看。

8. 常见坑

结果处理
无符号表火焰图全是地址安装 debug 包 / 带 vmlinux
同时开太多 tracer机器变慢、数据失真单次一种目的
只调参不复测「好像好了」固定负载脚本对比
把平均当尾延迟P99 仍炸看直方图/百分位
在生产长期开 function tracer吞吐断崖限时、窄 filter、事后关闭

Checklist

  • 调优前有书面 baseline(负载描述 + 关键指标)
  • 能说明 ftrace / perf / eBPF 各自擅长的问题类型
  • 会用perf record -g+report定位用户/内核热点
  • 会在 tracefs 上做一次窄过滤的 function 追踪并关闭
  • 优先选用 tracepoint,明白 kprobe 的开销与版本风险
  • 知道perf_event_paranoid与 tracefs 挂载对工具的影响
  • 每次改动可回滚,并用同一负载复测验证

小结

内核已经把观测做成可组合管线:事件源 → 缓冲/映射 → 用户态分析。调优的设计意图不是堆参数,而是用 ftrace/perf/eBPF 把假设证伪或证实。顺序固定为:定性 → 选工具 → 短时窄范围采集 → 改一处 → 对比 baseline。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 21:57:13

Spec as AIOS:高德如何用统一规范控制AI代码熵增

AI专家杨夕凯现任职高德地图,担任智能应用与基建平台负责人,先后负责动态数据、AI 导航、智能应用及基建平台等业务方向。其长期深耕地图数字孪生、空间智能、AR/数字人及 AI 导航算法模型等领域,并参与建设支撑千亿级数据的端云一体化基础设…

作者头像 李华
网站建设 2026/9/4 21:55:21

Rocky Linux部署Hermes Agent+Web-UI:自托管AI工作台从0到1

1. 写在前面:为什么我盯上了这套组合先把话说清楚,这篇不是拿官方文档翻译一遍的流水账,而是我在真实服务器上从零部署 Rocky Linux Hermes Agent Hermes-Web-UI 的完整记录。如果你正在头疼这三件事:Hermes Agent 怎么在 RHEL …

作者头像 李华
网站建设 2026/9/4 21:54:58

基于STM32与LD3320的智能家居语音控制系统开源实战

我做了个大半年才敢拿出来说事的开源项目:基于STM32的智能家居语音控制系统。代码、原理图、仿真工程全部打包开源,不是那种只放截图不放工程的项目,所有文件都能直接打开使用。这篇文章我会把整个项目的设计思路、硬件选型、代码实现、仿真搭…

作者头像 李华
网站建设 2026/9/4 21:54:50

生产质量报表几十份,为什么还是追不上质量问题根源

导语 生产质量报表数量多但无法快速定位质量问题根源,核心原因是不同报表指标口径不统一,数据不一致干扰根因分析方向,反复核数拉长质量问题响应时间,最终增加不良损失,统一数据标准和指标口径是提升质量管理分析效率的…

作者头像 李华