原理分析
内核配置
需要用户态的glibc库,内核的
HUGETLBFS:提高性能,大页放到tlb更少机会失效,因为数量少。大内存页也可以挂到文件系统使用。
PROC_PAGE_MONITOR :进程内存页监控
HPET 和HPET_MMAP:开启高精度定时器,并允许映射到用户空间
VFIO
依赖IOMMU的保护,大内存页的映射。如果没有IOMMU,就需要uio,uio不安全并且需要root权限。
EAL
环境抽象层:dpdk加载和运行,支持多进程多线程,core亲和性程序,系统内存分配释放,原子和锁的操作,时间参考,pci总线访问,跟踪和debug方法,cpu特征鉴定,中断处理,报警操作,malloc内存管理。
核心组件![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6d257932a96b004e0bb402c55d1e1ff9.png)
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 )