大家好,欢迎来到IT知识分享网。
DPDK我们通过前面的文章,已经有些了解了,今天我们开始VPP的学习
VPP 平台是一个可扩展的框架,可提供开箱即用的生产质量交换机/路由器功能。它是思科矢量数据包处理 (VPP) 技术的开源版本:可在商用 CPU 上运行的高性能数据包处理堆栈。
VPP 实现的好处是其高性能、成熟的技术、模块化和灵活性以及丰富的功能集。
框架允许任何人“插入”新的图形节点,而无需更改核心/内核代码
模块化、灵活且可扩展
VPP 平台建立在“数据包处理图”之上。这种模块化方法意味着任何人都可以“插入”新的图形节点。这使得可扩展性相当简单,这意味着插件可以针对特定目的进行自定义。
插件如何发挥作用?在运行时,VPP 平台从 RX 环中获取所有可用的数据包,以形成数据包向量。数据包处理图逐个节点(包括插件)应用于整个数据包向量。图形节点很小且模块化。图形节点是松散耦合的。这使得引入新的图形节点变得容易。它还使得重新连接现有的图形节点变得相对容易。
VPP 平台可用于构建任何类型的数据包处理应用程序。它可以用作负载均衡器、防火墙、IDS 或主机堆栈的基础。还可以创建应用程序的组合。例如,您可以为交换机添加负载均衡。
在纯用户空间中运行。这意味着插件不需要更改核心代码 – 可以扩展数据包处理引擎的功能,而无需更改在内核级别运行的代码。通过创建插件,任何人都可以通过以下方式扩展功能:
新的自定义图形节点
图形节点的重新排列
新的低级 API
功能丰富
全套图形节点允许构建各种网络设备工作负载。在高级别上,该平台提供
路线、桥梁条目的快速查找表
任意 n 元组分类器
开箱即用的生产质量交换机/路由器功能
以下是 VPP 平台提供的功能摘要:
IPv4/IPv6
14+ MPPS, single core
Multimillion entry FIBs
Input Checks
Source RPF
TTL expiration
header checksum
L2 length < IP length
ARP resolution/snooping
ARP proxy
Thousands of VRFs
Controlled cross-VRF lookups
Multipath – ECMP and Unequal Cost
Multiple million Classifiers –
Arbitrary N-tuple
VLAN Support – Single/Double tag
IPv4
GRE, MPLS-GRE, NSH-GRE,
VXLAN
IPSEC
DHCP client/proxy
IPv6
Neighbor discovery
Router Advertisement
DHCPv6 Proxy
L2TPv3
Segment Routing
MAP/LW46 – IPv4aas
iOAM
MPLS
MPLS-o-Ethernet –
Deep label stacks supported
L2
VLAN Support
Single/ Double tag
L2 forwarding with EFP/BridgeDomain concepts
VTR – push/pop/Translate (1:1,1:2, 2:1,2:2)
Mac Learning – default limit of 50k addresses
Bridging – Split-horizon group support/EFP Filtering
Proxy Arp
Arp termination
IRB – BVI Support with RouterMac assignment
Flooding
Input ACLs
Interface cross-connect
为什么叫向量处理?
顾名思义,VPP 使用矢量处理而不是标量处理。标量数据包处理是指一次处理一个数据包。 这种较旧的传统方法需要处理中断,并遍历调用堆栈(a 调用 b 调用 c... 从嵌套调用返回返回...然后从中断返回)。 然后,该过程执行以下 3 件事之一:平移、丢弃或重写/转发数据包。
- 传统标量数据包处理的问题在于:
1、缓存中发生抖动:指令缓存(I-cache)抖动是指在缓存中出现高频率的缓存未命中情况,即指令缓存中的指令被频繁地替换和重新加载。这种情况发生在正在被 CPU 执行的指令工作集大于 I-cache 的容量时,导致缓存不断地被替换为新的指令。结果是,CPU 在等待从主存中获取指令时花费了大量的时间,从而导致整体性能下降。
冷启动未命中(Cold Start Miss): 当程序开始执行时,缓存是空的,因此第一次访问数据或指令时会导致未命中,需要从主存加载数据到缓存中。
冲突未命中(Conflict Miss): 当多个不同的数据块或指令映射到同一个缓存行时,如果这些数据块或指令同时被频繁地访问,就会导致缓存行的竞争,从而导致部分数据被频繁地替换和加载,造成未命中
2、each packet incurs an identical set of I-cache misses
3、no workaround to the above except to provide larger caches
- 相比之下,矢量处理一次处理多个数据包:
它解决了 I 缓存抖动问题。它还缓解了相关的读取延迟问题(预取消除了延迟)
这种方法解决了与堆栈深度/数据缓存(D-cache)未命中在堆栈地址上相关的问题。它改善了”电路时间”。在这里,“电路”指的是从设备的接收(RX)环中获取所有可用数据包,组成一个以RX顺序为基础的”帧”(向量),其中包含数据包索引,然后通过一系列的节点进行处理,最后回到RX环。随着数据包的处理不断进行,电路时间会根据所提供的负载达到稳定的平衡状态。
随着矢量大小的增加,每个数据包的处理成本会降低,因为将 I-cache 未命中数分摊到较大的 N 上。
示例用例:VPP 作为交换机/路由器
- 交换应用程序可以创建的一些功能包括:
桥接域:Bridge Domains
端口(包括隧道端口):Ports (including tunnel ports)
将端口连接到桥接域:Connect ports to bridge domains
程序 ARP 终止:Program ARP termination - 路由应用程序可以创建的一些功能包括:
虚拟路由和转发: Virtual Routing and Forwarding (VRF) tables (in the thousands)
路线:Routes (in the millions)
本地可编程性
一种方法是实现 VPP 应用程序,以与本地环境(Linux 主机或容器)中的外部应用程序进行通信。通信将通过低级别 API 进行。这种方法提供了一个完整、功能丰富的解决方案,简单但性能高。例如,可以合理地期望性能产量为 500k 路由/秒
此方法利用了使用共享内存/消息队列的优势。实现是在盒子或容器上的本地实现。所有 CLI 任务都可以通过 API 调用完成。
VPP 平台的当前实现为 C 客户端和 Java 客户端生成低级绑定。将来可能会为其他编程语言的绑定提供支持
远程可编程性
另一种方法是通过高级 API 使用数据平面管理代理。如图所示,数据平面管理代理可以通过低级别 API 与 VPP 应用(引擎)通信。这可以在机箱(或 VM 或容器)中本地运行。盒子(或容器)将通过某种形式的绑定公开更高级别的 API。
这是一种特别灵活的方法,因为 VPP 平台不会强制使用特定的数据平面管理代理。此外,VPP 平台不限制通信仅限于一个高级 API。任何人都可以携带数据平面管理代理。这允许将高级 API/数据平面管理代理和实现与 VPP 应用的特定需求相匹配。
示例数据平面管理代理
使用高高度 API 的一个示例是将 VPP 平台实现为运行本地 ODL 实例 (Honeycomb) 的机器上的应用程序。可以使用低级API来生成Java绑定与VPP应用程序通信,并通过netconf / restconf NB公开Yang Models。
这将是实现桥接域的一种方法
VPP的主要特征
- 与在内核中运行类似的数据包处理相比,改进了容错和 ISSU:
崩溃很少需要重新启动进程以上
软件更新不需要重新启动系统
开发环境比类似的内核代码更易于使用和执行调试
用户空间调试工具(GDB,Valgrind,Wireshark)
利用广泛可用的内核模块(UIO、igb_uio):DMA 安全内存 - 作为 Linux 用户空间进程运行
同一映像在 VM、Linux 容器或主机内核中工作
KVM 和 ESXi :通过 PCI 直接映射的网卡
Vhost-user, netmap, virtio paravirtualized NICs:Vhost-user:Vhost-user是一种用于虚拟化环境中的用户空间网络设备后端框架。它允许将虚拟机(VM)的 网络流量通过共享内存或套接字与主机的用户空间网络堆栈进行交互。这种方法可以提高网络性能并减少内 核交互,从而提高虚拟机的吞吐量。 Netmap:Netmap是一种高性能的网络数据包捕获和注入框架,用于在用户空间和内核空间之间高效地传递 网络数据包。Netmap可以有效地减少数据包处理的开销,并允许用户空间应用程序直接访问网络硬件,以提 高数据包处理性能。 Virtio Paravirtualized NICs:Virtio是一种虚拟化I/O设备的标准接口,用于在虚拟机(VM)和主机之间传输 数据。Virtio的"Paravirtualized NICs"是指一种基于半虚拟化的网络接口控制器,它允许虚拟机通过Virtio接口 与主机的网络堆栈进行通信。这种虚拟化方法可以提供更好的性能和效率,因为虚拟机可以直接与虚拟化主 机的网络设备进行交互,而不需要在内核中进行中间处理。
Tun/tap drivers:
Tun/tap驱动程序是一种用于虚拟化环境的网络设备驱动程序,用于创建虚拟网络接口。它们通常用于将网络 流量从用户空间应用程序传递到内核空间,并在虚拟机(VM)和主机之间建立网络连接。这种驱动程序的名 称源自"tun"(网络隧道)和"tap"(网络点对点)两个模式。 TUN(网络隧道)模式:在TUN模式下,Tun/tap驱动程序创建了一个虚拟网络接口,可用于将网络流量从用 户空间传递到内核空间。这允许用户空间应用程序发送和接收网络数据包,同时内核空间可以进行路由和处 理。 TAP(网络点对点)模式:在TAP模式下,Tun/tap驱动程序创建了一个虚拟网络接口,它在用户空间应用程 序和内核空间之间充当数据链路层设备。这种模式允许用户空间应用程序直接与虚拟机或主机的网络堆栈进行通信,就像是物理网络接口一样。 Tun/tap驱动程序常用于虚拟化环境中,用于构建虚拟网络和连接虚拟机。它们允许虚拟机通过虚拟网络接口 进行通信,同时也可以用于网络测试、VPN(虚拟专用网络)等应用场景。)
DPDK 轮询模式设备驱动程序:
DPDK(Data Plane Development Kit)的轮询模式设备驱动是一种用于高性能数据平面处理的网络设备驱动 程序。DPDK是一个开源项目,旨在提供一个优化的数据平面开发工具包,用于构建高性能、低延迟的数据 平面应用程序,如网络功能虚拟化(NFV)、数据包处理和流量分析等。 DPDK的轮询模式设备驱动允许应用程序直接与网络适配器进行通信,而不通过操作系统的网络协议栈。这 种模式称为“轮询模式”,因为应用程序定期轮询网络适配器以获取数据包并进行处理,而不需要等待操作系 统的中断或事件通知。这样可以显著降低处理数据包的延迟,并提供更高的吞吐量。 一些常见的DPDK轮询模式设备驱动包括: igb/ixgbe/i40e/virtio等驱动:用于处理Intel和virtio类型的网络适配器,这些适配器通常用于服务器和虚拟化环境。 mlx4/mlx5驱动:用于处理Mellanox InfiniBand和以太网适配器,支持高性能数据中心网络。 net_ring驱动:用于使用Linux内核net_ring框架的用户空间网络适配器。 af_packet驱动:在某些情况下,也可以使用Linux内核的AF_PACKET框架作为DPDK的轮询模式驱动。 这些轮询模式设备驱动允许开发人员利用硬件的高性能能力,通过绕过操作系统的网络协议栈来实现快速数 据包处理和转发。这对于需要处理大量数据包的应用程序非常有用,例如虚拟网络功能(VNF)、数据包捕 获和分析、防火墙、负载均衡等。
VPP 与 DPDK 集成,支持现有的 NIC 设备
- 性能预期
这种 VPP 实现的好处之一是它在相对低功耗的计算上的高性能。这种高水平的性能基于以下亮点:适用于商用硬件的高性能用户空间网络堆栈 主机、虚拟机、Linux 容器的代码相同 集成虚拟主机用户虚拟后台,实现高速虚拟机到虚拟机连接 L2 和 L3 功能,多种封装 利用同类最佳的开源驱动程序技术:DPDK 可通过使用插件进行扩展 通过基于标准的 API 实现控制平面/编排平面
- 性能指标
VPP 平台已被证明提供以下近似性能指标:来自单个x86_64内核的多个 MPPS 单个物理主机上的 >100Gbps 全双工 多核扩展基准示例(在 UCS-C240 M3 上,3.5 gHz,所有内存通道转发,简单 ipv4 转发): 1 核:9 MPPS 输入+输出 2 核:13.4 MPPS 输入+输出 4 核:20.0 MPPS 输入+输出
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/131441.html