dpdk22.03.0原理分析

原理分析

内核配置

需要用户态的glibc库,内核的
HUGETLBFS:提高性能,大页放到tlb更少机会失效,因为数量少。大内存页也可以挂到文件系统使用。

PROC_PAGE_MONITOR :进程内存页监控

HPET 和HPET_MMAP:开启高精度定时器,并允许映射到用户空间

VFIO

依赖IOMMU的保护,大内存页的映射。如果没有IOMMU,就需要uio,uio不安全并且需要root权限。

EAL

环境抽象层:dpdk加载和运行,支持多进程多线程,core亲和性程序,系统内存分配释放,原子和锁的操作,时间参考,pci总线访问,跟踪和debug方法,cpu特征鉴定,中断处理,报警操作,malloc内存管理。
在这里插入图片描述

核心组件在这里插入图片描述

lib库

tracepoint:跟踪库
rcu:无锁数据结构库
ring:环形缓存队列,无锁实现
stack:堆栈库,基于锁和无锁实现,无锁需要防止ABA问题,增加一个计数器可解决
mempool:内存池库,固定大小对象的分配器,由名称标识。
mbuf:分配和释放缓冲区。可以用来做协议栈的缓冲区。mbuf使用的是内存池中的内存。

ethdev:网卡设备,包括PMDS轮询模式驱动和pipline管道模式;
通用流API,过滤转发,类似netfilter;
DPDK 应用程序中的交换机表示;
服务质量 (QoS) 流量计量和监管 (MTR) 的通用 API;
流量管理接口,包括分层调度、流量整形、拥塞管理、数据包标记;
无线设备基带库;

cryptodev :加密设备库,用于管理和预配硬件和软件加密轮询模式的驱动程序,定义支持
许多不同加密操作的通用 API。

compressdev:压缩设备库,提供了一组通用的 API 来执行压缩服务,以及查询和配置物理
(硬件)和虚拟(软件)压缩设备以执行这些服务

regexdev:正则表达式设备库,提供了一个正则表达式设备框架,用于管理和预配硬件和软
件正则表达式轮询模式驱动程序,定义了支持许多不同正则表达式操作的通用 API。

dmadev:DMA 设备库,同时支持物理(硬件)和虚拟(软件)DMA 设备
gpudev:通用图形处理单元库
security:安全库,支持IPsec、PDCP和DOCSIS协议及相关操作

rawdev:原始设备库,DPDK目前具有以太网(lib_ether),cryptodev(libcryptodev),
eventdev(libeventdev)和vdev(虚拟设备)支持。

timer:计时器库,高精度事件计时器 (HPET) 或 CPU 时间戳计数器 (TSC)

hash:哈希库
Toeplitz 哈希库

efd:弹性流分配器库,使用完美的哈希来确定给定传入流密钥的目标/值。提高性能。
member:成员库,布隆过滤器或基于哈希表的集合摘要 (HTSS)
lpm:32位最长前缀匹配库,通常用于在 IP 转发应用程序中查找最佳路由匹配。
lpm6:128 位密钥实现最长前缀匹配

fib:FIB(Forwarding information base) 库提供对 32 位密钥或 128 位 IPv6 密钥的最长前缀
匹配 (LPM) 快速搜索。它可以用于各种应用程序,其中最典型的是IPv4 / IPv6转
发。

rib:路由信息库 (RIB) 库为路由信息提供数据存储

Flow_Classify:流分类库,该库提供了通过将输入数据包与一组流规则进行匹配来对输入数
据包进行分类的功能。

distributor:数据包分发器库,用于流量的动态负载平衡,同时支持一次操作单个数据包。
reorder:重新排序库,提供了一种基于序列号对 mbuf 重新排序的机制。
ip_frag:IP 碎片和重组库,实现了 IPv4 和 IPv6 数据包碎片和重组。
gro:通用接收卸载库,将小数据包重新组合成较大的数据包
gso:通用分段卸载 (GSO) 是 TCP 分段卸载 (TSO) 的广泛使用的软件实现
pcapng: 数据包捕获下一代库
pdump:数据包捕获库
eal/common:多进程支持
kni:内核网卡接口,允许用户空间应用程序访问 Linux控制平面,取代Linux TUN/TAP

eventdev:事件设备库,事件驱动;
事件eth_rx/eth_tx 适配器库,应用程序轮询事件设备端口以接收引用数据包的事
件,而不是轮询 ethdev 端口的 rx /tx队列;
事件定时器适配器库;
事件加密适配器库,软件和硬件两种形式实现;

sched:调度,服务质量。
power:电源管理,允许用户通过动态调整 CPU 频率或进入不同的C-state来节省能源
acl:数据包分类和访问控制
pipeline:数据包框架,流水线功能
vhost:用户空间virtio网络服务器,允许用户直接操作virtio环
metrics:指标库,生产者可以发布数值信息供消费者以后查询,采样,延迟统计
telemetry:遥测库提供了一个接口,用于从各种 DPDK 库中检索信息。
bpf:提供了在用户空间 dpdk 应用程序中加载和执行eBPF字节码的能力。
ipsec:ip层的加密套件,专注于数据路径协议处理(ESP和AH)
graph:图形库和内置节点

drivers

net/bonding:链路绑定轮询模式驱动程序库,允许将物理 PMD 绑定在一起以创建单个逻辑 PMD。
在这里插入图片描述

Toeplitz 哈希

RSS 队列分配示例
在这里插入图片描述

内核模块

kni

在这里插入图片描述
在这里插入图片描述

其他

isolcpus:隔离cpu

两种运行模式:run to completion和pipeline

malloc

malloc 库中的 malloc 堆和 malloc 元素的示例
在这里插入图片描述

内存池

内存中的内存池及其关联环
在这里插入图片描述

mbuf

具有一个段的 mbuf
在这里插入图片描述
具有三个段的 mbuf
在这里插入图片描述

flow 异步操作

在这里插入图片描述

在这里插入图片描述

walk-through

在这里插入图片描述

Flow Bifurcation

在这里插入图片描述

容器网络Virtio_user

在容器内运行DPDK的模型
在这里插入图片描述
通过 virtio-user 加速容器网络的概述
在这里插入图片描述
使用 virtio-user 作为异常路径的应用程序概述
在这里插入图片描述

图形库编程模型

在这里插入图片描述
图形对象内存布局
在这里插入图片描述

dma模型

在这里插入图片描述

基于流表的方案

在这里插入图片描述

gso

两部分 GSO 输出段在这里插入图片描述
三部分 GSO 输出段
在这里插入图片描述

内存共享

多进程示例应用程序中的内存共享
在这里插入图片描述

qos

支持 QoS 的复杂数据包处理管道
在这里插入图片描述
滴管的高级框图
在这里插入图片描述

性能优化

1.不要使用libc
2.对同一内存区域的并发访问:使用RTE_PER_LCORE变量,使用结构表(每个 lcore 一个)。在这种情况下,每个结构都必须与缓存对齐。
3.numa最好访问本地内存
4. 跨内存通道的分布,现代内存控制器具有多个内存通道,可以并行加载或存储数据。注意内存池的优化。
5. 锁定内存页mlockall
6. lcore 之间的通信使用ring的api无锁实现
7. pmd轮询模式驱动
8. 吞吐量和延迟之间的权衡
9. 锁的粒度,原子操作,内存屏障
10. 内联
11. likely/unlikely分支预测函数
12. 通过RTE_MACHINE选项设置目标 CPU 类型,dpdk支持特定于 CPU 微体系结构的优化
13. 链接时间优化,编译器lto优化(链接时优化-flto,fat-lto )

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值