DPDK 分析学习之全网唯一的 DPDK 教学课程丨虚拟化高性能专家之路
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 的优势
![](https://static001.geekbang.org/infoq/a0/a0714d30b93cefb757a5a3a831c081e8.png)
DPDK 拦截中断,不触发后续中断流程,并绕过协议栈,通过 UIO 技术将网卡收到的报文拷贝到应用层处理,报文不再经过内核协议栈。减少了中断,DPDK 的包全部在用户控件使用内存池管理,内核控件与用户空间的内存交互不用进行拷贝,只做控制权转移,减少报文拷贝过程,提高报文的转发效率。
DPDK 核心技术如下:
(1)通过 UIO 技术将报文拷贝到应用空间处理
(2)通过大页内存,降低 cache miss ,提高命中率,进而 cpu 访问速度
(3)通过 CPU 亲和性,绑定网卡和线程到固定的 core,减少 cpu 任务切换
(4)通过无锁队列,减少资源竞争
4、DPDK 的学习资料及学习路线总结图点击:DPDK学习资料 获取及学习路线总结图
推荐学习 DPDK 系统课程链接:dpdk/网络协议栈/vpp/OvS/DDos/SDN/NFV/虚拟化/高性能专家之路-学习视频
![](https://static001.geekbang.org/infoq/e5/e5d415062cf0fbe1b2a03ee975de3381.png)
![](https://static001.geekbang.org/infoq/77/7706cc72ff04ad5100b9ae087a5b4375.png)
评论