协议栈的使用流程(dpdk的用户态协议栈)
协议栈的使用流程(dpdk的用户态协议栈)在上图中,核心库Core Libs提供系统抽象、大页内存、缓存池、定时器及无锁环等基础组件。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)5) 软件调优:cache行对齐,预取数据,多元数据批量操作2) 用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化3) 亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中4) 降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
dpdk介绍dpdk是 intel 公司发布的一款数据包转发处理套件. 它运行于linux userspace。这组套件包括了Linux 进程所需要的大部分组件。
但缺少一个传统的tcp/ip 协议栈。其他应用程序没办法方便地通过dpdk对外通信。本文主要介绍如果移植一个TCP/IP协议栈到dpdk。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
DPDK特点DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
1) 轮询:在包处理时避免中断上下文切换的开销,
2) 用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化
3) 亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中
4) 降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
5) 软件调优:cache行对齐,预取数据,多元数据批量操作
2、DPDK框架在上图中,核心库Core Libs提供系统抽象、大页内存、缓存池、定时器及无锁环等基础组件。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
PMD库,提供全用户态驱动,以便通过轮询和线程绑定得到极高网络吞吐,支持各种本地和虚拟网卡。
Classify库,支持精确匹配,最长匹配和通配符匹配,提供常用包处理的查表操作。
Qos库,提供网络服务质量相关组件,限速和调度。
Mellanox DPDK中保留了Linux内核态驱动,框图如下:
Mellanox DPDK在用户空间使用PMD驱动,与网卡之间有两条路径,控制路径使用user verbs,经过内核,用于对象的创建、初始化、修改、查询和释放。数据路径之间访问网卡,进行数据的收发。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
Mellanox DPDK与传统的Linux内核态驱动可以共存,当前未被DPDK使用的端口可以通过Linux网络协议栈进行报文收发。
Hugepage配置 总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
DPDK中,如果有多个核可能需要同时访问一个网卡,那DPDK中会为每个核准备一个单独的接收队列/发送队列,这样避免了竞争,也避免了cache一致性问题。
一般的常规页大小为4K字节,使用大页时页大小设置为2M或1G字节。修改方式如下:
Bashrc文件内添加:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
非NUMA系统
Echo 1024> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
预留了1024个2M大页,即2GB内存。
总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
NUMA系统
Echo 1024>/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
Echo 1024>/sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
上述命令为每个节点各预留了1024个2M大页,即4GB内存。
/etc/fstab内添加总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
挂载2M大页:Nodev /mnt/huge hugetlbfs defaults 0 0
挂载1G大页:Nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0
多线程配置@Configuration
@EnableAsync
public class AsyncTaskConfig implements AsyncConfigurer {
@Override
@Bean
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor=new ThreadPoolTaskExecutor();
//设置线程数
threadPoolTaskExecutor.setCorePoolSize(10);
//最大线程数
threadPoolTaskExecutor.setMaxPoolSize(50);
//保持活跃的秒数
threadPoolTaskExecutor.setKeepAliveSeconds(5);
//等待队列容量,线程数不够会等待
threadPoolTaskExecutor.setQueueCapacity(100);
//初始化
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
@Override
@Bean
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
转发模型
DPDK转发框架分为run tocompletion模型和pipeline模型,对比图如下:
总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
DPDK run to completion模型中每个报文的生命周期只能在一个线程中出现,每个物理核都负责处理整个报文的生命周期从RX到TX。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
内存管理DPDK将内存封装在Mbuf结构体内,Mbuf主要用来封装网络帧缓存,所有的应用使用Mbuf结构来传输网络帧。对网络帧封装和处理时,将网络帧元数据和帧本身存放在固定大小的同一段缓存中,网络帧元数据的一部分内容由DPDK的网卡驱动写入,结构如下图:
总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
上图中,head room用来存储和系统中其他实体交互的信息,如控制信息、帧内容、事件等。Head room长度由RTE_PKTMBUF_HEADROOM定义,默认为128.
Rte_mbuf结构对象存放在内存池中,内存池使用环形缓存区来保存空闲对象,逻辑结构如下图所示:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
多队列配置DPDK中,通过将网卡的某个接收队列分配给某个核,从该队列中收到的所有报文都应当在该指定的核上处理结束,不同的核操作不同的队列。
目前可以通过RSS(接收方扩展)把数据包分配到不同的队列中,该机制根据关键字通过哈希函数计算出哈希值,再有哈希值确定队列。不同的数据包类型具有不同的关键字,例如IPv4 UDP四元组(源IP地址、目的IP地址、源端口号、目的端口号)。
另一种是Flow Director技术,根据包的字段精确匹配,查找Flow Director表项,将其分配到某个特定队列。
DPDK中可以采用RSS来负载均衡,将报文发到多个核上,同时使用Flow Director将控制报文分配到指定的队列上,使用单独的核来处理,如下图所示;
总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
硬件加速功能VLAN Tag的插入和剥离由网卡硬件完成。
1)收包时VLAN tag过滤,网卡硬件端口设计了VLAN过滤表,无法在过滤表中匹配的VLAN包会被丢弃。
2)收包时VLAN tag剥离,网卡硬件会在硬件描述符中设置两个域,将需要的信息通知驱动软件,包含此包是否曾被剥离了VLAN tag以及被剥离的tag。
3)发包时VLAN tag插入,TPID值固定,可通过寄存器进行设置,TCL进行逐包设置。
TCP分片功能由硬件提供,将现有较大的TCP分片拆分为较小的TCP分片,仅需要复制TCP的包头,更新头里面的长度相关信息,重新计算校验和。
总结送免费学习资料(包含视频、技术学习路线图谱、文档等)
总结;RSC组包功能针对TCP数据包,由硬件将拆分的TCP分片聚合成一个大的分片,从而减轻软件的处理。
更多学习资料(包含视频、技术学习路线图谱、文档等)
技术点包含了C/C ,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等方面。
后台私信《资料》免费领取