概述

第1章介绍了DPDK的技术演进历程,面临及需要解决的问题,以及如何从系统的角度看待DPDK的技术,最后结合几个编程实例帮助读者了解DPDK基本的编程模式。

什么是DPDK

最初动机:

证明IA多核处理器能够支撑高性能数据包处理,随着早期目标的达成和更多通用处理器体系的加入,DPDK逐渐成为通用多核处理器高性能数据包处理的业界标杆。

1.1 主流包处理硬件平台

支撑数据包处理的三大平台

  • 硬件加速器
  • 网络处理器
  • 多核处理器

三者有着各自的优势。硬件加速器对于本身规模化的固化功能具有高性能低成本的特点,网络处理器提供了包处理逻辑软件可编程的能力,在获得灵活性的同时兼顾了高性能的硬件包处理,多核处理器在更为复杂多变的高层包处理上拥有优势,随着包处理的开源生态系统逐渐丰富,以及近年来性能的不断提升,其为软件定义的包处理提供了快速迭代的平台。

硬件和多核互相结合。在多核处理器,可以卸载部分功能到硬件加速单元提升性能瓶颈,在硬件包处理流水线上看,多核上运行的软件完成了难以固化的上层多变逻辑任务。(例子:intel quickassist technology)

1.1.1 硬件加速器

ASIC和FPGA是最广为采用的器件

ASIC:面向特定用户需求,体积更小、功耗更低、性能提高,但灵活性和扩展性不够,开发费用高和周期长

FPGA:用户不需要接入芯片布局布线,可以随时改变逻辑功能,使用灵活,预计将从通信领域走向数据中心和云计算能力。

1.1.2 网络处理器

NPU,专为处理数据包设计的可编程通用处理器,使用专用指令集即微码(microcode)开发,越来越多集成专用硬件协处理器,进一步提高片内系统性能。

1.1.3多核处理器

现代cpu性能的扩展主要通过多核方式进行演进

当前多核处理器主要走向SoC化,往往集成内存控制器,网络控制器甚至是一些硬件加速处理引擎

1.2 初识DPDK

本章节以IA多核处理器为目标平台,所有跨主机通信都会涉及网络协议栈以及底层网卡驱动对于数据包的处理。

1.2.1 IA不适合数据包处理吗

以linux为例,传统网络设备驱动包处理动作

  • 数据包到达网卡设备
  • 网卡设备依据配置进行DMA操作
  • 网卡发送中断,唤醒处理器
  • 驱动软件填充读写缓冲区数据结构
  • 数据报文达到内核协议栈,进行高层处理
  • 如果最终应用在用户态,数据从内核搬移到用户态
  • 如果最终应用在内核态,在内核继续进行

问题:

  • 随着网络接口贷款从千兆走向万兆,每次报文到来引发的中断开销突出,大量数据到来引发的频繁中断开销导致系统无法承受,因此linux内核中有人引入了NAPI机制,其策略为系统呗中断唤醒后,尽量使用轮询方式一次处理多个数据包,直到网络再次空闲重新转入终端等待。NAPI应用在高吞吐场景效率提升明显。
  • 二层以太网数据包进入网络设备驱动处理后,大多要交付给用户态的应用,其中需要经历TCP/IP协议(TCP/IP协议工作在linux内核态)的处理,其中需要将数据包从内核缓冲区复制到用户态缓冲区,需要系统调用以及数据包复制开销,然而实际上tcp/ip协议栈并不是数据转发节点所必须的(主要用来进行拥塞控制等等)

  • 对于无线网而言,无线4G/LTE数据面网络协议展示从基站、基站控制器到无限核心网关的协议层次。可以看到大量处理在2,3,4层进行。如何减少像linux这样的操作系统额外的包处理开销是研究热点。Netmap共享数据包池。

  • 即使共享内存池减少内核空间到用户控件拷贝,然而linux作为分时操作系统,内核驱动的收发包处理和用户线程间的切换需要用户态到内核态的来回切换,开销较大,且涉及cache的切换
  • 怎么样的软件设计方法能最充分释放多核IA的包处理能力,是面临的挑战。

1.2.2 DPDK实践

采用技术

  • 轮询:避免中断上下文的切换
  • 用户态驱动:规避不必要的内存拷贝和系统调用,不受限于目前内核现有的数据格式和行为定义,能够重定义mbuf,重新优化网卡DMA操作
  • 亲和性和独占:特定任务可以被指定只在某个核上工作。好处是避免线程在不同核间频繁切换。核间线程切换需要频繁替换cache,进一步限定某些核不参与系统调度,可以使线程独占该核,保证更多cache hit同时,避免同一个核内多任务切换开销。
  • 降低访存开销:优化cache hit和TLB hit,例如采用大页内存或内存非对称感知等等。
  • 软件调优:例如cache line对齐,预取策略等等。
  • 利用IA新硬件技术:利用intel新技术例如DDIO、SIMD等等技术进行优化。
  • 挖掘网卡潜能,充分利用如分流(RSS,FDIR)和卸载(如Chksum,TSO)等硬件加速特性,更好获得直接性能提升。

1.2.3 DPDK框架简介

DPDK为IA上的高速包处理而设计,DPDK框架如下图,他大量利用了有助于包处理的软硬件特性,如大页、缓存行对齐等等技术。

  • 核心库core libs,提供系统抽象,大页内存,缓存池,定时器及无锁环等基础组件
  • PMD库,提供全用户态的驱动,以便通过轮询和线程绑定得到极高的网络吞吐,支持本地和虚拟的网卡。
  • Classify库,支持精确匹配,最长匹配和通配符匹配,提供常用包处理的查表操作
  • QoS库,提供网络服务质量相关组件,如限速和调度

此外,DPDK还提供了几个平台特性,比如节能考虑的运行时频率调整和linux kernel stack建立快速通道的KNI。

1.2.4 寻找性能优化的天花板

性能优化上限是无线接近于理论极限。

数据包转发速率是否有天花板?包转发天花板就是理论物理线路上能够传输的最大速率,即线速。然而数据包经过接口进入内存会受到总线最大带宽的限制。CPU从cache中加载、存储一个line也会受限到处理器的时钟频率。内存控制器也有内存读写带宽。

DPDK再IA上提供网络处理能力有多优秀?是否触及到了某些性能的理论上限?

包处理能力的常见能力指标

1.3 解读数据包处理能力

常提到的性能指标有吞吐、延迟、丢包率、抖动等。

对于转发,一般用包转发率(pps,每秒包转发率)而不是比特率(bit/s,每秒比特转发率)来衡量转发能力,这跟包再网络中的传输有关。不同包对存储转发要求不尽相同。

线速是线缆中流过的帧理论上支持的最大帧数。

以以太网为例,一般所说的接口带宽,100Gbit/s,代表以太接口线路上所能承载的最高传输比特率。实际上不可能每个比特都能传输数据,以太网每个帧之间会有帧间距(intel-packet gap, IPG),默认帧间距大小为12字节,每个帧还有7个字节前导(Preamble),和1个字节的帧首定界符(SFD)。帧格式示意图如下,有效内容为以太网目的地址,源地址,以太网类型,负载,尾部有校验码。

理论上满速带宽跑有效数据的吞吐由如下公式得到理论帧转发率

最大理论帧转发率的倒数表示了线速情况下先后两个包到达的时间间隔。

不同的包长度有不同的帧转发率,由公式,包长度越小,带宽越大,转发率越高,帧间延迟越小。

满足什么条件才能达到无阻塞转发的理论上限呢?如果我们把处理一个数据包的整个生命周期看做是工厂的生产流水线,那么就要保证在这个流水线上,不能有任何一级流水处理的延迟超过此时间间隔。因此包长度越小,硬件要求越高

1.4 探索IA处理器上最艰巨的任务

最大挑战是什么?为什么通用处理器很少再数据平面扮演重要角色?

以负载为例

对于64B数据包长,达到理论最大的转发能力,需要软件允许消耗33个时钟周期,对于1024B的数据包大小,需要大约417个时钟周期,二再存储转发模型下,报文收发及查表都需要访存,一次LLC命中大约需要40个时钟周期,未命中仅内存都就需要140个时钟周期,因此对于64B大小的包,甚至满足不了每次LLC都命中的情况。小包处理时延对于通用CPU系统架构挑战巨大。

是否IA就不适合高性能的网络负载呢?

答案是否定的!

原因:

  • IA平台实际能提供的最大能力
  • 这个能力是否足以应对一定领域的高性能网络负载

DPDK的出现充分释放了IA平台对包处理的吞吐能力。随着吞吐率的上升,中断触发开销是不能忍受的,DPDK利用一系列软件优化方法,利用IA平台硬件特性,提供完整的底层开发支持库。使得单核三层转发可以轻松地突破小包30Mpps,随着CPU封装的核数越来越多,支持的PCIe通道数越来越多,整系统的三层转发吞吐在2路CPU的Xeon,E5-2658v3上可以达到300Mpps。

虽然还不足以覆盖网络中出现的所有端到端的设备场景,但无论在核心网接入侧,还是在数据中心网络中,都可以覆盖相当多的场景。

数据面可软化带来了一系列变化

  • 采用通用服务器平台,降低专门硬件设计成本
  • 基于C语言的开发,生态比专门硬件开发更丰富
  • 给网络功能虚拟化(NFV)带来可能,推动SDN的全面展开

1.5 软件包处理潜力-再识DPDK

DPDK将IA上包处理性能提升到一个高度。

1.5.1 DPDK加速网络节点

随着处理器的更新,在IA上的性能提升以蘅皋斜率不断发酵。在千兆、万兆的接口全速转发不再是问题,DPDK将目标伸向百万兆接口。

DPDK软件包内有一个最基本的三层转发实例(l3fwd),可用于测试双路服务器整系统的吞吐能力。实验表明可以达到220Gbit/s的数据报文吞吐能力。除了通过硬件或软件提升性能之外,如今DPDK整系统保温吞吐能力不再受限于CPU核数,而是受限于PCIe的LANE数。天花板在于能插入多少个高速以太网接入卡。

网络节点软化成为可能。对于网络节点上运行的不同形态的网络功能,将其软化并适配到一个通用硬件平台,自然诉求是软硬件解耦。是NFV的核心思想,为了解决多个网络功能在通用节点上的隔离问题,用虚拟化进行诠释。

NFV首先需要业务面的高性能。DPDK提供业务面高性能,同时对虚拟交换(vswitch)转发面进化做出积极贡献。 应对绝对高吞吐能力 的要求,DPDK支持各种I/O的SR-IOV接口;应对高性能拟主机网络 的要求,DPDK支持标准virtio接口;对虚拟化平台的支撑,DPDK从 KVM、VMWARE、XEN的hypervisor到容器技术,可谓全平台覆盖。

DPDK以强劲的驱动 力加速各种虚拟化的网络功能部署到现实的网络节点上。

1.5.2 DPDK加速计算节点

DPDK之于网络节点,主要集中在数据面转发方面,这个很容易理 解;对于计算节点,DPDK也拥有很多潜在的机会。

但是单一接口带宽的提高并不能直接导致高并发、高吞吐服务的发 生,即使用到了一系列系统方法(异步非阻塞,线程等),但网络服务 受限于内核协议栈多核水平扩展上的不足以及建立拆除连接的高开销, 开始逐渐阻碍进一步高并发下高带宽的要求。另一方面,内核协议栈需 要考虑更广泛的支持,并不能为特定的应用做特殊优化,一般只能使用 系统参数进行调优。

当然,内核协议栈也在不断改进,而以应用为中心的趋势也会不断 推动用户态协议栈的涌现。有基于BSD协议栈移植的,有基于多核模型 重写的原型设计,也有将整个Linux内核包装成库的。它们大多支持以 DPDK作为I/O引擎,有些也将DPDK的一些优化想法加入到协议栈的优 化中,取得了比较好的效果。

可以说,由DPDK加速的用户态协议栈将会越来越多地支撑起计算 节点上的网络服务。

1.5.3 DPDK加速存储节点

intel开源技术SPDK,存储加速开发套件

主要的应用场景是iSCSI性能加速。 在前端提供网络IO加速加上一套用户态TCP/IP协议栈。在后端以轮询驱动的方式实践在NVMe上。

1.5.4 DPDK方法论

  1. 专用负载下的针对性软件优化

专用处理器通过硬件架构专用优化,DPDK则利用通用处理器的专用话底层软件来优化。

  1. 追求可水平扩展的性能

利用多核并行计算能力

  1. 向Cache索求极致的实现优化性能

很多方法围绕cache优化

  1. 理论分析结合实践推导

分析、推测、做原型、跑数据、在分析,通过螺旋式上升慢慢逼近最优解。

1.6 从融合的角度看DPDK

越是能标准化的要求越快,此时就是硬件,越是多样化可变性强就是软件。

DPDK是软件优化库,看整个包处理的硬件平台,软硬件融合趋势明显。CPU+FPGA这一对组合给了我们想象的空间。

1.7 实例

1)helloworld

2)skeleon

3)l3fwd

1.7.1 HelloWorld

DPDK里的HelloWorld是最基础的入门程序,代码简短,功能也不 复杂。它建立了一个多核(线程)运行的基础环境,每个线程会打 印“hello from core#”,core#是由操作系统管理的。如无特别说明,本文 里的DPDK线程与硬件线程是一一对应的关系。从代码角度,rte是指 runtime environment,eal是指environment abstraction layer。DPDK的主 要对外函数接口都以rte_作为前缀,抽象化函数接口是典型软件设计思 路,可以帮助DPDK运行在多个操作系统上,DPDK官方支持Linux与 FreeBSD。和多数并行处理系统类似,DPDK也有主线程、从线程的差 异。

P47

1.7.2 skeleon

DPDK为多核设计,但这是单核实例,设计初衷是实现一个最简单 的报文收发示例,对收入报文不做任何处理直接发送。整个代码非常精 简,可以用于平台的单核报文出入性能测试。

主要处理函数main的处理逻辑如下(伪码),调用rte_eal_init初始 化运行环境,检查网络接口数,据此分配内存池 rte_pktmbuf_pool_create,入口参数是指定rte_socket_id(),考虑了本 地内存使用的范例。调用port_init(portid,mbuf_pool)初始化网口的 配置,最后调用lcore_main()进行主处理流程。

1.7.3 L3fwd

这是DPDK中最流行的例子,也是发布DPDK性能测试的例子。如果将PCIE插槽上填满高速网卡,将网口与大流量测试仪表连接,它能展示在双路服务器平台具备200Gbit/s的转发能力。数据包被收入系统后,会查询IP报文头部,依据目标地址进行路由查找,发现目的端口,修改IP头部后,将报文从目的端口送出。路由查找有两种方式,一种方式是基于目标IP地址的完全匹配(exact match),另一种方式是基于路由表的最长掩码匹配(Longest Prefix Match,LPM)。三层转发的实例代码文件有2700多行(含空行与注释行),整体逻辑其实很简单,是前续HelloWorld与Skeleton的结合体。

1.8 小结

DPDK立足通用多核处理器,再IA数据包处理上去的重大性能突破,随着软硬件解耦,DPDK成为NFV事实上的数据面基石。再数据中心网络持续SDN化的过程中,DPDK将扮演越来越重要的作用。