DPDK总结一下

### Reference(文中用到的引用)


1.http://core.dpdk.org/doc/
2.https://wenku.baidu.com/view/5d24e12253ea551810a6f524ccbff121dd36c536.html




### DPDK概述


DPDK是intel的网络开发套件,是intel网卡及其他网卡的user mode驱动,可以用来开发user mode的网络APP,使用BSD-3的License。


目前使用DPDK的项目包括SPDK、OVS、NGINX、PKTGEN等。




### DPDK基本思想


DPDK定位在user mode网卡驱动套件,为了完成这个任务,包含了几个功能模块(基础+虚拟化):
  - 使用hugepage/numa/cache等方式加速计算(用于类似查找的功能);
  - 使用RTC模型的报文转发框架;
  - 基于PCIe模型的物理网卡驱动;
  - PMD的收包模式;
  - 提供基于rte_flow的流分类与多队列;
  - 硬件offload功能;
  - IO虚拟化(SRIOV、eSwitch);
  - 半虚拟化Virtio;
  - 优化virtio的vhostuser;




### 加速计算


DPDK实质是CPU代替网卡处理数据包,对于通用CPU来说,要达到专用网卡的速度,就要做一些优化。


1. 并行计算模型


并行计算效率肯定高于串行计算,DPDK中采用NUMA结构提供了cpu亲和性、片上memory等方式提供并行计算支持。


对于用户来讲很简单,就是将app绑定到被孤立出来的cpu,然后DPDK库会尽量使用片上memory,不需要用户考虑。


2. 使用hugepage避免cache miss


hugepage,也就是使用1G这样的大页,大页可以变相增加二级cache的容量,进而减少cache miss,具体参考DPDK帮助。


3. DDIO


网卡之前的工作方式是DMA到内存,然后CPU再去内存中读入cache。DDIO的方式是网卡直接将数据包DMA到cache。




### RTC模型报文转发


数据包的转发模型有pipeline、rtc两种,普通网卡采用rtc模型,DPDK采用pipeline模型。DPDK中支持这几种pipeline,每种pipeline可以运行在一个core上面,pipeline之间采用某种机制协作。


DPDK支持这几种pipeline,每种pipeline就是一个code module:packet io,flow classification,firewall,routing,metering,traffic mgmt。具体可以看官网。


网络转发算法,主要是用来在转发面处理数据包的算法,每种算法是一个code module,用的时候包含这个头文件即可。DPDK中支持exact match(DPDK中的emc*),主要用于openflow中的flow查找;LPM(最长匹配),主要用于路由查找;ACL匹配算法;报文分发算法,也就是采用worker方式处理mbuf。




### 基于PCIe模型的网卡驱动


网卡都是挂载在bus上的,linux中采用PCIe设备的概念抽象网卡这样的字符设备,DPDK中也是一样。


PCIe驱动编程可以参考<2>,DPDK中也是使用这样的框架,这样的好处是无论哪种类型的网卡,都能通过这个框架收发包。


同linux内核,DPDK中也有mbuf和mempool,不同的是linux内核只有一个(不确定,希望被纠正),DPDK中可以自己创建多个,不过一般也是一个。pool用于给多个队列使用,每个队列成为一个Queue。




### PMD的收包模式


DPDK支持pmd、中断、混合几种收包模式,但是鉴于面对大量的数据包,一般用pmd方式。


除此以外,收包的时候还支持Queue长度设置、中断加轮训混合时候的中断条件设置等。


### 基于rte_flow的流分类与多队列


intel网卡(和大部分网卡)支持收包队列的功能,也就是通过特定规则将数据包收到特定队列(也就是内存区域)。


rte_flow是DPDK封装的上述概念,目前支持kernel虚拟端口、intel网卡物理端口,其中kernel虚拟端口通过TC实现,物理网卡通过driver实现。通过ethtool工具也能实现类似的功能。


### 硬件offload功能


目前有几种硬件offload功能,包括TCP/UDP checksum等,可以通过`ethtool -s`命令查看;OVS flow offload,这个是最新开发的高级功能。


DPDK中通过端口flags实现端口checksum等功能的offload,通过rte_flow实现ovs offload。在OVS中,通过netdevice function中定义的offload api,调用rte_flow api实现offload功能。


### IO虚拟化


SRIOV是IO虚拟化的一个规范,基本思想是PF分出VF,提供灵活增减的端口。eSwitch是实现SRIOV功能的一种底层实现,几本原理就是在网卡中增加类似FDB转发的功能。


DPDK对intel网卡支持SRIOV功能,通过driver实现。需要注意一个问题是PF、VF通过mac进行redirect,所以PF适合给host使用,VF适合给VM使用。


### 半虚拟化virtio


这个与DPDK关系不大,主要是qemu为代表的虚拟机实现虚拟网卡设备的一种方式。半虚拟化规范架构是前段加后端,前段可以理解为VM中的网卡驱动,后端就是qemu中vhost。


### vhostuser


qemu的vhost有好几种实现,都是通过KVM实现,即前段将数据包给KVM,KVM转发给qemu网络驱动,qemu网络驱动转发给kernel或者OVS。


上述步骤有几种实现方式,一种是前端通过KVM api发给KVM,KVM通过TAP端口发送给qemu,qemu再通过TAP端口发送给kernel或者OVS;一种是前端通过KVM api发给KVM,KVM通过TAP端口发送给qemu负责网络的内核module(vhost),vhost再通过TAP端口发送给kernel或者OVS;DPDK提供的实现是前端通过KVM api发给KVM,KVM通过TAP端口发送给qemu负责网络的内核module(vhost),而DPDK的vhostuser端口与qemu的vhost module是共享内存的方式通信,免去了数据的copy。


### TBD:18.08 feature 分析

猜你喜欢

转载自blog.csdn.net/batmancn/article/details/80858470