基于DPDK开源项目
基于DPDK开源项目
来源 https://zhuanlan.zhihu.com/p/406603919
一、ANS – DPDK 原生加速网络堆栈
ANS(加速网络堆栈)是DPDK本地TCP/IP堆栈,也参考FreeBSD实现。ANS提供了一个与Intel DPDK一起使用的用户空间TCP/IP堆栈。
- 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 和边缘计算机;
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。
例子
- dpdk http 服务器:http 服务器在 ANS tcp/ip 堆栈上运行。
- dpdk https 服务器:https 服务器在 ANS tcp/ip 堆栈上运行。
- dpdk-nginx,nginx 正在移植以在 ANS tcp/ip 堆栈上运行。
- dpdk-redis,redis 正在移植以在 ANS tcp/ip 堆栈上运行。
- dpdk-iperf,iperf 正在移植以在 ANS tcp/ip 堆栈上运行。
- dpdk-httpperf,wrk正在移植以在 ANS tcp/ip 堆栈上运行。
二、BESS – Berkeley可扩展软件交换机
BESS是一种可扩展的、高性能的软件交换机。BESS是第一个专门为支持网络功能虚拟化而设计的软件交换机,除了传统的虚拟网络任务。
BESS的四个关键组成部分:
- 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)中。
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 集群。
为实现高性能应用了多种技术:
- 内核旁路(用户空间实现)。
- 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:流量控制。
五、FastClick – 高速数据平面
FastClick - Click 模块化路由器的更快版本,具有批处理、高级多处理和改进的 Netmap 和 DPDK 支持 (ANCS'15)。检查 Metron 分支以了解 Metron 特性 (NSDI'18)。
六、F-Stack – 基于DPDK的通用网络框架
随着网络接口卡的快速发展,Linux内核处理数据包的性能不佳已经成为现代网络系统的瓶颈。 然而,互联网增长的日益增长的需求需要更高性能的网络处理解决方案。 内核旁路的出现引起了越来越多的关注。 有各种类似的技术,例如:DPDK、NETMAP 和 PF_RING。 内核旁路的主要思想是Linux只用于处理控制流; 所有数据流都在用户空间处理。 因此,内核旁路可以避免内核数据包复制、线程调度、系统调用和中断引起的性能瓶颈。 此外,内核旁路可以通过多重优化方法实现更高的性能。 在各种技术中,DPDK 已被广泛使用,因为它与内核调度和活跃的社区支持更彻底地隔离。
F-Stack是一个基于DPDK的开源高性能网络框架,具有以下特点:
- 网卡满载时可以达到的超高网络性能:1000万并发连接,500万RPS,100万CPS。
- 移植FreeBSD 11.01用户空间堆栈,提供完整的堆栈功能,并删减了大量无关功能。这大大提高了网络性能。
- 支持Nginx、Redis等成熟应用。服务可以轻松使用 F-Stack。
- 易于扩展的多进程架构。
- 提供微线程接口。各种有状态应用程序可以轻松使用 F-Stack 来获得高性能,而无需处理复杂的异步逻辑。
- 提供 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 社区在未来带来的改进。多亏了libplebnet和libuinet,这项工作变得容易多了。
随着各类应用的快速发展,为了帮助不同的APP快速便捷地使用F-Stack,F-Stack集成了Nginx、Redis等常用APP,以及微线程框架,并提供了标准的Epoll/队列接口。
目前,除了DNSPod的授权DNS服务器,腾讯云还有很多产品已经使用了F-Stack,比如HttpDNS(D+)、COS接入模块、CDN接入模块等。
七、Lagopus – 软件 OpenFlow 1.3 交换机
高性能软件 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 包装器。
用户可以为他们的实验编写自定义脚本。建议在脚本中使用硬编码的设置特定常量。脚本就是配置,为脚本编写一个复杂的配置界面是无关紧要的。或者,有一个简化(但功能较弱)的命令行界面可用于快速测试。
下图显示了架构以及如何处理多核支持。
执行从必须在用户脚本中定义的主任务开始。此任务在使用的 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 连接管理到应用程序接口。
- 将多个昂贵的系统调用转换为单个共享内存引用,
- 允许高效的流级事件聚合
- 为高 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 是一个灵活的平台,它可以支持一组质量和用例,例如:
- VNF 生命周期管理的通用机制,包括部署、实例化、配置、启动和停止、升级/降级和最终退役。
- 用于引导、指定和互连 VNF、VNFC 和 PNF 的一致机制;与物理网络基础设施、网络覆盖等无关,即虚拟链接。
- 动态实例化新的 VNF 实例或停用足够的 VNF 实例以满足当前性能、规模和网络带宽需求的通用机制。
- 检测 NFVI、VIM 和其他基础设施组件中的故障和故障并从这些故障中恢复的机制。
- 用于从/向物理网络功能向/从虚拟网络功能获取/接收流量的机制。
- NFVI 即服务,用于在同一基础架构上托管来自不同供应商的不同 VNF 实例
十一、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路由器
该项目的目的是提供一个免费的应用程序,能够:
- 使用 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++ 数据包解析框架
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 前端来呈现结果。
架构
系统由三部分组成:
- DPDK 延迟后端(用 C / 多线程编写):该软件测量所有 TCP 流的 SYN、SYN-ACK 和第一个 ACK TCP 数据包之间经过的时间。它在 ZMQ 套接字上发送测量信息(源 IP、目标 IP、延迟(以微秒为单位))。
- 分析(用 C / 多线程编写):该组件检索从 DPDK 后端接收的测量数据中所有 IP(使用IP2location.com数据库)的AS/地理标签信息,并生成基本统计信息。它在 ZMQ 套接字上推送 JSON 格式的信息。
- 前端:它是一个用 React 和 Deck.Gl 构建的 Node.js。它使用 http://socket.io 与浏览器通信。
组件之间的通信使用套接字(zmq 和 websockets)。高级架构如下所示。
十八、Seastar – 开源 C++ 框架
Seastar 是一种先进的开源 C++ 框架,用于现代硬件上的高性能服务器应用程序。Seastar 用于Scylla,这是一种与 Apache Cassandra 兼容的高性能 NoSQL 数据库。使用Seastar 的应用程序可以在Linux 或OSv上运行。
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工程师手册:
golang资料补给包:
dpdk视频教程推荐
=============== End