看透内核可观测与追踪:从 perf/ftrace 到 eBPF/XDP,一套方法啃下 CPU、内存、I/O 与网络瓶颈
观测得越早,改动越少;追踪得越准,性能越稳。
当你能在不改业务代码的前提下,把 CPU 炸裂、内存抖动、I/O 堵塞、网络丢包的蛛丝马迹串成一张因果图,优化就不再靠猜。
一、为什么需要“统一框架”
- 工具林立且概念重叠:perf、ftrace、tracepoints、kprobes/uprobes、bpftrace、BCC、火焰图、XDP/TC——它们既互相补位,又可能重复。缺少统一视角,容易“只见树木不见森林”。
- 性能问题跨层级:CPU、内存、I/O、网络彼此牵连。只盯一个点,容易误判。例如“网络慢”常常是应用阻塞或内核锁竞争。
- 成本和风险不同:采样 vs 追踪、内核内置 vs eBPF 可编程、生产安全与开销控制,选择不慎就会“观察改变系统”。
本文给出一套覆盖全栈路径的模型与方法学,用有限的命令和脚本,把复杂问题拆成可重复的调查步骤,并配上演练。
二、统一视角:四层模型
- 事件源(内核和用户空间)
- tracepoints:内核稳定事件接口,低破坏性,版本间兼容性较好。例:sched_switch、block_rq_complete、tcp_retransmit_skb、xdp_redirect_err。
- kprobes/kretprobes:在任意内核符号上打动态探针,灵活但对内核符号变化敏感。
- uprobes/uretprobes:对用户态可执行或动态库函数打探针,适合黑盒应用观测。
- USDT(用户静态探针):用户态内置探针(很多数据库、运行时都提供),稳定且语义明确。
- 采集执行框架
- ftrace:内核原生框架,功能涵盖函数跟踪、事件、图形化函数栈(function_graph)等。接口在 tracefs/debugfs。
- perf(perf_event):内核 PMU 和事件采样接口,适合 CPU/指令级分析、火焰图、锁与调度等。
- eBPF:内核安全可编程执行环境,具备 verifier 校验、JIT、高性能 map/ringbuf 通道。可挂载到 kprobe/tracepoint/uprobes、网络(XDP/TC)、perf_event 等。
- 用户态工具
- perf:stat/top/record/report/script/sched/lock/mem 等子命令。
- ftrace 家族:echo 开关、trace-cmd、kernelshark。
- bpftrace:类 AWK 的高级一行式 BPF 脚本,开发成本低,上手快。
- BCC:Python/Lua 封装,用 C 语言写 BPF 程序,生态工具齐全(biolatency、runqlat、tcptop 等)。
- 展示与分析
- 文本计数与直方图(bpftrace/BCC)。
- 火焰图(CPU on-CPU、off-CPU、内核/用户混合)。
- 时序/延迟分布(直方图、百分位)。
三、perf/ftrace/tracepoints/kprobes/uprobes 在一张“逻辑图”
- 如果有稳定的 tracepoint,就优先用 tracepoint(低风险、语义稳定)。
- 没有合适 tracepoint,再考虑 kprobes/uprobes(灵活但版本敏感)。
- 轻量总体观用 perf stat/top;深挖热点用 perf record+火焰图或 BPF profile。
- 系统函数级时序关系用 ftrace function_graph;锁与调度用 perf lock/sched 或 BPF 的 runqlat/sched_*。
- 跨层面串因果,用混合火焰图(用户+内核栈)与特定子系统延迟直方图(如块设备、文件系统、网络)。
四、eBPF/XDP/TC:从“可观测”到“可编程”
- eBPF 核心要点
- 稳定 ABI:BTF + CO-RE 让 BPF 程序可跨内核版本(减少编译适配)。
- 安全执行:verifier 保证内核安全;JIT 提升性能。
- 通用挂点:kprobe/kretprobe、tracepoint/raw_tp、uprobes/uretprobes、perf_event、cgroup/skb/sock、XDP/TC 等。
- 出口通道:perfbuf、ringbuf、map(hash/array/LRU/stack/queue)、计数/直方图。
- XDP/TC 路径
- XDP:驱动最早入口,极低延迟,适合丢包统计、快速分流、DDoS 防护。相关事件:xdp_redirect/xdp_redirect_err/xdp_exception/xdp_cpumap_*。
- TC(ingress/egress):更靠后,支持丰富的 skb 操作与分类,适合更复杂的路径采样。
- 联动:XDP 做早期采样/标记,TC 进行细分统计与镜像。结合内核 net/tracepoints 形成全路径可观测。
五、bpftrace 与 BCC:两把趁手兵器
- bpftrace:适合交互式诊断与一次性假设验证
- 一行式直方图/计数:易于构造“谁在多、哪里慢”的第一视角。
- 示例:统计每个进程 write() 写入字节
bpftrace -e ‘kprobe:__x64_sys_write { @bytes[comm] = sum(args->count); }’
- BCC:适合可重复的深度工具化
- 成熟脚本

2023

被折叠的 条评论
为什么被折叠?



