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

2023-10-30

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

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

img

文件结构

  • ans:加速网络堆栈过程。
  • librte_ans:TCP/IP 堆栈静态库。ANS 使用 dpdk mbuf、ring、memzone、mempool、timer、spinlock。所以在 dpdk 和 ANS 之间零拷贝 mbuf。
  • librte_anssock:应用程序的 ANS 套接字库,ANS 和应用程序之间的零复制。
  • librte_anscli:用于路由/ip/neigh/link 配置的 ANS cli 库。
  • cli:用于配置 ANS tcp/ip 堆栈的命令。
  • 示例:ANS 应用示例。
  • 测试:带有 ANS 的示例应用程序,用于测试 ANS tcp/ip 堆栈

支持环境

  • EAL 基于 dpdk-18.11;
  • linux 版本: 4.4.0-45-generic (Ubuntu 16.04.1 LTS)。
  • gcc 版本: gcc 版本 5.4.0 20160609。

支持功能:

  • ANS 初始化;
  • ANS 在容器中运行;
  • Ether,NIC 和 ANS TCP/IP 堆栈之间的零复制;
  • ARP,ARP超时;
  • IP层,IP分片和重组;
  • 高性能路由;
  • ICMP;
  • 访问控制列表;
  • 绕过流量到linux内核;
  • 从 linux 内核同步 IP/路由;
  • 支持动态路由(OSPF/BGP…);
  • 支持DHCP客户端;
  • 命令行界面:
  • 添加、删除、显示IP地址;
  • 添加、删除、显示静态路由;
  • 显示邻居表;
  • 显示界面和统计信息;
  • 显示 IP 统计信息;
  • 添加、删除、显示ACL;
  • 添加、删除、显示绕过规则;
  • 显示端口队列 lcore 映射;
  • 添加、删除、显示流量过滤规则;
  • UDP协议;
  • 套接字层;
  • Socket API兼容BSD,APP可以基于开关选择ANS socket或linux socket。
  • socket/bind/connect/listen/close/send/recv/epoll/writev/readv/shutdown…;
  • 支持openssl;
  • TCP协议;
  • 支持可靠传输;
  • 支持基于dupack的重传,基于超时的重传;
  • 支持流量控制;
  • 支持拥塞控制:newreno/cubic/vegas…;
  • 支持最大段大小;
  • 支持选择性确认;
  • 支持窗口缩放;
  • 支持TCP时间戳;
  • 支持TCP ECN;
  • 支持保持活力;
  • 支持SO_REUSEPORT,多个应用可以监听同一个端口;
  • 支持多核tcp堆栈,每个lcore每个tcp堆栈;
  • 支持TSO。
  • 路由器;
  • 支持虚拟主机;
  • 支持虚拟用户;
  • 支撑刀;
  • 支持敲击;
  • 硬件;
  • x86:broadwell、haswell、ivybridge、knl、sandybridge、westmere 等。
  • arm:arm64 SoC 和边缘计算机;

img

架构图

TCP部署

         |-------|       |-------|       |-------|
APP      |anssock|       |anssock|       |anssock|
         |-------|       |-------|       |-------|
             |               |               |			
            fd              fd              fd
--------------------------------------------------
ANS          |               |               |
         |-------|       |-------|       |-------|
         | TCP   |       |  TCP  |       | TCP   |
         |---------------------------------------|       
         |               IP/ARP/ICMP             |
         |---------------------------------------|       
         |LCORE0 |       |LCORE1 |       |LCORE2 |
         |-------|       |-------|       |-------|
             |               |               |
         |---------------------------------------| 
         |                  NIC + RSS            | 
         |---------------------------------------| 
  • 网卡根据RSS 将数据包分发到不同的lcore,因此相同的TCP 流在同一个lcore 中处理。
  • 每个 lcore 都有自己的 TCP 堆栈,自由锁。
  • IP/ARP/ICMP 在 lcore 之间共享。
  • APP 进程作为 tcp 服务器运行。
  • 如果App进程只创建一个listen socket,那么listen socket只监听一个lcore,接受lcore的tcp连接,所以APP进程号应该大于lcore号。APP进程的listen sockets平均在每个lcore上创建。例如: ans(with -c 0x3) 在两个 lcore 上运行,应该运行两个 nginx(只运行 master ),一个 nginx 在 lcore0 上侦听,另一个 nginx 在 lcore1 上侦听。
  • 如果启用重用端口,APP 进程可以绑定相同的端口,APP 进程可以通过循环接受 tcp 连接。
  • 如果网卡不支持多队列或RSS,应增强ans_main.c,保留一个lcore来接收和发送来自网卡的数据包,并通过软件RSS将数据包分发到ANS tcp堆栈的lcores。

例子

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

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

BESS的四个关键组成部分:

img

  • bessd:“BESS 守护进程”是核心软件开关。守护进程本身在端口和模块之间传送数据包。
  • 端口:端口是数据包可能进入或退出 bessd 的地方。端口可以连接到网络接口、虚拟机、容器化应用程序或在用户空间中运行的正常进程。
  • 模块:模块是允许 bessd 检查或修改数据包的代码块。模块通过输入和输出接收和释放数据包。一些内置模块包括:
  • 一个循环模块,它在一个输入门上接收数据包,并在多个输出门上以循环方式释放数据包。
  • ACL 模块,它在一个输入门上接收数据包,并检查数据包头是否与列入黑名单的防火墙规则匹配。匹配黑名单规则的数据包在一个门上发布,不匹配任何黑名单规则的数据包在另一个门上发布。
  • bessctl:这是 bessd 的控制器。bessctl 提供了一个命令行界面,允许管理员配置哪些端口连接到哪些模块,检查 bessd 中的流量在哪里,以及各种其他有用的管理命令。

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)中。

img

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层负载平衡器

img

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

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

img

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

  • 内核旁路(用户空间实现)。
  • Share-nothing,每个 CPU 的关键数据(无锁)。
  • RX 转向和CPU 关联性(避免上下文切换)。
  • 批量发送/接收。
  • 零复制(避免数据包复制和系统调用)。
  • 轮询而不是中断。
  • 高性能 IPC 的无锁消息。
  • DPDK增强的其他技术。

主要特点DPVS包括:

  • L4 负载均衡器,包括 FNAT、DR、Tunnel、DNAT 模式等。
  • 从内部网络访问 Internet 的SNAT模式。
  • FNAT 模式下的NAT64转发,无需更改应用程序即可快速适应 IPv6。
  • 不同的调度算法,如 RR、WLC、WRR、MH(Maglev Hashing)、Conhash(Consistent Hashing) 等。
  • 用户空间精简版 IP 堆栈(IPv4/IPv6、路由、ARP、邻居、ICMP …)。
  • 支持不同IDC环境的KNI、VLAN、Bonding、Tunneling。
  • 安全方面,支持TCP syn-proxy , Conn-Limit , black-list , white-list。
  • QoS:流量控制。

img

功能模块

五、FastClick – 高速数据平面

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

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

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

img

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 交换机

img

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

特征

  • Lagopus 交换机
  • Best OpenFlow 1.3 compliant switch
  • OpenFlow Switch Specification 1.3.4
  • High performance software data plane with DPDK
  • Lagopus 路由器
  • 多个VRF
  • VLAN交换
  • DPDK支持
  • 仍然是测试版

八、MoonGen – 数据包生成器

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

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

MoonGen 重点关注四个要点:

  • 高性能和多核扩展:每个 CPU 内核每秒 > 2000 万个数据包
  • 灵活性:每个数据包都是由用户提供的 Lua 脚本实时制作的
  • 精确和准确的时间戳:在商品硬件上以亚微秒精度进行时间戳
  • 精确和准确的速率控制:在商品硬件上可靠地生成任意流量模式

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

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

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

img

执行从必须在用户脚本中定义的主任务开始。此任务在使用的 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 解决方案的上市时间、减轻运营负担并确保平台满足行业需求。

img

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

应用

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

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

  • VNF 生命周期管理的通用机制,包括部署、实例化、配置、启动和停止、升级/降级和最终退役。
  • 用于引导、指定和互连 VNF、VNFC 和 PNF 的一致机制;与物理网络基础设施、网络覆盖等无关,即虚拟链接。
  • 动态实例化新的 VNF 实例或停用足够的 VNF 实例以满足当前性能、规模和网络带宽需求的通用机制。
  • 检测 NFVI、VIM 和其他基础设施组件中的故障和故障并从这些故障中恢复的机制。
  • 用于从/向物理网络功能向/从虚拟网络功能获取/接收流量的机制。
  • NFVI 即服务,用于在同一基础架构上托管来自不同供应商的不同 VNF 实例

十一、OpenDataPlane – 开放数据平面

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

img

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。

img

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路由器

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

  • 使用 LPM 交换多个数据包
  • 通过添加更多数据包/CPU的利益使这种交换具有可扩展性
  • 使用Netlink从Linux内核学习语音
  • 从Netlink学习邻居,内核自动刷新
  • 能够将一些数据包评论到将处理它们的内核(ARP、ICMP、BGP)
  • 发送到内核的ICMP数据包限速
  • 支持L3/L4 ACL
  • 通过基于 unixsock 的 cli 收集信息统计和管理 ACL
  • 可通过配置文件进行配置

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

  • pktj,主线程执行所有初始化并处理信号。
  • forward-LCOREID,这些线程正在执行转发部分。它们从 PMD 读取数据包,处理这些数据包将它们发送回 PMD。
  • kni-LCOREID,这些线程正在从 KNI 读取数据包将它们发送到配置的端口。
  • lcore-slave-LCOREID,那些线程不是做的,他们只是在等待。
  • control-SOCKETID,这些线程负责从 IFADDR、ROUTE、NEIGH 和 LINK 组接收 NETLINK 消息并处理它们。
  • cmdline-SOCKETID,这些线程通过 unixsocks 呈现 CLI。
  • rdtsc-SOCKETID,这些线程正在读取 TSC 值,将其对 lcore-slave 线程的响应。

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

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

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

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

img

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

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

功能

  • 数据包捕获通过一个简单易用的C ++包装流行的数据包捕获引擎,如libpcap的,WinPcap的,Npcap,英特尔DPDK,的NTOP的PF_RING和原始套接字
  • 数据包解析和制作,包括协议和层的详细分析、数据包生成和各种网络协议的数据包编辑
  • 从/读取和写入数据包文件,两个PCAP和PCAPNG格式
  • 通过用于DPDK和PF_RING的高效且易于使用的 C++ 包装器以线速处理数据包
  • 多平台支持- PcapPlusPlus 完全支持 Linux、MacOS、Windows、Android 和 FreeBSD
  • 数据包重组- TCP 重组的独特实现,包括 TCP 重传、无序 TCP 数据包和丢失的 TCP 数据,以及用于创建和重组 IPv4 和 IPv6 片段的IP 分段和碎片整理
  • 数据包过滤使 libpcap 的 BPF 过滤器更加用户友好
  • TLS 指纹识别- JA3 和 JA3S TLS 指纹识别的 C++ 实现

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

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

img

架构

系统由三部分组成:

  • DPDK 延迟后端(用 C / 多线程编写):该软件测量所有 TCP 流的 SYN、SYN-ACK 和第一个 ACK TCP 数据包之间经过的时间。它在 ZMQ 套接字上发送测量信息(源 IP、目标 IP、延迟(以微秒为单位))。
  • 分析(用 C / 多线程编写):该组件检索从 DPDK 后端接收的测量数据中所有 IP(使用IP2location.com数据库)的AS/地理标签信息,并生成基本统计信息。它在 ZMQ 套接字上推送 JSON 格式的信息。
  • 前端:它是一个用 React 和 Deck.Gl 构建的 Node.js。它使用 socket.io 与浏览器通信。

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

img

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

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

img

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

  • 无共享设计:Seastar 使用无共享模型,将所有请求分片到单个内核上。
  • 高性能网络:Seastar 提供多种网络堆栈选择,包括便于开发的传统 Linux 网络、用于 Linux 上快速用户空间网络的 DPDK 以及 OSv 上的本机网络。
  • Futures and promises:一种用于并发应用程序的高级新模型,它为 C++ 程序员提供高性能和创建易于理解、可测试的高质量代码的能力。
  • 消息传递:一种无需耗时锁定即可在 CPU 内核之间共享信息的设计

使用 Seastar 的项目

  • cpv-cql-driver : 基于 seastar 框架的 Cassandra/Scylla 的 C++ 驱动程序
  • cpv-framework : 基于 seastar 框架用 c++ 编写的 web 框架
  • redpanda:任务关键系统的 Kafka 替代品
  • Scylla:与 Cassandra 和 DynamoDB 兼容的快速可靠的 NoSQL 数据存储
  • smf : 西方最快的 RPC

十九、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 更高级别的抽象。使用 DPDK 作为性能的快速 I/O 引擎
  • Go 语言:安全、生产力、性能、并发
  • 网络功能是应用程序而不是虚拟机
  • 内置调度程序可根据输入流量自动缩放处理。上下都有。

好处:

  • 轻松利用英特尔硬件功能:多核、AES-NI、CAT、QAT、DPDK
  • 代码行数减少 10 倍
  • 无需成为专家网络程序员即可开发高性能网络功能
  • 每盒与 C/DPDK 相似的性能
  • 无需担心弹性 - 自动完成
  • 利用云原生部署:持续交付、微服务、容器

后记

DPDK工程师手册:

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

golang资料补给包:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

20个基于DPDK开源项目,建议收藏 的相关文章

  • Node.js 可读流_read用法

    我了解如何在 Node 的 new 中使用可写流Streams2库 但我不明白如何使用可读流 举个例子 一个流包装器围绕dgram module var dgram require dgram var thumbs twiddle func
  • 高效的内存屏障

    我有一个多线程应用程序 其中每个线程都有一个整数类型的变量 这些变量在程序执行期间递增 在代码中的某些点 线程将其计数变量与其他线程的计数变量进行比较 现在 我们知道在多核上运行的线程可能会无序执行 一个线程可能无法读取其他线程的预期计数器
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 如何允许应用程序声明“https”方案 URI? (即如何从 https URL 打开桌面应用程序?)

    目前我正在尝试为 OAuth 2 0 授权流程创建一个客户端 实际上是一个本机应用程序 并且在规范中就在这儿 https www rfc editor org rfc rfc8252 section 7 2据说有 3 种方法来处理重定向 U
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有
  • linux命令中括号的用途是什么[重复]

    这个问题在这里已经有答案了 我在 Linux 终端中运行以下命令 谁能告诉我 Linux 终端中括号和以下命令的用途是什么 echo GET HTTP 1 0 echo 主机 www google com echo 数控 www googl
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 如何在 Linux 中重新添加 unicode 字节顺序标记?

    我有一个相当大的 SQL 文件 它以 FFFE 的字节顺序标记开头 我使用 unicode 感知的 linux 分割工具将此文件分割成 100 000 行块 但是当将这些传递回窗口时 它确实not与第一个部分以外的任何部分一样 只是它具有
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t

随机推荐

  • vue项目 后端传给base64格式图形验证码 ,前端进行解析,回显。

    我们在实际项目中时在登录的时候 时常会遇到图形验证码 来进行验证用户操作 什么是图形验证码 图形验证码是验证码的一种 有防止黑客对某一特定注册用户用程序暴力破解私人信息 恶意破解密码 刷论坛灌水的作用 票 图形验证码是一种区分用户是计算机还
  • SpringBoot底层原理

    SpringBoot底层原理 一 SpringBoot是什么 二 SpringBoot核心原理 三 springboot启动原理 一 SpringBoot是什么 想要了解springboot底层原理必须要先知道springboot是什么 作
  • 计算机视觉领域关注的会议和期刊

    原本为给师弟师妹总结的自己经验 节省计算机视觉领域大家看什么论文和去哪里看论文的困惑 一 会议论文 视觉的领域主要关注的三大顶会论文 CVPR ICCV ECCV 搜索途径 1 CVPR和ICCV都是IEEE库 可以在IEEE explor
  • QT中ui文件生成关联的C++类

    在VS2008中给对话框资源添加关联的C 类时 可通过右键菜单 添加类 直接添加关联的C 类 但QT中不支持这样的操作 在QT中在创建界面ui时 可手动也可自动创建ui文件关联的C 类 分别如下所示 一 自动创建ui文件和对应的C 类 项目
  • C语言开发网站

    在正式开发之前 先了解一下网站的原理 请求 处理 响应 在浏览器的network中可以看到浏览器和服务器的交互过程 请求一个网站的本质就是咱们的浏览器和服务器交互的一个过程 比如说咱们请求www baidu com 就是咱们的浏览器向服务器
  • lede 插件_路由器帮你签到!「LEDE/Openwrt系统“签到狗”插件使用教程」

    每日签到 废话不多说 用了才知道 图标 支持的站点 baidu 百度贴吧 百度文库v2ex V2EXhostloc hostloc comacfun A站bilibili B站163music 网易云音乐PCmiui 小米论坛52pojie
  • getline函数

    在我的印象中 getline函数经常出现在自己的视野里 模糊地记得它经常用来读取字符串 但是又对它的参数不是很了解 今天又用到了getline函数 现在来细细地总结一下 首先要明白设计getline函数的目的 其实很简单 就是从流中读取字符
  • 超强大JS表格:DataViewsJS 1.8.16.1407 Crack

    DataViewsJS完整的 JavaScript 数据呈现和数据网格平台 通过从各种不同的演示视图中进行选择 包括树 卡片 砖石 网格 时间线 甘特图 日历和网格 超越传统的表格显示 快速地 纯 JavaScript 针对速度进行了优化
  • ECMAScript 6规范总结(长文慎入)

    闲话 学习ES6的动机起于对其promise标准的好奇 它与jQuery源码中Deferred不同 而且在异步编程中加入了Generator 在后续ES7中更有Async 这勾起我强烈的兴趣了解ES6更多的内容 于是完整的学习了阮一峰老师的
  • Java Web实战开发基础:MVC模式

    Java Web的MVC模式 MVC是java web的基础 我写的java web实战开发专栏系列都是基于MVC 建议有需要的订阅我专栏的铁铁先提前看看这篇博文哦 简介 Java Web开发中 采用MVC Model View Contr
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 进程间同步(互斥量、信号量)

    进程间同步可以使用互斥量mutex 互斥锁 信号量和文件锁 进程间同步使用信号量 int sem init sem t sem int pshared unsigned int value 用于进程间同步此时第二个参数不能取0了 取非0值用
  • stm32中can通讯的基本概念

    身为一个电控组的成员 我们当接触一个新的概念的时候首先应该去了解他的硬件 其次再者是软件 而且在学习新的应用时 也应该清楚什么我们要着重了解 什么我们要清楚即可 以can为例 我们先从他的硬件说起 Can硬件一共有两种接法 但核心还是两根信
  • Tomcat服务器的HTTP首部长度最大值

    今天编写Cas5 OAuth2 0 实现password 授权功能时 Tomcat 提示如下信息 HTTP 头部长度超出默认长度 解决方法 配置文件路径 TOMCAT HOME conf server xml 修改如下 添加头部最大值 81
  • 1一个HTTP请求的网络脉络,解压爽文

    一个HTTP请求的网络脉络 解压爽文 1写前的话 2 网络请求概览 2 1 http 的产生 2 1 1什么叫做协议 2 1 2http定义 2 1 3 http诞生历史 怎么来的 时间迭代史 2 1 4浏览器的小插曲 2 2tcp ip协
  • 开发者入门必读:最值得看的十大机器学习公开课

    转 http www leiphone com news 201701 0milWCyQO4ZbBvuW html 导语 入门机器学习不知道从哪着手 看这篇就够了 在当下的机器学习热潮 人才匮乏十分显著 截至目前 国内开设人工智能 AI 专
  • R语言时间序列之ARMA、ARIMA模型

    基本理论知识 ARMA模型称为自回归移动平均模型 是时间序列里常用的模型之一 ARMA模型是对不含季节变动的平稳序列进行建模 它将序列值表示为过去值和过去扰动项的加权和 模型形式如下 yt c a1yt 1 a2yt 2 apyt p t
  • 【图像识别】基于卷积神经网络CNN和支持向量机SVM实现花卉图像识别附matlab代码...

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 针对传统图像分类算法在泛化能力等方面存在的不足 结合当前的深度学习算法 提出一种基于
  • 显示器尺寸对照表_怎样知道自己的电脑显示器是多少寸的

    展开全部 直接测量显示器e5a48de588b662616964757a686964616f31333366303731对角线即可 不包括边框 测量结果除以2 45得数就是显示器尺寸 显示器 display 通常也被称为监视器 显示器是属于
  • 20个基于DPDK开源项目,建议收藏

    一 ANS DPDK 原生加速网络堆栈 ANS 加速网络堆栈 是DPDK本地TCP IP堆栈 也参考FreeBSD实现 ANS提供了一个与Intel DPDK一起使用的用户空间TCP IP堆栈 文件结构 ans 加速网络堆栈过程 librt