dpdk调研结果


1DPDK特点

DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:

1)        轮询:在包处理时避免中断上下文切换的开销,

2)        用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化

3)        亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中

4)        降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽

5)        软件调优:cache行对齐,预取数据,多元数据批量操作

DPDK不是网络协议栈,不提供二层,3层转发功能,不具备防火墙ACL功能。

2DPDK多队列收发包

DPDK中,通过将网卡的某个接收队列分配给某个核,从该队列中收到的所有报文都应当在该指定的核上处理结束,不同的核操作不同的队列。

目前可以通过RSS(接收方扩展)把数据包分配到不同的队列中,该机制根据关键字通过哈希函数计算出哈希值,再有哈希值确定队列。不同的数据包类型具有不同的关键字,例如IPv4 UDP四元组(源IP地址、目的IP地址、源端口号、目的端口号)。

另一种是Flow Director技术,根据包的字段精确匹配,查找Flow Director表项,将其分配到某个特定队列。

DPDK中可以采用RSS来负载均衡,将报文发到多个核上,同时使用Flow Director将控制报文分配到指定的队列上,使用单独的核来处理

3DPDK的优势


DPDK拦截中断,不触发后续中断流程,并绕过协议栈,通过UIO技术将网卡收到的报文拷贝到应用层处理,报文不再经过内核协议栈。减少了中断,DPDK的包全部在用户控件使用内存池管理,内核控件与用户空间的内存交互不用进行拷贝,只做控制权转移,减少报文拷贝过程,提高报文的转发效率。

DPDK核心技术如下:

  (1)通过UIO技术将报文拷贝到应用空间处理

  (2)通过大页内存,降低cache miss ,提高命中率,进而cpu访问速度

  (3)通过CPU亲和性,绑定网卡和线程到固定的core,减少cpu任务切换

  (4)通过无锁队列,减少资源竞争

4DPDK关键技术

1hugepage使用大页缓存支持来提高内存访问效率。

为实现物理地址到虚拟地址的转换,Linux一般通过查找TLB来进行快速映射,如果在查找TLB没有命中,就会触发一次缺页中断,将访问内存来重新刷新TLB页表。Linux下默认页大小为4K,当用户程序占用4M的内存时,就需要1K的页表项,如果使用2M的页面,那么只需要2条页表项,这样有两个好处:

第一是使用hugepage的内存所需的页表项比较少,对于需要大量内存的进程来说节省了很多开销,像oracle之类的大型数据库优化都使用了大页面配置;

第二是TLB冲突概率降低,TLBcpu中单独的一块高速cache,一般只能容纳100条页表项,采用hugepage可以大大降低TLB miss的开销。

DPDK目前支持了2M1G两种方式的hugepage。通过修改默认/etc/grub.confhugepage配置为:

default_hugepagesz=1Ghugepagesz=1Ghugepages=32isolcpus=0-22
·         1然后通过
mount –t hugetlbfs nodev /mnt/huge

就将hugepage文件系统hugetlbfs挂在/mnt/huge目录下,然后用户进程就可以使用mmap映射hugepage目标文件来使用大页面了。测试表明应用使用大页表比使用4K的页表性能提高10%~15%

2UIO,PMD,用户态轮询驱动,可以减小上下文切换开销,方便实现虚拟机和主机零拷贝zerocopy

当前Linux操作系统都是通过中断方式通知CPU来收发数据包,我们假定网卡每收到10个数据包触发一次软中断,一个CPU核心每秒最多处理2w次中断,那么当一个核每秒收到20w个包时就占用了100%,此刻它无法做其它任何操作。

DPDK针对Intel网卡实现了基于轮询方式的PMDPoll ModeDrivers)驱动,该驱动由API、用户空间运行的驱动程序构成,该驱动使用无中断方式直接操作网卡的接收和发送队列(除了链路状态通知仍必须采用中断方式以外)。目前PMD驱动支持Intel的大部分1G10G40G的网卡。

PMD驱动从网卡上接收到数据包后,会直接通过DMA方式传输到预分配的内存中,同时更新无锁环形队列中的数据包指针,不断轮询的应用程序很快就能感知收到数据包,并在预分配的内存地址上直接处理数据包,这个过程非常简洁。

如果要是让Linux来处理收包过程,首先网卡通过中断方式通知协议栈对数据包进行处理,协议栈先会对数据包进行合法性进行必要的校验,然后判断数据包目标是否本机的socket,满足条件则会将数据包拷贝一份向上递交给用户socket来处理,不仅处理路径冗长,还需要从内核到应用层的一次拷贝过程。

dpdk利用uio支持,提供应用空间下PMD驱动程序的支持,也就是说网卡驱动是运行在用户空间的,减下了报文在用户空间和应用空间的多次拷贝。

3利用LINUX亲和性支持,把控制面线程及各个数据面线程绑定到不同的CPU核,节省了线程在各个CPU核来回调度。

多线程的初衷是提高整体应用程序的性能,但是如果不加注意,就会将多线程的创建和销毁开销,锁竞争,访存冲突,cache失效,上下文切换等诸多消耗性能的因素引入进来。

为了进一步提高性能,就必须仔细考虑线程在CPU不同核上的分布情况,这也就是常说的多核编程。多核编程和多线程有很大的不同:多线程是指每个CPU上可以运行多个线程,涉及到线程调度、锁机制以及上下文的切换;而多核则是每个CPU核一个线程,核心之间访问数据无需上锁。为了最大限度减少线程调度的资源消耗,需要将Linux绑定在特定的核上,释放其余核心来专供应用程序使用。

同时还需要考虑CPU特性和系统是否支持NUMA架构,如果支持的话,不同插槽上CPU的进程要避免访问远端内存,尽量访问本端内存。

4提供内存池和无锁环形缓存管理,加快内存访问效率。多个收发包集中到一个cacheline,在内存池中实现,无需反复申请和释放。

5DPDK优化

要提高网路报文转发,从如下几个方面着手:

1.控制层留给Linux做,其它数据层全部由应用程序来处理。 
2.减少系统调度、系统调用、系统中断,上下文切换等 
3.摒弃Linux内核协议栈,将数据包传输到用户空间定制协议栈 
4.使用多核编程技术替代多线程,将OS绑在指定核上运行 
5.针对SMP系统,使CPU尽量使用所在NUMA系统节点的内存,减少内存刷写 
6.使用大页面,减少访问 
7.采用无锁技术解竞争

猜你喜欢

转载自blog.csdn.net/liyu123__/article/details/80859640
今日推荐