【ebpf】BPF之巅-洞悉Linux系统和应用性能

第1章 引言 20230406(四)19:00-21:00

1.1 BPF和eBPF是什么

BPF的诞生是为了提升网络包过滤工具的性能

BPF提供了一种再各种内核事件和应用程序事件发生时运行一段小程序的机制。

BPF的三个主要应用领域:

  • 网络
  • 可观测性 (本书重点关注)
  • 安全

1.2 跟踪、嗅探、采样、剖析和可观测性分别是什么

跟踪(tracing):基于事件的记录
跟踪工具:具备记录原始事件和事件元数据的能力 eg.strance工具,可以记录和打印系统调用事件的信息。
BPF技术,可以使得这些跟踪工具在事件发生后,通过运行一段小程序来进行定制化的实时统计摘要生成或其他动作。
嗅探、事件记录和跟踪,通常指的是一回事。

采样(sampling)
采样工具通过获取全部观测量的子集来描绘目标的大致图像。
采样工具优点:性能开销小
采样工具缺点:会遗漏事件

可观测性(observability)
BPF工具属于可观测性工具

1.3 BCC、bpftrace和IO Visor

在跟踪用途方面,主要的BPF前端是BCC和bpftrace

1.4 初识BCC:快速上手

execsnoop工具会跟踪每个新创建的进程,并且为每次进程创建打印一行信息。
execsnoop工具来自BCC项目,通过跟踪execve系统调用来工作。

1
2
# execsnoop
# execsnoop -t # 增加一列时间戳输出

biolatency,可以绘制块设备的延迟直方图。

1
2

# biolatency -m # 统计值以毫秒为单位输出

1.5 BPF跟踪的能见度

image.png

tool

1.6 动态插桩:kprobes和uprobes

动态插桩技术:在生产环境中对正在运行的软件插入观测点的能力。
kprobes:对内核函数的动态插桩
uprobes:对用户态函数的动态插桩
BPF跟踪工具既支持kprobes又支持uprobes,因为也就支持对整个软件栈进行动插桩。

image.png

1.7 静态插桩:tracepoint和USDT

BPF跟踪工具支持内核的静态跟踪点插桩技术,也支持用户态的静态定义跟踪插桩技术USDT。

image.png

1.8 初识bpftrace:跟踪open()

bpftrace跟踪系统调用open

1
2
3
4
5
6
# bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'
Attaching 1 probe...
titanagent /proc/574871/status
titanagent /proc/574871/cmdline
titanagent /proc/574871/stat
...

列出所有与open系统调用相关的跟踪点

1
2
3
4
5
# bpftrace -l 'tracepoint:syscalls:sys_enter_open*'
tracepoint:syscalls:sys_enter_open_by_handle_at
tracepoint:syscalls:sys_enter_open
tracepoint:syscalls:sys_enter_openat
tracepoint:syscalls:sys_enter_openat2

证明opennat的使用频率更高

1
2
3
4
5
6
7
# bpftrace -e 'tracepoint:syscalls:sys_enter_open* { @[probe] = count();  }'
Attaching 4 probes...
^C

@[tracepoint:syscalls:sys_enter_open]: 5965
@[tracepoint:syscalls:sys_enter_openat2]: 62152
@[tracepoint:syscalls:sys_enter_openat]: 670061

bpftrace自带opensnoop.bt,可以同时对每个系统调用的开始和结束位置进行跟踪

1
2
3
4
5
6
7
# opensnoop.bt
Attaching 6 probes...
Tracing open syscalls... Hit Ctrl-C to end.
PID COMM FD ERR PATH
3902363 containerd 2 0 /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snap
3902363 containerd 2 0 /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snap

bpftrace自带20多个工具
bcc自带超过70个工具

1.9 再回到BCC:跟踪open()

1
# opensnoop

bpftrace工具通常比较简单,功能单一,只做一件事情
BCC工具则一般比较复杂,支持的运行模式也比较多

BCC工具更加适合作为工作的起点,不必动手编写任何BPF程序,需要的功能可能都已经自带了
如果确实缺少所需的功能,可以用bpftrace来定制工具,因为bpftrace语言开发相对更加简单

1.10 小结


【ebpf】BPF之巅-洞悉Linux系统和应用性能
http://example.com/2023/04/06/ebpf/【ebpf】BPF之巅-洞悉Linux系统和应用性能/
作者
ningan123
发布于
2023年4月6日
许可协议