哈Ha! 我提请您注意布伦丹·格雷格( Brendan Gregg)关于eBPF的文章的翻译
在Linux Plumbers会议上,至少有24个eBPF演示。 很快,它不仅成为了无价的技术,而且成为了抢手的技术。 也许您想为新年设定一些目标-学习eBPF!
术语eBPF应该具有实质意义,例如虚拟内核指令集(VKIS),但其起源是扩展的Berkeley数据包过滤器。 它适用于许多领域,例如网络性能,防火墙,安全性,跟踪和设备驱动程序。 对于其中的某些人,Internet上有许多免费的可用信息-例如,跟踪,但是对于其他人而言,还没有。 术语跟踪是指可以为每个事件生成信息的性能分析和监视工具。 您可能已经使用过跟踪器-tcpdump和strace是专门的跟踪器。
在这篇文章中,我将描述研究eBPF用于跟踪目的的过程,分为初学者,高级用户和高级用户三部分。 总结:
初学者
1.什么是eBPF,密件抄送,bpftrace和iovisor?
eBPF在Linux上的作用与JavaScript在HTML上的作用相同。 因此,使用JavaScript(而不是静态HTML网站),您可以定义在事件(例如,鼠标单击)中运行的微型程序,这些微型程序在浏览器的安全虚拟机中运行。 借助eBPF,您现在无需编写内核,而是可以编写在内核安全虚拟机上的磁盘I / O等事件上运行的微型程序。 实际上,eBPF更像是运行JavaScript的v8虚拟机,而不是JavaScript本身。 eBPF是Linux内核的一部分。
就像在v8字节码中一样,直接在eBPF中进行编程非常困难。 但是在v8中没有一个代码:每个人都使用JavaScript编写代码,或者经常在JavaScript之上的框架(jQuery,Angular,React等)中编写代码。 与eBPF相同。 人们将使用它,并通过框架编写代码。 跟踪的主要对象是bcc和bpftrace 。 它们不存在于内核代码库中;它们存在于名为iovisor的github上的Linux Foundation项目中。
2.是否可以使用eBPF进行跟踪?
这个基于eBPF的实用工具演示了完全建立的TCP会话,包括它们的进程ID(PID),命令名(COMM),发送和接收的字节数(TX_KB,RX_KB)以及持续时间(毫秒):
#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卷曲100.66.3.172 61620 52.205.89.26 80 0 1 91.79
22604卷曲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使此工具变得实用 :它高效且安全。 例如,它不会像以前的方法那样跟踪每个程序包,并且可能导致性能过度下降。 相反,它仅跟踪发生频率低得多的TCP会话事件。 这使得开销非常低,因此我们可以在24x7模式下运行此工具。
3.如何使用?
初学者应该开始探索密件抄送。 请参阅操作系统的密件抄送安装说明 。 对于Ubuntu,它看起来像这样:
#sudo apt-get更新
#sudo apt-get install bpfcc-tools
#sudo / usr / share /密件抄送/工具/ opensnoop PID通讯FD错误路径
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设备轮询4 0 / dev / bus / usb
^ C
在这里,我结束了opennoop来测试工具的功能。 如果您走了这么远,那么您绝对可以使用eBPF!
对于Netflix和Facebook这样的公司,默认情况下,密件抄送安装在所有服务器上。 也许您想做同样的事情。
4.有入门指南吗?
是的,我编写了密件抄送指南,这对于新手使用eBPF进行跟踪是一个很好的起点:
作为初学者,您无需为eBPF编写任何代码。 密件抄送已经包含70多个可以立即使用的工具。 本指南将引导您完成以下11个步骤:execsnoop,opensnoop,ext4slower(或btrfs *,xfs *,zfs *),biolatency,biosnoop,cachestat,tcpconnect,tcpaccept,tcpretrans,runqlat和profile。
在尝试了它们之后,您只需要知道还有许多其他方法:

手册页工具和示例文件也对它们进行了全面记录。 样本文件(bcc / tools中的* _example.txt)包含带有说明的屏幕截图:例如biolatency_example.txt 。 我写了许多文章(包括手册页和工具),它们看起来像是另外50篇博客文章,您可以在密件抄送存储库中找到它们。
缺少的是实际的生产示例。 我在eBPF太新以至仅在我们的测试环境中可用时才编写此文档,因此大多数示例都是人为的。 随着时间的流逝,我们将添加实际示例。 这是初学者可以提供的帮助:如果您要解决问题,请考虑撰写文章并共享屏幕截图或将其添加为示例文件。
对于有经验的
此时,您应该已经运行了bcc并试用了这些工具,并对修改它们和编写自己的工具感兴趣。 最好的方法是升级到bpftrace,bpftrace包含易于学习的高级语言。 缺点是它不像密件抄送那样灵活,因此您可能会遇到限制并想回到密件抄送。
请参阅bpftrace安装说明 。 这是一个较新的项目,因此在撰写本文时,尚未针对所有系统编译软件包。 将来,它应该只是apt-get install bpftrace或类似的东西。
1. bpftrace教程
我开发了一个教程,通过一系列单行讲授如何使用bpftrace:
有12个课程,将逐步教您如何使用bpftrace。 这是一个例子:
#bpftrace -e'跟踪点:syscalls:sys_enter_open {printf(“%d%s \ n”,pid,str(args->文件名)); }'安装1个探头...
181 / proc / cpuinfo
181 / proc / stat
1461 / proc / net / dev
1461 / proc / net / if_inet6
^ C
它使用开放系统调用作为跟踪点来跟踪PID和打开文件路径。
2. bpftrace参考指南
有关bpftrace的更多信息,我编写了一个指南,其中包含语法示例,测试和内置命令:
为了简洁起见:我尝试将标题,简历和屏幕截图放在一页上。 我认为这太长了-如果您正在寻找某些东西,则需要多次滚动页面。
3.示例中的bpftrace
您可以通过示例查看bpftrace存储库中的20多种工具:
例如:
# 猫工具/ biolatency.bt [...]
开始
{
printf(“跟踪块设备I / O ...按Ctrl-C结束。\ n”);
}
kprobe:blk_account_io_start
{
@start [arg0] = nsecs;
}
kprobe:blk_account_io_completion
/ @开始[arg0] /
{
@usecs = hist((nsecs-@start [arg0])/ 1000);
删除(@start [arg0]);
}
像密件抄送一样,这些实用程序具有手册页和示例文件。 例如, biolatency_example.txt 。
对于高级
1.我们研究密件抄送的发展
我创建了两个指南来提供帮助:
在密件抄送/工具/*.py中也有很多示例。 密件抄送工具由两部分组成:用C编写的内核的BPF代码和用Python(或lua或C ++)编写的用户空间级工具。 bcc工具的开发相当先进,可能包括内核的一些小组件或内部应用程序元素。
2.参与开发
欢迎提供帮助:
对于bpftrace,我创建了bpftrace内部开发指南 。 当您在llvm IR中编程时,这很困难,但是如果您准备接受挑战...
eBPF(又名BPF)也有其核心:如果您查看bcc和bpftrace问题,将会看到一些改进的要求。 例如, bpftrace中的内核标记 。 另请参阅netdev邮件列表 ,以了解在与Linux主线合并之前已添加到net-next的最新BPF内核开发。
除了编写代码,您还可以参与测试,创建程序包,博客和讨论。
结论
eBPF做很多不同的事情。 在这篇文章中,我研究了如何掌握eBPF以进行跟踪和性能分析。 总结:
我还有一个关于eBPF跟踪工具的单独页面,其中更详细地介绍了所有这些内容。 祝你好运!