性能分析

一、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 record / top
调度延迟 perf sched
内存泄漏 valgrind / ASan
堆分配 heaptrack / massif
系统调用 strace / bpftrace
内核事件 ftrace / bpftrace
网络 tcpdump / ss
火焰图 perf + flamegraph