igb_uio 是 dpdk 内部实现的将网卡映射到用户态的内核模块,它是 uio 模块的一个实例。 uio_info 结构体,uio 驱动自身不会实例化 uio_info 结构体,它只提供一个框架,可以在其它模块中调用 uio_register_device 来实例化 uio_info 结构体,在 dpdk dpdk 与 uio 设备文件的交互过程 dpdk 通过访问 uio 设备文件来完成物理网卡内核态的中断交互过程,阻塞式读取、epoll uio 文件来监听是否有中断事件,当中断到来后,read、epoll write 过程图示 dpdk 程序在初始化网卡时会写入网卡接口对应的 uio 文件来使能中断,当中断使能后,一旦有中断到来,uio_interrupt 中断回调会被执行。 dpdk 程序中监听中断事件的过程 dpdk 单独创建了一个中断线程负责监听并处理中断事件,其主要过程如下: 创建 epoll_event 遍历中断源列表,添加每一个需要监听的 uio 设备事件的 uio
一、DPDK简介 本节首先介绍DPDK出现的行业背景,然后介绍DPDK概述、DPDK关键技术、DPDK开源代码,最后介绍DPDK Lib库。 2013年4月,6wind联合其他开发者成立www.dpdk.org的开源社区,DPDK开始走上开源的大道。 1.2 DPDK概述 什么是DPDK? 2.1 DPDK盒子介绍 简单来说,DPDK盒子是一个定制的、Mini的硬件盒子,预装Linux系统和DPDK软件,通过该盒子,使用者可以学习如何使用DPDK,也可以方便的开发基于DPDK的应用。 2.2 DPDK盒子使用指导 第一代DPDK盒子连接方法 第一代盒子的使用方法可参考第二代盒子。 第二代DPDK盒子连接方法 1. 通过USB2控制线连接电脑和DPDK盒子。 2. DPDK盒子功能介绍 DPDK盒子第一个用处就是作为学习DPDK的平台,对于刚刚接触DPDK的初学者,该平台主要的好处是提供了一个“已知”系统:可预测网络界面设置;可预测资源用性;出错范围有限;应用程序以标准方式运行
Kubernetes优秀的架构设计,借助multus cni + intel userspace cni 可以屏蔽了DPDK底层的复杂,让KubeVirt 支持DPDK变得比较容易。 因为 e2e验证 等原因,KubeVirt社区至今未加入对DPDK支持,本篇试着在最新版的KubeVirt v0.53加入DPDK功能。 关键是对DPDK功能的验证,今后再开一篇补上验证相关的内容。 由于旧模式 DPDK VHostuser 被弃用,KubeVirt仅实现了DPDK VHostUserClient模式。 userspace CNI 借助 multus CNI增加一个额外的DPDK网络,在 OVS-DPDK 和 kubevirt (Qemu) 间共享 vhostuser socket。
本篇用的DPDK版本是较老的版本DPDK 18.05,在centos7 3.10.0-1160.el7.x86_64内核下编译,最新的版本是DPDK 22.07,从DPDK 20.11 开始 不再支持 准备工作 DPDK是C语言写的,编译需要gcc,DPDK自带很多工具脚本,会调用到其他命令行工具 numactl numactl-devel pciutils net-tools。 安装包 [root@backendcloud-centos7 ~]# wget http://fast.dpdk.org/rel/dpdk-18.05.1.tar.gz [root@backendcloud-centos7 ~]# tar -zxvf dpdk-18.05.1.tar.gz DPDK编译和DPDK环境配置 [root@backendcloud-centos7 ~]# cd dpdk-stable-18.05.1 解绑DPDK网卡 [30] Unbind devices from IGB UIO or VFIO driver Option: 30 Network devices using DPDK-compatible
经很多前辈先驱的研究,目前业内已经出现了很多优秀的集成了上述技术方案的高性能网络数据处理框架,如 6wind、windriver、netmap、dpdk 等,其中,Intel 的 dpdk 在众多方案脱颖而出 在内核看来,dpdk 就是一个普通的用户态进程,它的编译、连接和加载方式和普通程序没有什么两样。 dpdk 的突破 相对传统的基于内核的网络数据处理,dpdk 对从内核层到用户层的网络数据流程进行了重大突破,我们先看看传统的数据流程和 dpdk 中的网络流程有什么不同。 多核调度框架 dpdk 基于多核架构,一般会有主从核之分,主核负责完成各个模块的初始化,从核负责具体的业务处理。 除了上述之外,dpdk 还有很多的技术突破,可以用下面这张图来概之。 dpdk 的应用 dpdk 作为优秀的用户空间高性能数据包加速套件,现在已经作为一个“胶水”模块被用在多个网络数据处理方案中,用来提高性能。如下是众多的应用。 ?
要使用 ovs-dpdk,需要在node上构建 DPDK 并使用相应的 DPDK flag重新构建 ovs。 OVS-DPDK需要大页内存作为资源。 由于 DPDK 会剥夺系统对 nic 的控制权,我们需要一个 ovs-dpdk 专用的 nic 来传输容器网络,另一个 nic 用于普通主机网络。 此外,Multus 允许为Pod提供 OVS-DPDK 网络。这是同一个 OVS 实例,但是 DPDK port位于另一个支持 DPDK 的bridge上。 dpdk-17.08.1.tar.xz dpdk-stable-17.08.1 [root@backendcloud-fedora27 ~]# cd dpdk- -bash: cd: dpdk-: dpdk-stable-17.08.1]# export DPDK_DIR=`pwd`/build [root@backendcloud-fedora27 dpdk-stable-17.08.1]#
本文主要通过介绍简单的Intel DPDK基础来帮助广大朋友入门DPDK和自我总结交流,如下提供在Linux PC 基础上安装Intel DPDK,仅供大家学习参考==欢迎关注公众号:通信行业搬砖工== 1、下载Intel DPDK 以公版的为例下载链接地址:http://core.dpdk.org/download/2、解压下载的软件包 dpdk-20.11.tar.xzlinux command:tar xvf dpdk-20.11.tar.xz3、进入软件包目录 即可阅读Intel DPDK软件包源代码==下面介绍编译安装软件包过程:1、前期开发环境准备,在linux上交叉编译内核工具链相关选项,以 PCIexpress地址8、将端口的PCIexpress 地址和DPDK 网口绑定三、运行Intel DPDK 软件实例后续文章再着重介绍如何在Linux 环境上编译Intel DPDK 实例和开发Intel DPDK 的application
年代作为一个通用操作系统实现的,想要支持现代的高速网络,必须要做优化. dog250 把linux协议栈重新"分层", 指出了其中的"门", 即那些会严重影响性能的门槛 [image] 目前有两个比较火的方案:DPDK DPDK DPDK由intel支持,DPDK的加速方案原理是完全绕开内核实现的协议栈,把数据包直接从网卡拉到用户态,依靠Intel自身处理器的一些专门优化,来高速处理数据包。 DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。 Linux内核将DPDK应用程序看作是一个普通的用户态进程,包括它的编译、连接和加载方式和普通程序没有什么两样。DPDK程序启动后只能有一个主线程,然后创建一些子线程并绑定到指定CPU核心上运行。 [image] [image] 相对于DPDK,XDP具有以下优点 无需第三方代码库和许可 同时支持轮询式和中断式网络 无需分配大页 无需专用的CPU 无需定义新的安全网络模型 XDP的使用场景包括 DDoS
virtio-user 是 DPDK 针对特定场景提出的一种解决方案,它主要有两种场景的用途,一种是用于 DPDK 应用容器对 virtio 的支持,这是 DPDK v16.07 开始支持的;另一种是用于和内核通信 ,这是 DPDK v17.02 推出的。 因为 DPDK 容器与宿主机的通信只用得到虚拟内存中的大页内存部分,其他都是用不到的,全部共享也没有任何意义,DPDK 主要基于大页内存来收发数据包的。 我们知道,DPDK 是旁路内核的转包方案,这也是它高性能的原因,但有些时候从 DPDK 收到的包(如控制报文)需要丢到内核网络协议栈去做进一步的处理,这个路径在 DPDK 中就被称为 exception 这些方案就不做过多介绍了,感兴趣的可看 DPDK 官网,上面都有介绍。 ?
——戈登·摩尔,英特尔公司创始人之一 本文主要介绍了我在阅读《深入浅出DPDK》,《DPDK应用基础》这两本书中所划下的知识点 首先《深入浅出DPDK》这本书是intel的专家写的,而且《DPDK 基础,第二部分介绍DPDK虚拟化,第三部分介绍DPDK的应用,理论知识偏多 《DPDK应用基础》虽然与《深入浅出DPDK》篇幅差不多,但阅读用的时间却是《深入浅出DPDK》的一半,这里没有踩一捧一的意思 ,只是做个对比,《深入浅出DPDK》的理论介绍要比《DPDK应用基础》多,不过这本书有很多地方都是从源码上介绍DPDK的原理,由于本人不是C开发,所以代码上有不明白的地方就快速翻过去了,书中还涉及到针对 DPDK的测试方法,测试了不同变量之间的性能差异,这本书比较适合有c开发基础的dpdk工程师以及一些dpdk性能测试人员阅读。 硬件结构对DPDK性能的影响 硬件规格对DPDK性能的影响体现在几个方面。 CPU频率:CPU频率越高,DPDK性能越高。
大纲: 一、 网络IO的处境和趋势 二、 Linux + x86网络IO瓶颈 三、 DPDK的基本原理 四、 DPDK的基石UIO 五、 DPDK核心优化:PMD 六、 DPDK的高性能代码实现 DPDK支持的CPU体系架构:x86、ARM、PowerPC(PPC) DPDK支持的网卡列表:https://core.dpdk.org/supported/,我们主流使用Intel 82599(光口 所以,DPDK推出Interrupt DPDK模式。 Interrupt DPDK: 它的原理和NAPI很像,就是没包可处理时进入睡眠,改为中断通知。 七、DPDK生态 对我们互联网后台开发来说DPDK框架本身提供的能力还是比较裸的,比如要使用DPDK就必须实现ARP、IP层这些基础功能,有一定上手难度。 不建议直接使用DPDK。
当使用DPDK脚本dpdk-devbind来bind网卡时,会通过sysfs与内核交互,让内核使用指定驱动来匹配网卡。 DPDK的应用层代码,会打开uioX设备。在函数pci_uio_alloc_resource中, ? 图5. 使用信号异步通知async_queue队列中的进程;目前DPDK没有使用异步IO的方式,所有对于DPDK的PMD来说,只有前两个语句有用。 当DPDK的app启动时,会进行EAL初始化,如下图: ? 图12. 应用层uio初始化 在pci_uio_alloc_resource中,主要是打开dpdk要管理的uio设备 ? 图13. 打开ui设备 同时,DPDK还需要把PCI设备的BAR映射到应用层。
DPDK工作流程 上图中的左边是传统的数据包处理过程,右边是DPDK数据包处理的过程。 DPDK会通过命令来知道哪些ports会被vfio_pci,igb_uio或者uio_pci_generic驱动管理。这些驱动在用户态直接和网卡设备交互,这样网卡设备就可以直接和DPDK进行交互。 # ls /sys/bus/pci/drivers/mlx4_core bind module new_id remove_id uevent unbind DPDK需要配置大页,DPDK处理包需要申请内存 DPDK收发数据包的逻辑 到达的数据包会被放到ring buffer中,上层的app周期性检查buffer中的新的数据包 如果ring buffer中有新的数据包描述符,上层app会在DPDK内存池中分配数据包的缓冲区 如果ring buffer中没有任何数据包,上层app会网卡设备排队到DPDK,再次触发Ring DPDK 高性能数据结构支撑 EAL: Environment Abstraction EAL是DPDK
当使用DPDK脚本dpdk-devbind来bind网卡时,会通过sysfs与内核交互,让内核使用指定驱动来匹配网卡。 DPDK的应用层代码,会打开uioX设备。 使用信号异步通知async_queue队列中的进程;目前DPDK没有使用异步IO的方式,所有对于DPDK的PMD来说,只有前两个语句有用。 当DPDK的app启动时,会进行EAL初始化,如下图: alloc_uio_resource.jpg 在pci_uio_alloc_resource中,主要是打开dpdk要管理的uio设备 image.png 同时,DPDK还需要把PCI设备的BAR映射到应用层。
DPDK是一个优秀的收发包kit,但它本身并不提供用户态协议栈,因此由将数据报文注入内核协议栈的需求,也就是KNI(Kernel NIC Interface)。 借用DPDK文档的一个KNI的结构图。 image.png 毫无疑问,KNI必然要也需要内核模块的支持,即rte_kni.ko。 以上,是KNI在内核部分的实现,下面看看DPDK应用层如何使用KNI接口。 DPDK提供了两个API rte_kni_rx_burst和rte_kni_tx_burst,用于从KNI接收报文和向KNI发送报文。 至此,DPDK的KNI原理分析完毕。
1)分配sk_buff内存给每个数据包,并在数据包传送到用户态时释放内存。这个过程需要消耗大量的总线cycle(从CPU传输数据到内存);
DPDK是在判断空置率小于一定值后才触发重填来完成这个操作的。发送包时,就不能采用类似的方法。因为只有及时地更新尾寄存器,才会通知网卡进行发包。 所以,DPDK在Mempool中分配buffer的时候,会要求对齐到Cache Line大小。 4、软件调优 1、dpdk的轮询模式收包 DPDK纯轮询模式是指收发包完全不使用中断处理的高吞吐率的方式;物理端口上的每一个收包队列,都会有一个对应的由收包描述符组成的软件队列来进行硬件和软件的交互,以达到收包的目的 每一个收包队列,DPDK都会有一个对应的软件线程负责轮询里面的收包描述符的收包成功的标志。 每一个发包队列,DPDK都会有一个对应的软件线程负责设置需要发送出去的包,DPDK的驱动程序负责提取发包缓冲内存块的有效信息,例如包长、地址、校验和信息、VLAN配置信息等。
在dpdk官网测试用例76.3。从代码上分析x710网卡是支持的。 下图命令在test_pmd使能port0的对称哈希功能。 sendp([Ether(dst="90:e2:ba:36:99:3c")/IP(src="192.168.0.5", dst="192.168.0.4")], iface="eth3") 具体的代码在dpdk /app/test-pmd/cmdline.c文件中如下: 其中新增了一个 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ类型的hash函数,在dpdk19.5中还不支持 ; ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_HASH); if (ret < 0) { DPDK_ERROR ; ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_HASH); if (ret < 0) { DPDK_ERROR
解决方案 修改 dpdk-2.1.0/x86_64-native-linuxapp-gcc/include/rte_ether.h: #define ETHER_MAX_LEN 1522 重新编译DPDK ,Pktgen,重新加载DPDK驱动 资料 DPDK2.1.0: http://dpdk.org/browse/dpdk/snapshot/dpdk-2.1.0.tar.gz Pktgen2.9.5: http://dpdk.org/browse/apps/pktgen-dpdk/snapshot/pktgen-dpdk-pktgen-2.9.5.tar.gz
一、Dpdk简介 Dpdk是X86平台报文快速处理的库和驱动的集合,不是网络协议栈,不提供二层,三层转发功能,不具备防火墙ACL功能,但通过DPDK可以轻松的开发出上述功能。 /browse/dpdk/snapshot/dpdk-16.04.tar.gz Step2:清理环境,因为Ovs+Dpdk,需要Ovs在编译时link到Dpdk的lib库,所以如果环境原来已经安装有Ovs Step4:将网口绑定为Dpdk设备 在/Dpdk/tools目录下,有一个网口绑定工具,使用这个工具可以将eth设备绑定为Dpdk设备(绑定的目的是修改网口的驱动) dpdk_nic_bind.py 图3.3是使用Dpdk和不使用Dpdk网络性能对比情况,明显可以看出,使用Dpdk以后,网络性能有了显著提高,特别是TCP_CRR这种应用,性能提高了10倍以上。 ? 图4.1是思科提供给的一些测试数据,随着routes增加Vpp+Dpdk能做到性能不下降,而Ovs+Dpdk性能会出现急剧下降。 ?