一、前言
才开始接触到 DPDK,发现概念很多,很难以下理解,在这文章中记录下要害的内容,做到对 dpdk 的根本货色真正理解了。这样前面用它来写程序才可能顺利,不能赶进度啊,越赶进度反而可能越慢,慢慢来比拟快。本文次要是本人了解,参考很多文章,有哪里不了解的就查,做不到精湛,只理解含意。文章算是汇编,参考多篇文章,如有侵权,请告知,谢谢!
二、整体了解
历史:随着计算机核数的减少,网络带宽的减少,对主机进行网络包的解决性能要求越来越高,然而当初的操作系统对网络包解决的形式很低效。低效体现在:1)网络数据包来了之后通过中断模式进行告诉,而 cpu 解决中断的能力是肯定的,如果网络中有大量的小数据包,造成了网络的拥挤,cpu 解决不及时。【以前 cpu 的频率远高于网络设备,所以中断很无效】2)操作系统的协定栈是单核解决,没方法利用当初操作系统的多核。3)网络数据包从网卡到内核空间,再到用户空间,进行了屡次数据拷贝,性能比拟差。DPDK 全称 Data Plane Development Kit 专一于数据面的软件开发套件,是专为 Intel 的网络芯片开发,运行于 Linux 和 FreeBsd 上。DPDK 扭转了传统的网络数据包的解决形式,在用户空间间接解决,图示如下:
传统 VSDPDK 抓包形式
三、重要概念了解
这外面阐明 DPDK 文档外面的次要概念,另外如何将概念与理论的咱们本人的机器上参数对应起来。
3.1 PPS:包转发率
即 1s 能够发送多个 frame、在以太网外面为以太帧,咱们常说的接口带宽为 1Gbits/s、10Gbits/s 代表以太接口可能传输的最高速率,单位为(bit per second 位 / 秒)实际上,传输过程中,帧之间有间距(12 个字节),每个帧后面还有前导(7 个字节)、帧首界定符(1 个字节)。帧实践转发率 = BitRate/8 / (帧前导 + 帧间距 + 帧首界定符 + 报文长度)
以太帧传输中构造
依照 10Gbits/s(没记错的话是万兆光纤)来计算下 64 个字节下的包的转发率。
最短帧大小
101024102410241024/(12+7+1+64) 8 约等于 1000M10 /(12+7+1+64) *8 = 14.880952380952381 M/PPS(百万数据包)也就是 1s 能够发送 1 千 400 万个数据包。留神,这外面的 Data 长度是在 46-1500 个字节之间,所以最小的帧的长度为:6+6+2+46+4 = 64 个字节。线速:网卡或网络反对的最极限速度。汇总数据:
网卡的限速
arrival 为每个数据包之间的工夫距离。rte:runtime environment 即运行环境。eal:environment abstraction layer 即形象环境层。
DPDK 学习路线以及视频解说 +qun720209036 获取
**1.dpdk PCI 原理与 testpmd/l3fwd/skeletion
2.kni 数据流程
3.dpdk 实现 dns
4.dpdk 高性能网关实现
5. 半虚拟化 virtio/vhost 的减速
3.2 UIO:用户空间 IO
小的内核模块,用于将设施内存映射到用户空间,并且注册中断。uio_pci_generic 为 linux 内核模块,提供此性能,能够通过 modprobe uio_pci_generic 加载。然而其不反对虚构性能,DPDK,提供一个代替模块 igb_uio 模块,通过 sudo modprobe uio sudo insmod kmod/igb_uio.ko 命令加载。
3.3 VFIO
VFIO 是一个能够平安的把设施 IO、中断、DMA 等裸露到用户空间(usespace),从而在用户空间实现设施驱动的框架。用户空间间接拜访设施,虚构设施的调配能够取得更高的 IO 性能。参考(https://blog.csdn.net/wentyoo…)sudo modprobe vfio-pci 命令加载 vfio 驱动。1. 将两个 82599 以太网绑定到 VFIO ./tools/dpdk_nic_bind.py -b vfio-pci 03:00.0 03:00.1 3. 将 82599 ehter 绑定到 IGB_UIO ./tools/dpdk_nic_bind.py -b igb_uio 03:00.0 03:00.1 可参看:http://www.cnblogs.com/vancas… 进行配置 vfio 驱动模式。两者都是用户空间的网卡驱动模块,只是据说 UIO 依赖 IOMMU,VFIO 性能更好,更平安,不过必须零碎和 BSIO 反对 通过工具查看当初的绑定状况:
网卡的限速
阐明:以上 driv 谁阐明在应用的网卡驱动,前面 unused 为未应用能够兼容的网卡驱动。绑定命令:./dpdk-devbind.py –bind=ixgbe 01:00.0
绑定网卡和驱动
留神在 DPDK 的驱动状况下,用 ifconfig 是看不到网卡的。
3.5 PMD
PMD, Poll Mode Driver 即轮询驱动模式,DPDK 用这种轮询的模式替换中断模式
3.6 RSS
RSS(Receive Side Scaling)是一种可能在多处理器零碎下使接管报文在多个 CPU 之间高效散发的网卡驱动技术。
网卡对接管到的报文进行解析,获取 IP 地址、协定和端口五元组信息 网卡通过配置的 HASH 函数依据五元组信息计算出 HASH 值, 也能够依据二、三或四元组进行计算。取 HASH 值的低几位 (这个具体网卡可能不同) 作为 RETA(redirection table)的索引 依据 RETA 中存储的值散发到对应的 CPU DPDK 反对设置动态 hash 值和配置 RETA。不过 DPDK 中 RSS 是基于端口的,并依据端口的接管队列进行报文散发的。例如咱们在一个端口上配置了 3 个接管队列 (0,1,2) 并开启了 RSS,那么 中就是这样的:
{0,1,2,0,1,2,0………}
运行在不同 CPU 的应用程序就从不同的接管队列接管报文,这样就达到了报文散发的成果。在 DPDK 中通过设置 rte_eth_conf 中的 mq_mode 字段来开启 RSS 性能,rx_mode.mq_mode = ETH_MQ_RX_RSS。当 RSS 性能开启后,报文对应的 rte_pktmbuf 中就会存有 RSS 计算的 hash 值,能够通过 pktmbuf.hash.rss 来拜访。这个值能够间接用在后续报文处理过程中而不须要从新计算 hash 值,如疾速转发,标识报文流等。
3.7 对称 RSS
在网络应用中,如果同一个连贯的双向报文在开启 RSS 之后被散发到同一个 CPU 上解决,这种 RSS 就称为对称 RSS。DPDK 的 hash 算法没方法做到这一点,对咱们须要解析 http 报文,那么申请和拜访如果采纳一般的 rss 就造成了发送和返回报文无奈匹配的问题,如果 dpdk 要反对须要替换其 Hash 算法。
3.8 NUMA 架构
NUMA(Non-Uniform Memory Architecture 非一致性内存架构)零碎。特点是每个处理器都有本地内存、拜访本地的内存块,拜访其余处理器对应的内存须要通过总线,慢。
NUMA 架构
经典计算机架构
3.9 Hugepages 大页内存
操作系统中,内存调配是依照页为单位调配的,页面的大小个别为 4kB,如果页面大小固定内存越大,对应的页项越多,通过多级内存拜访越慢,TLB 形式拜访内存更快,然而 TLB 存储的页项不多,所以须要缩小页面的个数,那么就通过减少页面大小的方法,增大内存页大小到 2MB 或 1GB 等。DPDK 次要分为 2M 和 1G 两种页面,具体反对要靠 CPU,能够从 cpu 的 flags 外面看进去,举个例子:如果 flags 外面有 pse 标识,标识反对 2M 的大内存页面;如果有 pdge1gb 标识,阐明反对 1G 的大内存页。
cpu 的大页反对
查看内存大页信息
四 重要模块划分
以下为重要的内核模块划分。
重要模块划分