这篇文章是对 OSDI20 的 Best Paper hXDP: Efficient Software Packet Processing on FPGA NICs 的阅读笔记,感兴趣的同学可以点击阅读原文查看论文的 paper,slide 和 video。
FPGA 目前已经成为数据中心和公有云进行硬件网络加速的一个重要手段,而 XDP 是 Linux 社区提供的一个通过 eBPF 进行高性能网络编程的软件框架。乍一看两者分别运行在不同的层面应该是井水不犯河水,而论文的作者把这一硬一软的两个黑魔法结合了起来,而这也激起了我阅读的兴趣。
首先要回答的问题就是为什么要让 XDP 程序运行在 FPGA 上?理论上高速网络的功能,例如防火墙、负载均衡、SDN 独立使用 FPGA 或者 XDP 都是可以完成的,没必要硬把两者合在一起。只是为了叠 buff 把两者合在一起炫技,那成本显然太高了,必须有落地的场景才有意义。而这个工作的主要意义就是为了解决 XDP 和 FPGA 各自在处理网络方面所面临的问题。
从 XDP 一侧来看,XDP 是一种利用 CPU 来进行网络处理的技术,就会面临 CPU 带来的瓶颈:
而 FPGA 的问题主要在于 FPGA 的编程使用的是硬件设计语言,和软件开发逻辑相差较大,有较高的门槛。除非是大型的企业的基础设施部门,普通企业内部很难有专门的硬件工程师来进行网络功能开发。
既然 XDP 一侧面临 CPU 资源消耗的问题,而 FPGA 一侧面临编程困难的问题,那么自然就产生了将 XDP offload 到 FPGA 的想法。这样一方面可以用较低的门槛,使用软件的方式灵活进行网络开发,另一方面又能把网络任务在 FPGA 上执行,能够降低延迟和 PCIe 的带宽,还能节省出更多的 CPU 资源给更高价值的业务使用。利用两者优势的同时还恰好补足了双方的短板,岂不美哉。
理论上看只要在 FPGA 上实现一个能够运行 eBPF 指令的 IP core,在通过 Linux 已有的机制把指令 offload 到硬件上就可以了,但实际应用中会碰到另一个性能问题,那就是 FPAG 相对 CPU 较低的频率。作者使用的 FPGA 主频为 150Mhz,相对服务器 2Ghz ~ 3Ghz 有着数量级上的差别,这就会带来以下的问题:
接下来作者主要介绍如何针对 eBPF 指令在 FPGA 上运行进行优化。和软件开发总想着绕过这绕过那不同,硬件开发者的优化的方向都很硬核:
这里主要介绍第一个优化方向,即通过扩展自定义指令集,降低最终执行指令数量来提升性能。这里面针对 eBPF 指令本身的特点和网络处理的特点做了很多针对性的优化,达到了尽管我主频比 x86 低,但是我指令数少一样性能好的结果,展示了当可以自己定义硬件能力和指令集时优化的独特能力。
r4=r2; r4+=14;
两条指令可以翻译成 r4=r2+14
这样一条指令。r0=1;exit;
这可以优化成一条 exit_drop
作者选取了几个在 Linux 代码库中的 XDP example ,一个简单的 XDP 防火墙和 Facebook 开源的 Katran 作为测试应用,对比同样的应用在 FPGA 和 运行在 1.2GHz,2.1Ghz 和 3.7GHz CPU 上的性能对比。作者测试的指标比较多,简单列一些我比较关注的: