20 个基于 DPDK 开源项目,建议收藏

2021-09-03 21:56:04 +08:00
 wangwen41097468

一、ANS – DPDK 原生加速网络堆栈

ANS(加速网络堆栈)是 DPDK 本地 TCP/IP 堆栈,也参考 FreeBSD 实现。ANS 提供了一个与 Intel DPDK 一起使用的用户空间 TCP/IP 堆栈。

支持功能:

二、BESS – Berkeley 可扩展软件交换机

BESS 是一种可扩展的、高性能的软件交换机。BESS 是第一个专门为支持网络功能虚拟化而设计的软件交换机,除了传统的虚拟网络任务。

BESS 的四个关键组成部分:

BESS 是否在内核中运行?

不! BESS 完全在用户空间中,并使用 DPDK 直接绑定到网络接口(绕过内核)。避免内核网络堆栈的开销是使 BESS 超快的部分原因。这是与上图相同的图,但现在考虑了内核 /用户空间划分。

三、Butterfly – 连接虚拟机

Butterfly 连接虚拟机 (VM) 并控制其流量。

每个 VM 流量都包含在特定的VXLAN 网络中,并且流量由( EC2/Openstack-like )安全组过滤。

安全组可以应用于任何 VM 接口,并包含一个简单的网络规则列表(默认丢弃流量)。

虚拟网卡

在 Butterfly 中,虚拟 NIC (或 vnic )使您能够通过 vhost-user 向 Qemu VM 添加虚拟网络接口。每个 vnic 都有一个 24 位的网络 ID,称为 VNI 。如果两个具有相同 VNI 的 vnic 位于不同的物理主机上,Butterfly 会通过 VXLAN 封装 VM 数据包,并将它们发送到相应的物理主机。一旦收到,数据包将被解封装并路由到它们的最终目的地。使用相同 VNI 创建的所有 vnic 都位于同一网络上。如果具有相同 VNI 的两个 vnic 位于同一物理主机上,则数据包不会退出到物理网络。

Butterfly 旨在使用专用 DPDK 端口连接到物理网络 。它允许 Butterfly 在使用物理 NIC 卸载功能时在 VM 之间具有非常低的延迟。

对于 VM 到 VM 通信,不会发生校验和和分段,因为数据包不会在物理网络上传输。这使 Butterfly 能够在 VM 之间进行高速和低延迟的通信。

示例:在 vni "1337" 上创建新的 vnic "vnic_1":

butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 1337 --id vnic_1

数据筛选

使用 Butterfly 中的集成防火墙( NetBSD 的 NPF )为每个 vnic 过滤 VM 流量。过滤规则根据其安全组中包含的规则应用于每个 VM 。一个 vnic 可以使用多个安全组,一个安全组可以由多个 vnic 使用。当一个 vnic 使用多个安全组时,规则会累积。安全组包含要允许的规则列表(默认策略是阻止)和成员列表( IP 地址)。

Butterfly 规则主要由协议 /端口和允许的源描述。此源可以是 CIDR 块安全组的成员。

示例:在“mysg”安全组中添加一条规则,允许 22 端口上的 TCP 协议中的 42.0.3.1:

butterfly sg rule add mysg --ip-proto tcp --port 22 --cidr 42.0.3.1/32

示例:在“mysg”安全组中添加一条规则,允许“users”安全组成员在 80 端口使用 TCP 协议:

butterfly sg rule add mysg --ip-proto tcp --port 80 --sg-members users

注意:当一个或多个 vnic 使用的安全组被修改时,附加到每个受影响的 VM 的防火墙规则会重新加载。

使用

Butterfly 是一个可以通过网络 API 控制的守护进程。

它与客户端打包在一起,主要允许您添加 /删除 /列出 vnic 和安全组。

您当然可以直接编写对 Butterfly API 的调用。API 消息传输基于ZeroMQ,消息以Protobuf 格式编码。查看协议 以获取更多详细信息。

下面是一个 Butterfly 示例,其中 6 个 VM 隔离在三个网络( VNI 42 、51 和 1337 )中。

Butterfly 绑定一个专用网卡来发送 /接收 VXLAN 数据包,并绑定一个套接字(默认:tcp )来监听对其 API 的查询。如果您使用 DPDK 兼容卡,您将无法通过它访问 API 。

您可以使用几行客户端调用来构建此配置:

butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 42 --id vnic_1
butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 51 --id vnic_2
butterfly nic add --ip 42.0.0.2 --mac 52:54:00:12:34:02 --vni 51 --id vnic_3
butterfly nic add --ip 42.0.0.3 --mac 52:54:00:12:34:03 --vni 51 --id vnic_4
butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 1337 --id vnic_5
butterfly nic add --ip 42.0.0.2 --mac 52:54:00:12:34:02 --vni 1337 --id vnic_6

提示:如果您想查看图形的外观:运行butterfly status并复制webgraphviz.com 中的点图

您可以随时编辑安全组,这会自动更新 vnics 过滤。在下面的示例中,我们创建了一个新规则,以允许 http 协议中的所有人,并要求一些 vnic 使用此安全组。

butterfly sg add sg-web
butterfly sg rule add sg-web --ip-proto tcp --port 80 --cidr 0.0.0.0/0
butterfly nic sg add vnic_1 sg-web
butterfly nic sg add vnic_2 sg-web

注意:Butterfly API 使用幂等性,这意味着两次调用应该产生相同的结果。

四、DPVS – 第 4 层负载平衡器

DPVS 是一个基于 DPDK 的高性能 Layer-4 负载均衡器。它源自 Linux Virtual Server LVS 及其修改的 alibaba/LVS 。

DPVS 由爱奇艺 QLB 团队自 2016 年 4 月开发。它广泛用于爱奇艺 IDC 的 L4 负载均衡器和 SNAT 集群。

为实现高性能应用了多种技术:

主要特点DPVS包括:

功能模块

五、FastClick – 高速数据平面

FastClick - Click 模块化路由器的更快版本,具有批处理、高级多处理和改进的 Netmap 和 DPDK 支持 (ANCS'15)。检查 Metron 分支以了解 Metron 特性 (NSDI'18)。

六、F-Stack – 基于 DPDK 的通用网络框架

随着网络接口卡的快速发展,Linux 内核处理数据包的性能不佳已经成为现代网络系统的瓶颈。 然而,互联网增长的日益增长的需求需要更高性能的网络处理解决方案。 内核旁路的出现引起了越来越多的关注。 有各种类似的技术,例如:DPDK 、NETMAP 和 PF_RING 。 内核旁路的主要思想是 Linux 只用于处理控制流; 所有数据流都在用户空间处理。 因此,内核旁路可以避免内核数据包复制、线程调度、系统调用和中断引起的性能瓶颈。 此外,内核旁路可以通过多重优化方法实现更高的性能。 在各种技术中,DPDK 已被广泛使用,因为它与内核调度和活跃的社区支持更彻底地隔离。

F-Stack 是一个基于 DPDK 的开源高性能网络框架,具有以下特点:

  1. 网卡满载时可以达到的超高网络性能:1000 万并发连接,500 万 RPS,100 万 CPS 。
  2. 移植 FreeBSD 11.01 用户空间堆栈,提供完整的堆栈功能,并删减了大量无关功能。这大大提高了网络性能。
  3. 支持 Nginx 、Redis 等成熟应用。服务可以轻松使用 F-Stack 。
  4. 易于扩展的多进程架构。
  5. 提供微线程接口。各种有状态应用程序可以轻松使用 F-Stack 来获得高性能,而无需处理复杂的异步逻辑。
  6. 提供 Epoll/Kqueue 接口,允许多种应用轻松使用 F-Stack 。

历史

为应对日益严峻的 DDoS 攻击,腾讯云 DNSPod 的授权 DNS 服务器于 2012 年底从千兆以太网切换到 10 千兆。我们面临几个选择:一是继续使用 Linux 内核中原有的网络栈,另一种是使用内核绕过技术。经过多轮调查;我们最终选择基于 DPDK 开发我们的下一代 DNS 服务器。原因是 DPDK 提供了超高性能,未来可以无缝扩展到 40G,甚至 100G 的网卡。

经过数月的开发和测试,基于 DPDK 的高性能 DNS 服务器 DKDNS 于 2013 年 10 月正式发布,单个 10GE 端口最高可达 1100 万 QPS,两个 10GE 端口最高可达 1820 万 QPS 。然后我们开发了一个名为 F-Stack 的用户空间 TCP/IP 堆栈,它可以使用单个 10GE 端口处理 60 万 RPS 。

随着腾讯云的快速增长,我们越来越多的服务需要更高的网络访问性能。同时,F-Stack 在业务增长的推动下不断完善,最终发展成为通用的网络接入框架。但是我们最初的 TCP/IP 堆栈无法满足这些服务的需求。继续开发和维护完整的高性能网络堆栈的成本太高了。在评估了几个计划之后;我们最终决定将 FreeBSD ( 11.0 稳定版)的 TCP/IP 堆栈移植到 F-Stack 中。这不仅让我们停止重新发明轮子,我们还可以利用 FreeBSD 社区在未来带来的改进。多亏了libplebnetlibuinet,这项工作变得容易多了。

随着各类应用的快速发展,为了帮助不同的 APP 快速便捷地使用 F-Stack,F-Stack 集成了 Nginx 、Redis 等常用 APP,以及微线程框架,并提供了标准的 Epoll/队列接口。

目前,除了 DNSPod 的授权 DNS 服务器,腾讯云还有很多产品已经使用了 F-Stack,比如 HttpDNS ( D+)、COS 接入模块、CDN 接入模块等。

七、Lagopus – 软件 OpenFlow 1.3 交换机

高性能软件 OpenFlow 1.3 交换机和路由器

特征

八、MoonGen – 数据包生成器

MoonGen 是建立在一个脚本化的高速数据包生成libmoon。整个负载生成器由 Lua 脚本控制:发送的所有数据包均由用户提供的脚本制作。多亏了令人难以置信的快速 LuaJIT VM 和数据包处理库 DPDK,它可以在仅使用单个 CPU 内核的情况下用 64 字节数据包使 10 Gbit/s 以太网链路饱和。即使每个数据包都被 Lua 脚本修改,MoonGen 也能达到这个速率。它不依赖于重播相同缓冲区之类的技巧。

MoonGen 还可以接收数据包,例如,检查被测系统丢弃了哪些数据包。由于接收也完全由用户的 Lua 脚本控制,因此可用于实现高级测试脚本。例如,可以使用两个相互建立连接的 MoonGen 实例。此设置可用于对防火墙等中间设备进行基准测试。

MoonGen 重点关注四个要点:

MoonGen 建立在libmoon 之上,它是 DPDK 的 Lua 包装器。

用户可以为他们的实验编写自定义脚本。建议在脚本中使用硬编码的设置特定常量。脚本就是配置,为脚本编写一个复杂的配置界面是无关紧要的。或者,有一个简化(但功能较弱)的命令行界面可用于快速测试。

下图显示了架构以及如何处理多核支持。

执行从必须在用户脚本中定义的主任务开始。此任务在使用的 NIC 上配置队列和过滤器,然后启动一个或多个从属任务。

请注意,Lua 没有任何对多线程的本机支持。因此,MoonGen 会为每个线程启动一个新的且完全独立的 LuaJIT VM 。新的 VM 接收序列化参数:要执行的函数和参数,例如要从中发送数据包的队列。线程仅通过底层库共享状态。

示例脚本quality-of-service-test.lua展示了如何使用此线程模型来实现典型的负载生成任务。它通过发送两种不同类型的数据包来实现 QoS 测试并测量它们的吞吐量和延迟。它通过启动两项数据包生成任务来实现:一项用于后台流量,一项用于优先流量。第三个任务用于对传入的数据包进行分类和计数。

九、mTCP – 用户级 TCP 堆栈

在多核系统上扩展短 TCP 连接的性能具有根本的挑战性。尽管许多提议试图解决各种缺点,但内核实现的低效率仍然存在。例如,即使是最先进的设计,内核中处理 TCP 连接也需要花费 70% 到 80% 的 CPU 周期,因此在用户级程序中只剩下很小的创新空间。

mTCP 一种用于多核系统的高性能用户级 TCP 堆栈。mTCP 从头开始解决低效问题——从数据包 I/O 和 TCP 连接管理到应用程序接口。

  1. 将多个昂贵的系统调用转换为单个共享内存引用,
  2. 允许高效的流级事件聚合
  3. 为高 I/O 执行批处理数据包 I/O 效率。我们在 8 核机器上的评估表明,与最新的 Linux TCP 堆栈相比,mTCP 将小消息事务的性能提高了 25 倍,与迄今为止已知性能最佳的研究系统相比,提高了 3 倍。与 Linux 堆栈上的应用程序相比,它还将各种流行应用程序的性能提高了 33% 到 320%。

十、OPNFV – NFV 开放平台

NFV 开放平台 (OPNFV) 是一个项目和社区,可促进通用 NFVI 、与上游项目的持续集成 (CI)、独立测试工具集以及用于全行业测试和集成的合规性和验证程序,以加速企业和服务提供商网络的转型。目标包括加快 NFV 解决方案的上市时间、减轻运营负担并确保平台满足行业需求。

作为一个通用的 NFVI 平台,OPNFV 将跨计算、存储和网络虚拟化的上游组件汇集在一起,以创建一个端到端平台。OPNFV 中的活动侧重于组件的集成、端到端堆栈测试以及集成环境的自动化构建和部署。针对关键 NFV 用例对平台进行持续集成和自动化测试是确保平台满足 NFV 行业需求的关键。另一个重点是创建合规性和验证程序,以大幅削减运营团队的工作量。

应用

虚拟网络功能包括移动部署( 5G/LTE ),其中移动网关(例如 SGW 、PGW 等)和相关功能(例如 MME 、HLR 、PCRF 等)被部署为 VNF,到具有“虚拟”的部署客户端设备 (CPE)、隧道网关(例如 VPN 网关)、防火墙或应用级网关和过滤器(例如 Web 和电子邮件流量过滤器)以测试和诊断设备(例如 SLA 监控)。

这些 VNF 部署需要易于操作、扩展和发展 - 独立于正在部署的 NFVI 类型。OPNFV 是一个灵活的平台,它可以支持一组质量和用例,例如:

十一、OpenDataPlane – 开放数据平面

OpenDataPlane (ODP) 提供了一个易于使用、高性能且可在网络 SoC 之间移植的数据平面应用程序编程环境。本文档既是希望使用 ODP 的开发人员的用户指南,也是 ODP 程序员的详细参考,涵盖 API 、数据结构、文件等。对于希望在其他平台上实现 ODP 的人来说,它也应该有用。

ODP 由一个公共层和一个实现层组成。写入公共层的应用程序可以跨所有 ODP 实现移植。为了编译和运行 ODP 应用程序,它是针对特定的 ODP 实现层进行编译的。实现层的目的是提供 ODP API 到托管 ODP 实现的 SoC 的底层功能(包括硬件协同处理和加速支持)的最佳映射。作为应用程序的引导机制,并为 ODP 实现者提供模型,ODP 提供了一个“linux 通用”参考实现,旨在在任何具有 Linux 内核的 SoC 上运行。虽然 linux-generic 不是性能目标,但它确实为 ODP 实现者和应用程序程序员提供了一个起点。

十二、Open vSwitch – 多层开放虚拟交换机

Open vSwitch 是一种生产质量的多层虚拟交换机,在开源Apache 2.0许可下获得许可。它旨在通过编程扩展实现大规模网络自动化,同时仍支持标准管理接口和协议(例如 NetFlow 、sFlow 、IPFIX 、RSPAN 、CLI 、LACP 、802.1ag )。此外,它旨在支持跨多个物理服务器的分布,类似于 VMware 的 vNetwork 分布式 vswitch 或 Cisco 的 Nexus 1000V 。

Open vSwitch 用于多种产品,并在许多大型生产环境(有些非常非常大)中运行。每个稳定版本都经过一个包含数百个系统级测试和数千个单元测试的回归套件。

Open vSwitch 既可以作为在虚拟机管理程序中运行的软交换机运行,也可以作为切换芯片的控制堆栈运行。它已被移植到多个虚拟化平台和交换芯片组。它是 XenServer 6.0 、Xen 云平台中的默认交换机,还支持 Xen 、KVM 、Proxmox VE 和 VirtualBox 。它还被集成到许多虚拟管理系统中,包括 OpenStack 、openQRM 、OpenNebula 和 oVirt 。内核数据路径随 Linux 一起分发,并且软件包可用于 Ubuntu,Debian 、Fedora 和 openSUSE 。FreeBSD 和 NetBSD 也支持 Open vSwitch 。

十三、Packet-journey – 基于 DPDK 的 Linux 路由器

该项目的目的是提供一个免费的应用程序,能够:

Packet-journey (pktj) 由多种线程组成:

为了获得最佳性能,评论线程必须单独位于其核心上。所有其他线程都在同一个核心上调度可以。

十四、Pktgen-dpdk – 数据包生成器

Pktgen 是一个流量生成器,由 DPDK 提供支持,以 64 字节帧的线速流量。

十六、PcapPlusPlus – C++ 数据包解析框架

PcapPlusPlus 是一个多平台 C++ 库,用于捕获、解析和制作网络数据包。它旨在高效、强大且易于使用。

PcapPlusPlus 能够为多种网络协议提供解码和伪造功能。它还为最流行的数据包处理引擎(如 libpcap 、WinPcap 、Npcap 、DPDK 和 PF_RING )提供易于使用的 C++ 包装器。

功能

十七、Ruru – 实时 TCP 延迟监控

Ruru 是一款 TCP 延迟监控应用程序,可帮助实时了解广域 TCP 流量。它利用英特尔 DPDK 进行高速数据包处理(高达 40Gbit/s )和一个 Node.JS Web 前端来呈现结果。

架构

系统由三部分组成:

组件之间的通信使用套接字( zmq 和 websockets )。高级架构如下所示。

十八、Seastar – 开源 C++ 框架

Seastar 是一种先进的开源 C++ 框架,用于现代硬件上的高性能服务器应用程序。Seastar 用于 Scylla,这是一种与 Apache Cassandra 兼容的高性能 NoSQL 数据库。使用 Seastar 的应用程序可以在 Linux 或 OSv 上运行。

Seastar 是第一个汇集了一系列极端架构创新的框架,包括:

使用 Seastar 的项目

十九、SPDK – 存储性能开发套件

存储性能开发套件 (SPDK) 提供了一组工具和库,用于编写高性能、可扩展的用户模式存储应用程序。它通过使用许多关键技术来实现高性能:

将所有必要的驱动程序移至用户空间,从而避免系统调用并支持从应用程序进行零拷贝访问。

轮询硬件完成而不是依赖中断,这降低了总延迟和延迟差异。

避免 I/O 路径中的所有锁定,而是依赖于消息传递。

SPDK 的基石是用户空间、轮询模式、异步、无锁 NVMe 驱动程序。这提供了从用户空间应用程序直接访问 SSD 的零拷贝、高度并行访问。该驱动程序被编写为具有单个公共头文件的 C 库。有关更多详细信息,请参阅 NVMe 驱动程序。

SPDK 进一步提供了一个完整的块堆栈作为用户空间库,它执行许多与操作系统中的块堆栈相同的操作。这包括统一不同存储设备之间的接口、排队处理内存不足或 I/O 挂起等情况,以及逻辑卷管理。有关详细信息,请参阅块设备用户指南。

最后,SPDK 提供了基于这些组件构建的 NVMe-oF 、iSCSI 和 vhost 服务器,这些组件能够通过网络或其他进程为磁盘提供服务。NVMe-oF 和 iSCSI 的标准 Linux 内核启动器与这些目标以及 QEMU 与 vhost 进行互操作。这些服务器的 CPU 效率可以比其他实现高一个数量级。这些目标可用作如何实现高性能存储目标的示例,或用作生产部署的基础。

二十、NFF-Go - GO 的网络功能框架

NFF-Go 是一组用于创建和部署云原生网络功能 (NF) 的库。它在不牺牲性能的情况下简化了网络功能的创建。

好处:

后记

DPDK 工程师手册:

[冲破内核瓶颈,让 I/O 性能飙升] DPDK 工程师手册,官方文档,最新视频,开源项目,实战案例,论文,大厂内部 ppt,知名工程师一览表

golang 资料补给包:

[未来服务器端编程语言] 最全空降 golang 资料补给包(满血战斗),包含文章,书籍,作者论文,理论分析,开源框架,云原生,大佬视频,大厂实战分享 ppt

2611 次点击
所在节点    推广
3 条回复
LeoJ
2021-09-09 00:45:35 +08:00
mark 总结的很棒啊~
artnowben
2022-07-13 15:06:17 +08:00
还有一个 DPDK 项目
https://github.com/baidu/dperf
artnowben
2022-11-23 17:50:53 +08:00
dperf 是基于 DPDK 的网络测试仪,可以测试网卡、交换机、防火墙、四层负载均衡等的性能。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799760

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX