關鍵詞: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