### 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。
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 分析