41

eBPF Tracing 入门教程与实例

 4 years ago
source link: https://www.tuicool.com/articles/A77ZB3R
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在 LPC'18(Linux Plumber's conference) 会议上,至少有24个关于 eBPF 的演讲。 eBPF 这一实用技术,将是每个开发者需要掌握的技巧。 也许你的新年目标得再多一个了: 学习 eBPF!

eBPF 的名称源于 extended Berkeley Packet Filter,如果从 eBPF 的功能来说,类似 Virtual Kernel Instruction Set (VKIS) 这样的名字似乎跟贴切。eBPF 可以用来做很多事情,比如网络性能(network performance),防火墙(firewalls),安全(security),程序分析追踪(tracing) 和 设备驱动(device drivers) 等。其中,诸如 tracing 等功能在网络上已经有很多资料。这里的术语 tracing 特指可以生成 per-event 信息的性能分析和观察工具,例如  tcpdumpstrace 就是两个常用的  tracer

这篇文章将着重于 eBPF tracing 的学习,并分为 beginner, intermediate, advanced 三个阶段,大纲如下:

  • Beginner: 运行 bcc 工具

  • Intermediate: 开发 bpftrace 工具

  • Advanced: 开发 bcc 工具,并贡献社区

Beginner

1. eBPF, bcc, bpftrace, iovisor 是什么

eBPF 之于 Linux 一定程度上如同 JavaScript 之于 HTML。JavaScript 使得网页不再是静态的,它可以让你编写程序来监听鼠标点击等事件,而且程序运行在浏览器的安全虚拟环境中;类似的,有了 eBPF,内核也可以不是固定的(fixed),你可以编写程序来监听 disk I/O 事件并执行相关动作,而且程序运行在内核的安全虚拟环境中。实际上,eBPF 更像是运行 JavaScript 的 V8 引擎,而不是像 JavaScript 本身。eBPF 是 Linux Kernel 的一部分。

直接 eBPF 编码难于上青天,就好比直接编写 V8 字节码。但是没有人直接写 V8 字节码,他们用 JavaScript,或者基于 JavaScript 的框架(jQuery, Angular, React 等)。eBPF 也是一样,人们通过框架来使用 eBPF。对于 tracing 来说,主要的框架就是 bcc 和 bpftrace,这两个框架并不在内核代码中,他们在名为 iovisor 的 Linux Foundation project 中维护。

2. eBPF tracing 示例

tcplife 是一个基于 eBPF 的工具,可以显示完整的 TCP session, 以及对应的进程号(PID) ,命令(COMM),收发字节数(TX_KB, RX_KB),以及时长(MS):

# tcplife
PID   COMM       LADDR           LPORT RADDR           RPORT TX_KB RX_KB MS
22597 recordProg 127.0.0.1       46644 127.0.0.1       28527     0     0 0.23
3277  redis-serv 127.0.0.1       28527 127.0.0.1       46644     0     0 0.28
22598 curl       100.66.3.172    61620 52.205.89.26    80        0     1 91.79
22604 curl       100.66.3.172    44400 52.204.43.121   80        0     1 121.38
22624 recordProg 127.0.0.1       46648 127.0.0.1       28527     0     0 0.22
3277  redis-serv 127.0.0.1       28527 127.0.0.1       46648     0     0 0.27
22647 recordProg 127.0.0.1       46650 127.0.0.1       28527     0     0 0.21
3277  redis-serv 127.0.0.1       28527 127.0.0.1       46650     0     0 0.26
[...]

并不是 eBPF 才使得这样的工具成为可能,完全可以利用其他内核技术特性重写 tcplife 。但是如果这么做了,我们将因为性能开销、安全等因素而无法在生产环境中运行这个工具。eBPF 做的恰恰是让这个工具变得实用, tcplife 是高效并且安全的。举例来说, tcplife 并不会像其他内核技术特性一样去追踪每个网络包(packet),那样会带来太多的性能开销。相反地, tcplife 只追踪 TCP session 事件,这类事件相对来说频率较低。这使得 tcplife 的负载极低,以至于我们可以在生产环境中24小时持续运行这个工具。

3. 如何使用 eBPF

对于初学者,尝试一下 bcc tools。bcc 的安装很简单,并有详细的说明文档,例如在 Ubuntu 上,效果如下

# sudo apt-get update
# sudo apt-get install bpfcc-tools
# sudo /usr/share/bcc/tools/opensnoop
PID    COMM               FD ERR PATH
25548  gnome-shell        33   0 /proc/self/stat
10190  opensnoop          -1   2 /usr/lib/python2.7/encodings/ascii.x86_64-linux-gnu.so
10190  opensnoop          -1   2 /usr/lib/python2.7/encodings/ascii.so
10190  opensnoop          -1   2 /usr/lib/python2.7/encodings/asciimodule.so
10190  opensnoop          18   0 /usr/lib/python2.7/encodings/ascii.py
10190  opensnoop          19   0 /usr/lib/python2.7/encodings/ascii.pyc
25548  gnome-shell        33   0 /proc/self/stat
29588  device poll         4   0 /dev/bus/usb
^C

这里我通过运行 opensnoop 来验证 bcc tools 是否工作,如果你顺利到这一步,说明你已经在使用 eBPF 了!

Netflix 和 Facebook 等公司已经在服务器上默认安装 bcc ,或许你也想这么做。

4. 初学者入门教程

Brendan Gregg 提供了一个 bcc 入门教程,方便初学者很好地开始 eBPF tracing.

作为初学者,你不必开发 eBPF 代码。bcc 自带超过 70 多个工具可以直接使用。bcc 入门教程里你将接触 其中 11 个工具:execsnoop, opensnoop, ext4slower (or btrfs, xfs, zfs), biolatency, biosnoop, cachestat, tcpconnect, tcpaccept, tcpretrans, runqlat, and profile.

一旦你开始入门,你需要清楚 bcc tracing 工具还有很多:

YJj6vi6.jpg!web

这些工具都有很详细的文档,包括使用手册和示例。示例文件(xxx_example.txt)展示了屏幕截图和对应的解释:比如 biolatency_example.txt. Brendan Gregg 撰写了许多类似的示例文档、使用手册、工具,都在 bcc repo 中。

生产环境中的 bcc tracing 示例没有提供,Brendan Gregg 在撰写这篇文档时,eBPF 刚发展起来并只在测试机器上可用,因此大多数使用示例都是构造的测试用例。之后这个教程里会提供真实世界的用例,这是初学者可以贡献的方向:如果你通过 bcc 工具解决了一个实际问题,考虑发布一个博客文章来共享屏幕截图,或者添加到 bcc repo 的 examples 文件中。

Intermediate

到这里,你应该已经可以运行 bcc 并尝试了上述工具,然后你肯定会想定制开发自己的 bcc 工具。最佳实践是切换到 bpftrace,bpftrace 提供高级语言可以使得入门开发更简单。坏处就是 bpftrace 不如 bcc 那么拓展友好。因此,你最终还是会遇到瓶颈,继而切换回 bcc。

参考 bpftrace 安装说明,bpftrace 是不同于 bcc 的另一个项目。此时 bpftrace 还没有在各个平台打包发布。在不久的将来,可以很方便地通过类似 apt-get install bpftrace 的方式来安装。

1. bpftrace 教程

Brendan Gregg 开发一个了 bpftrace 教程,通过一系列命令来学习 bpftrace,一共有 12 个示例循序渐进。

其中一个示例的截图如下,这里使用 open syscall tracepoint 来跟踪 PID 和对应的打开文件路径。

# bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%d %s\n", pid, str(args->filename)); }'
Attaching 1 probe...
181 /proc/cpuinfo
181 /proc/stat
1461 /proc/net/dev
1461 /proc/net/if_inet6
^C

2. bpftrace 参考指南

关于 bpftrace 的更多参考信息,Brendan Gregg 整理了一个 参考指南,提供了关于 bpftrace 的语法、探针、内建等的示例。

这个参考指南的目的很简单:Brendan Gregg 尽可能地把主题、摘要、截图都放在一个屏幕上。如果你查找一些东西,需要滚动浏览多页,那就太长了。

3. bpftrace 示例

bpftrace repo 中有 20 多个工具,可以通过这些工具来学习开发。例如:

# cat tools/biolatency.bt
[...]
BEGIN
{
    printf("Tracing block device I/O... Hit Ctrl-C to end.\n");
}

kprobe:blk_account_io_start
{
    @start[arg0] = nsecs;
}

kprobe:blk_account_io_completion
/@start[arg0]/

{
    @usecs = hist((nsecs - @start[arg0]) / 1000);
    delete(@start[arg0]);
}

和 bcc 工具一样,bpftrace 工具也有完整的使用手册和示例文档,例如 biolatency_example.txt。

Advanced

1. 学习 bcc 开发

Brendan Gregg 提供了两个帮助文档:

  • bcc Python Developer Tutorial

  • bcc Reference Guide

bcc/tools/*.py 中有很多示例。bcc tools 分为两大部分:1)面向内核的 BPF 代码,用 C 语言开发;2)用户态工具,用 Python (lua, C++) 等语言开发。开发 bcc tools 一定程度来说是高阶的,可能会深入复杂的内核或应用程序的内部。

2. 贡献开源

bcc/bpftrace issues 欢迎大家讨论解决:

  • bcc issues

  • bpftrace issues

对于 bpftrace, Brendan Gregg 给了 bpftrace internals development guide. 这里的开发很有挑战,因为涉及到 LLVM IR 的知识。

可以贡献代码的还有 kernel eBPF (aka BPF) 引擎。如果你浏览 bcc/bpftrace issues,你会看到一些相关的优化需求,例如 bpftrace kernel tag 标记的 issues。同时,你还可以关注订阅 netdev 邮件列表,从而获得最新的 kernel BPF 开发进展。这些新开发的代码会进入 net-next 分支,然后合并入 Linux 主分支。

除了开发代码,你还可以通过测试、打包、博客、演讲等方式来贡献。

Summary

eBPF 可以胜任很多事情。这篇文章介绍如何利用 eBPF 来跟踪问题和性能分析。总的来说:

  • Beginner: 运行 bcc tools

  • Intermediate: 开发 bpftrace tools

  • Advanced: 开发 bcc tools,给 bcc/bpftrace 社区贡献代码。

Brendan Gregg 将上述内容整合到一个页面中,eBPF Tracing Tools,加油


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK