原文链接 Learn eBPF Tracing: Tutorial and Examples
译者 弃余

在 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 工具还有很多:

这些工具都有很详细的文档,包括使用手册和示例。示例文件(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/tools/*.py 中有很多示例。bcc tools 分为两大部分:1)面向内核的 BPF 代码,用 C 语言开发;2)用户态工具,用 Python (lua, C++) 等语言开发。开发 bcc tools 一定程度来说是高阶的,可能会深入复杂的内核或应用程序的内部。

2. 贡献开源

bcc/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,加油!

本文作者:弃余

原文链接

本文为云栖社区原创内容,未经允许不得转载。

eBPF Tracing 入门教程与实例的更多相关文章

  1. 《挑战30天C++入门极限》入门教程:实例详解C++友元

        入门教程:实例详解C++友元 在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点: 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为pu ...

  2. Antlr v4入门教程和实例

    1 重逢ANTLR 最早知道ANTLR是当年学习Apache Derby数据库源码时,在看到SQL解析那一层时,第一次看到编译原理在实际项目中的应用,惊叹之余也只能望而却步.之前也根据网上一些资料尝试 ...

  3. Webpack 入门教程

    Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 本章节基于 Webpack3.0 测试通过. 从图中我们可以看出,W ...

  4. JsRender实用入门教程

    这篇文章主要介绍了JsRender实用入门实例,包含了tag else使用.循环嵌套访问父级数据等知识点,并提供了完整的实例下载,非常具有实用价值,需要的朋友可以参考下     本文是一篇JsRend ...

  5. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  6. freemarker语法介绍及其入门教程实例

    # freemarker语法介绍及其入门教程实例 # ## FreeMarker标签使用 #####一.FreeMarker模板文件主要有4个部分组成</br>####  1.文本,直接输 ...

  7. React实例入门教程(1)基础API,JSX语法--hello world

      前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发 ...

  8. WebSocket入门教程(五)-- WebSocket实例:简单多人聊天室

    from:https://blog.csdn.net/u010136741/article/details/51612594 [总目录]   WebSocket入门教程--大纲   [实例简介]   ...

  9. 【原创】React实例入门教程(1)基础API,JSX语法--hello world

    前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...

随机推荐

  1. neo4j遍历和图算法

    阅读更多 这篇blog主要和大家分享一下neo4j中是如何对节点进行遍历,和其中集成的图论的一些常用算法. 遍历 http://docs.neo4j.org.cn/tutorials-java-emb ...

  2. CentOS 7 yum 安装与配置MySQL5.7

    1.下载mysql源安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2.安装mysql源 yu ...

  3. win10 系统同步时间出错

    设置->时间和语言->区域和语言->其他日期,区域和时间设置->设置时间和日期->Internet时间->更改设置 应该会有两个服务器,分别更新下时间,哪个正确就用 ...

  4. hdu 1711Number Sequence (KMP入门,子串第一次出现的位置)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. 利用Microsoft.VisualBasic中TextFieldParser解析器把CSV格式倒入数据库

    阅读目录 利用ODBC去操作 利用TextFieldParser操作 写了个Demo,利用Microsoft.VisualBasic这个程序集中的TextFieldParser解析器解析CSV格式的文 ...

  6. AndroidStudio离线打包MUI

    1.下载5+SKD http://ask.dcloud.net.cn/article/103 2.解压到任意目录 3.导入HBuilder-Hello项目 4.在AndroidManifest.xml ...

  7. go 文件操作 io

    package main import ( "fmt" "os" ) func main() { //打开文件 //概念说明: file 的叫法 //1. fi ...

  8. 集合-Collection接口

    集合 和 数组 的比较: 数组 - 本质上就是在内存空间中申请的一段连续内存空间,存放多个相同类型的数据 - 数组一旦定义完毕,则在内存空间中的长度固定. - 插入/删除元素时可能导致大量元素的移动, ...

  9. 实现移动端上拉加载和下拉刷新的vue插件(mescroll.js)

    做一个简单的移动端展示项目,后台分页后前端加载,实现上拉加载下一页,找了下,还是用这个mescroll.js插件好一点 1.npm安装 npm install --save mescroll.js / ...

  10. Swift 之类的继承与类的访问权限

    http://www.cocoachina.com/swift/20160104/14821.html 上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swi ...