BPF及其衍生产物初见

eBPF 的前身———— BPF

BPF 的全称是 Berkeley Packet Filter,又称 classical BPF(cBPF);顾名思义,这是一个用于过滤(filter)网络报文(packet)的架构,为 tcpdump 抑或 wireshark 乃至网络监控(Network Monitoring)领域的基石。

extended BPF(eBPF)产生之由

BPF 设计者们额外在 tcpdump 中设计了我们今天常见的过滤表达式,很大程度上推动了 BPF 的发展,此后数年,BPF 逐渐称为大众所认同,包括 Linux 在内的众多操作系统都开始将 BPF 引入了内核;Packet Filter 的功能得到了充分肯定。但同时,另一方面 BPF 用于定义 Filter 的伪代码为了执行要专门实现一个虚拟机,这也在一定程度上提高了开发和维护的门槛;因此它获得了进化————extended BPF。

extended BPF(eBPF)简述

eBPF 已经为内核追踪(Kernel Tracing)、应用性能调优/监控、流控(Traffic Control)等领域带来了激动人心的变革,在接口的设计以及易用性上,eBPF 也有了较大的改进。

eBPF 的 map 机制

位于用户空间中的应用在内核中辟出一块空间建立起一个数据库用以和 eBPF 程序交互(bpf_create_map());数据库本身以 Key-Value 的形式进行组织,无论是从用户空间还是内核空间都可以对其进行访问,使其在效率方面获得了无可比拟的优势————可以在运行时修改可编程的内核操作而无需重新编译,且复制字节极少。

In-kernel Verifier

cBPF 时代就开始加入了代码检查机制以防止不规范的注入代码;到了 eBPF 时代则在载入程序(bpf_load_program())时加入了更复杂的verifier 机制,在运行注入程序之前,先进行一系列的安全检查,可以保证绝对安全的获取内核执行信息,是内核调试和开发者的不二选择。

伴随时间产生的不满和衍生产物

利用高级语言 C 书写 BPF 逻辑并经由编译器生成出伪代码自然是便利了许多,但它时至今日仍使用数量有限的 C 语言库,并且不支持使用外部库进行操作;同时以今日的眼光来看待,其代码在衍生应用中明显存在冗余。

hXDP

在FPGA加速器上eBPF的许多指令存在冗余,以eBPF为基础,针对FPGA加速器将其精简设计得到了hXDP
评估hXDP时用了约15%的FPGA资源,在运行动态加载的程序时达到了高端CPU的数据吞吐量,并将数据包转发延迟降低了10倍
参考文档:
Linux内核工程导论——网络:Filter(LSF、BPF、eBPF)
eBPF 简史
hXDP: Efficient Software Packet Processing on FPGA NICs
Fast Packet Processing with eBPF and XDP: Concepts, Code, Challenges, and Applications

posted @ 2020-11-12 20:56  落叶sama  阅读(328)  评论(0编辑  收藏  举报