性能分析
一、perf(最重要)
1. 安装
apt install linux-tools-common linux-tools-generic
# 目标机
apt install linux-perf
2. record + report
# CPU 采样
perf record -g -F 999 -a sleep 5
perf report
# 指定进程
perf record -g -p PID
perf record -g cmd
# CPU 事件
perf record -e cycles -a sleep 5
perf record -e cache-misses -a sleep 5
# 函数调用栈
perf record -g --call-graph dwarf
# 锁竞争
perf record -e lock:lock_acquire -ag -- sleep 5
perf lock contention -a
3. stat
perf stat ls
# Performance counter stats for 'ls':
# 1.001068 task-clock (msec)
# 0 context-switches
# ...
perf stat -d cmd # 详细事件
perf stat -r 5 cmd # 跑 5 次平均
4. top
perf top
perf top -e cycles
perf top -p PID
5. annotate
perf annotate function_name
6. sched
perf sched record sleep 5
perf sched latency
perf sched map
perf sched timehist
perf sched replay
二、ftrace
1. 启用
mount -t tracefs none /sys/kernel/tracing
2. 函数跟踪
echo function > /sys/kernel/tracing/current_tracer
echo my_func > /sys/kernel/tracing/set_ftrace_filter
echo 1 > /sys/kernel/tracing/tracing_on
# 触发
cat /sys/kernel/tracing/trace
echo 0 > /sys/kernel/tracing/tracing_on
3. function_graph
echo function_graph > current_tracer
echo do_sys_open > set_graph_function
cat trace
4. trace-cmd / kernelshark
apt install trace-cmd kernelshark
trace-cmd record -e all -p function_graph -l do_sys_open
trace-cmd report
kernelshark
5. 跟踪点(tracepoints)
ls /sys/kernel/tracing/events/sched/
echo 1 > /sys/kernel/tracing/events/sched/sched_switch/enable
cat /sys/kernel/tracing/trace
6. 自定义跟踪点
TRACE_EVENT(my_event,
TP_PROTO(int x, int y),
TP_ARGS(x, y),
TP_STRUCT__entry(
__field(int, x)
__field(int, y)
),
TP_fast_assign(
__entry->x = x;
__entry->y = y;
),
TP_printk("x=%d y=%d", __entry->x, __entry->y)
);
使用:
trace_my_event(10, 20);
三、eBPF / bcc / bpftrace
1. bpftrace 入门
apt install bpftrace
# 简单脚本
bpftrace -e 'kprobe:do_sys_open { printf("%s\n", argstr(1)); }'
# 多行
bpftrace -e '
kprobe:do_sys_open {
printf("open: %s\n", argstr(1));
}
kprobe:do_sys_read {
printf("read fd=%d count=%d\n", args->fd, args->count);
}
'
# 内置工具
bpftrace --info
bpftrace -l 'kprobe:*' | head
2. bcc 工具
apt install bpfcc-tools
opensnoop-bpfcc # 跟踪所有 open
execsnoop-bpfcc
tcpconnect-bpfcc
biolatency-bpfcc
runqlat-bpfcc
softirqs-bpfcc
tcptop-bpfcc
3. 性能火焰图
# 生成
perf record -F 99 -a -g -- sleep 30
perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > flame.svg
# 打开浏览器查看
四、sysprof
apt install sysprof
sysprof
GUI 工具,类 Instruments / perf + 火焰图。
五、内存分析
1. Valgrind
apt install valgrind
valgrind --tool=memcheck --leak-check=full ./app
valgrind --tool=massif ./app # 堆分析
ms_print massif.out.* > massif.txt
2. AddressSanitizer
gcc -fsanitize=address -g app.c
./a.out
3. heaptrack
apt install heaptrack
heaptrack ./app
heaptrack_gui heaptrack.app.*.gz
4. slab / kmemleak(内核)
slabtop
cat /proc/slabinfo
echo scan > /sys/kernel/debug/kmemleak
cat /sys/kernel/debug/kmemleak
六、CPU 缓存分析
perf stat -e cache-references,cache-misses,L1-dcache-loads,L1-dcache-load-misses ./app
perf c2c record ./app # 跨核 cache 同步
perf c2c report
七、power 调试
powerpm-tools
turbostat
powertop
八、嵌入式 perf 注意
- 嵌入式 CPU 弱,perf 开销大
- 优先用硬件 PMU(多数 ARM Cortex-A 有)
- 内核需要
CONFIG_PERF_EVENTS=y - 配置 CONFIG_HAVE_PERF_EVENTS
九、推荐工具链
| 用途 | 工具 |
|---|---|
| CPU 采样 | perf record / top |
| 调度延迟 | perf sched |
| 内存泄漏 | valgrind / ASan |
| 堆分配 | heaptrack / massif |
| 系统调用 | strace / bpftrace |
| 内核事件 | ftrace / bpftrace |
| 网络 | tcpdump / ss |
| 火焰图 | perf + flamegraph |