笔记:BPF Performance Tools Chapter 1. Introduction
关键词:bpf、ebpf、bcc、bpftrace、kprobe、uprobe、tracepoint、usdt等等。
本章主要介绍基本概念以及相关资源之间关系
- BPF和eBPF的演变以及用途
- 基本概念Tracing/Snooping/Samping/Profiling/Observability以及之间区别
- 一张图表示bcc/bpftrace/libbcc/libbpf/bpf之间关系
- 一张图介绍bpf能做哪些性能优化
- 静态跟踪和动态跟踪
- 简单示例bcc和bpftrace用途
1. Tracing/Snooping、Sampling/Profiling区别
Tracing/Snooping是基于事件的跟踪,Samping/Profiling是基于时间的采样。
Tracing/Snooping可能导致跟踪引入负荷剧增;Samping/Profiling引入的测试负荷相对稳定,但是有可能丢失部分信息。
2. bcc、bpftrace、libbcc、libbpf、bpf之间的关系
可以将整个架构分成三层:前端bcc和bpftrace、中间层libbcc和libbpf、内核BPF。
其他类似bcc/bpftrace的工具还有:适合嵌入式设备的ply、基于Python的工具。
相关资源列表:
bcc:https://github.com/iovisor/bcc
bpftrace:https://github.com/iovisor/bpftrace
ply:https://github.com/iovisor/ply
3. Linux系统和应用bpf性能工具集
对照本图,针对不同模块可以使用相应的工具进行观察、跟踪,协助定位解决性能问题。
4. 静态跟踪和动态跟踪
动态:kprobes和uprobes
动态跟踪可以在程序运行时插入跟踪,在不使用的时候开销极低。
静态:tracepoints和usdt
相对于动态跟踪,静态跟踪更加稳定。但是不够灵活,数量也受限。
BPF跟踪支持内核静态的tracepoints和用户空间的USDT(User-level Statically Defined Tracing)。
5. 初识bcc和bpftrace
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }' bpftrace -l 'tracepoint:syscalls:sys_enter_open*' bpftrace -e 'tracepoint:syscalls:sys_enter_open* { @[probe] = count(); }' opensnoop.bt opensnoop opensnoop -x