1、前言
记得刚开始工作的时,老大将我安排到数据面组,当时第一次听说”数据面“这个概念,感觉挺新鲜的。误打误撞就开始搞了,刚开始接触的时候,由于不懂其中的原理,觉得很神奇,因为报文的转发是在应用层,通过一个进程进行转发。而传统的报文转发是基于内核的,要想控制报文,需要写驱动程序。后面接触了一段时间,发现原来报文转发是基于intel开源的DPDK开发的,分为控制面和数据面。这就是当前比较火热的软件定义网路SDN的一种应用场景。DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。Linux内核将DPDK应用程序看作是一个普通的用户态进程,包括它的编译、连接和加载方式和普通程序没有什么两样。intel为什么要搞一个DPDK出来呢?有什么优势呢?运用了哪些技术呢?带着这些疑问,加深学习一下。
2、背景分析
网路刚开始时,只是在小范围内使用,并发量和响应时间要求并不高,而随着网路的普及,网路的范围越来越大,对服务器的并发量和响应时间要求越来越高,从而出现C10k问题。而现在C10k问题已经得到解决,又出现新的挑战,为了满足日益增长的需求主要采用分布式集群来分担负荷,应对大量的用户请求。对网路的要求越来越高。
网路的核心是报文的转发过程,linux网路是通过内核协议栈进行转发的,报文控制平面和数据转发平面没有分离,不适合处理大规模网络数据包,因为linux分为内核区和用户区,报文先进入内核区然后拷贝到用户区,供给上层应用程序处理。并且为了全面的支持用户空间的各个功能,协议栈中嵌入了大量用于对接的接口。如果能让应用程序直接接管网络数据包处理、内存管理以及CPU调度,那么性能可以得到一个质的提升。
如今的处理器都是多核,而且内存也越来越大,可以提高多核和大内存的扩展性,减少CPU多核之间任务的切换,内存cache miss,因为内存的访问速度永远也赶不上cache和cpu的频率,为了能让性能平行扩展,最好是少访问。
要提高网路报文转发,从如下几个方面着手:
1.控制层留给Linux做,其它数据层全部由应用程序来处理。
2.减少系统调度、系统调用、系统中断,上下文切换等
3.摒弃Linux内核协议栈,将数据包传输到用户空间定制协议栈
4.使用多核编程技术替代多线程,将OS绑在指定核上运行
5.针对SMP系统,使CPU尽量使用所在NUMA系统节点的内存,减少内存刷写
6.使用大页面,减少访问
7.采用无锁技术解竞争
3、DPDK的优势
DPDK拦截中断,不触发后续中断流程,并绕过协议栈,通过UIO技术将网卡收到的报文拷贝到应用层处理,报文不再经过内核协议栈。减少了中断,DPDK的包全部在用户控件使用内存池管理,内核控件与用户空间的内存交互不用进行拷贝,只做控制权转移,减少报文拷贝过程,提高报文的转发效率。
DPDK核心技术如下:
(1)通过UIO技术将报文拷贝到应用空间处理
(2)通过大页内存,降低cache miss ,提高命中率,进而cpu访问速度
(3)通过CPU亲和性,绑定网卡和线程到固定的core,减少cpu任务切换
(4)通过无锁队列,减少资源竞争
接下来深入学习总结一下dpdk所用到的技术,加深理解。