DPDK:v22.03.0原理浅析

内核配置

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

PROC_PAGE_MONITOR :进程内存页监控

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

VFIO

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

EAL

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

EAL初始化

CORE 组件架构

核心组件

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。

粘合PMD


Toeplitz 哈希

RSS 队列分配示例

 内核模块

kni

DPDK KNI应用程序的组件

 KNI中通过mbufs的数据流

其他

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 )

官方链接

官网icon-default.png?t=M3K6https://doc.dpdk.org/guides/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值