icon1

引言

动机

2015年4月,第一届DPDK中国峰会在北京成功召开。来自中国移动、中国电信、阿里巴巴、IBM、Intel、华为以及中兴的专家朋友登台演讲,一起分享了以DPDK为中心的技术主题。表1列出了2015 DPDK中国峰会的主题及演讲者。

表1 2015DPDK中国峰会主题及演讲者

这次会议吸引了来自各行业、科研单位与高校的200多名开发人员、专家和企业代表参会。会上问答交流非常热烈,会后我们就想,也许是时间写一本介绍DPDK、探讨NFV数据面的技术书籍。现在,很多公司在招聘网络和系统软件人才时,甚至会将DPDK作为一项技能罗列在招聘要求中。DPDK从一个最初的小众技术,经过10年的孕育,慢慢走来,直至今日已经逐渐被越来越多的通信、云基础架构厂商接受。同时,互联网上也出现不少介绍DPDK基础理论的文章和博客,从不同的角度对DPDK技术进行剖析和应用,其中很多观点非常新颖。作为DPDK的中国开发团队人员,我们意识到如果能够提供一本DPDK的书籍,进行一些系统性的梳理,将核心的原理进行深入分析,可以更好地加速DPDK技术的普及,触发更多的软件创新,促进行业的新技术发展。于是,就萌发了写这本书的初衷。当然,我们心里既有创作的激动骄傲,也有些犹豫忐忑,写书不是一件简单的事情,但经过讨论和考量,我们逐渐变得坚定,这是一本集结团队智慧的尝试。我们希望能够把DPDK的技术深入浅出地解释清楚,让更多的从业人员和高校师生了解并使用DPDK,促进DPDK发展日新月异,兴起百家争鸣的局面,这是我们最大的愿景。

多核

2005年的夏天,刚加入Intel的我们畅想着CPU多核时代的到来给软件业带来的挑战与机会。如果要充分利用多核处理器,需要软件针对并行化做大量改进,传统软件的并行化程度不高,在多核以前,软件依靠CPU频率提升自动获得更高性能。并行化改进不是一件简单的工作,许多软件需要重新设计,基本很难在短期实现,整个计算机行业都对此纠结了很久。2005年以前,整个CPU的发展历史,是不断提升芯片运算频率核心的做法,软件性能会随着处理器的频率升高,即使软件不做改动,性能也会跟着上一个台阶。但这样的逻辑进入多核时代已无法实现。首先我们来看看表2所示的Intel®多核处理器演进。

表2 Intel®多核处理器演进的历史图表

在过去10年里,服务器平台的处理器核心数目扩展了很多。表2参考了英特尔至强系列的处理器的核心技术演进历史,这个系列的处理器主要面向双通道(双路)服务器和相应的硬件平台。与此同时,基于MIPS、Power、ARM架构的处理器也经历着类似或者更加激进的并行化计算的路线图。在处理器飞速发展的同时,服务器平台在硬件技术上提供了支撑。基于PCI Express的高速IO设备、内存访问与带宽的上升相辅相成。此外,价格和经济性优势越发突出,今天一台双路服务器的价格可能和10年前一台高端笔记本电脑的价格类似,但计算能力达到甚至超越了当年的超级计算机。强大的硬件平台为软件优化技术创新蕴蓄了温床。

以太网接口技术也经历了飞速发展。从早期主流的10Mbit/s与100Mbit/s,发展到千兆网(1Gbit/s)。到如今,万兆(10Gbit/s)网卡技术成为数据中心服务器的主流接口技术,近年来,Intel等公司还推出了40Gbit/s、100Gbit/s的超高速网络接口技术。而CPU的运行频率基本停留在10年前的水平,为了迎接超高速网络技术的挑战,软件也需要大幅度创新。

结合硬件技术的发展,DPDK(Data Plane Development Kit),一个以软件优化为主的数据面技术应时而生,它为今天NFV技术的发展提供了绝佳的平台可行性。

IXP

提到硬件平台和数据面技术,网络处理器是无法绕过的话题。电信行业通常使用网络处理器或类似芯片技术作为数据面开发平台首选。Intel此前也曾专注此领域,2002年收购了DEC下属的研究部门,在美国马萨诸塞州哈德逊开发了这一系列芯片,诞生了行业闻名的Intel Exchange Architecture Network Processor(IXP4xx、IXP12xx、IXP24xx、IXP28xx)产品线,曾取得行业市场占有率第一的成绩。即使今日,相信很多通信业的朋友,还对这些处理器芯片有些熟悉或者非常了解。IXP内部拥有大量的微引擎(MicroEngine),同时结合了XSCALE作为控制面处理器,众所周知,XSCALE是以ARM芯片为核心技术的一种扩展。

2006年,AMD向Intel发起了一场大战,时至今日结局已然明了,Intel依赖麾下的以色列团队,打出了新一代Core架构,迅速在能效比上完成超车。公司高层同时确立了Tick-Tock的研发节奏,每隔两年推出新一代体系结构,每隔两年推出基于新一代制造工艺的芯片。这一战略基本保证了每年都会推出新产品。当时AMD的处理器技术一度具有领先地位,并触发了Intel在内部研发架构城门失火的状况下不得不进行重组,就在那时Intel的网络处理器业务被进行重估,由于IXP芯片系列的市场容量不够大,Intel的架构师也开始预测,通用处理器多核路线有取代IXP专用处理芯片的潜力。自此,IXP的研发体系开始调整,逐步转向使用Intel CPU多核的硬件平台,客观上讲,这一转型为DPDK的产生创造了机会。时至今日,Intel还保留并发展了基于硬件加速的QuickAssist技术,这和当日的IXP息息相关。由此看来,DPDK算是生于乱世。

DPDK的历史

网络处理器能够迅速将数据报文接收入系统,比如将64字节的报文以10Gbit/s的线速也就是14.88Mp/s(百万报文每秒)收入系统,并且交由CPU处理,这在早期Linux和服务器平台上无法实现。以Venky Venkastraen、Walter Gilmore、Mike Lynch为核心的Intel团队开始了可行性研究,并希望借助软件技术来实现,很快他们取得了一定的技术突破,设计了运行在Linux用户态的网卡程序架构。传统上,网卡驱动程序运行在Linux的内核态,以中断方式来唤醒系统处理,这和历史形成有关。早期CPU运行速度远高于外设访问,所以中断处理方式十分有效,但随着芯片技术与高速网络接口技术的一日千里式发展,报文吞吐需要高达10Gbit/s的端口处理能力,市面上已经出现大量的25Gbit/s、40Gbit/s甚至100Gbit/s高速端口,主流处理器的主频仍停留在3GHz以下。高端游戏玩家可以将CPU超频到5GHz,但网络和通信节点的设计基于能效比经济性的考量,网络设备需要日以继夜地运行,运行成本(包含耗电量)在总成本中需要重点考量,系统选型时大多选取2.5GHz以下的芯片,保证合适的性价比。I/O超越CPU的运行速率,是横在行业面前的技术挑战。用轮询来处理高速端口开始成为必然,这构成了DPDK运行的基础。

在理论框架和核心技术取得一定突破后,Intel与6wind进行了合作,交由在法国的软件公司进行部分软件开发和测试,6wind向Intel交付了早期的DPDK软件开发包。2011年开始,6wind、Windriver、Tieto、Radisys先后宣布了对Intel DPDK的商业服务支持。Intel起初只是将DPDK以源代码方式分享给少量客户,作为评估IA平台和硬件性能的软件服务模块,随着时间推移与行业的大幅度接受,2013年Intel将DPDK这一软件以BSD开源方式分享在Intel的网站上,供开发者免费下载。2013年4月,6wind联合其他开发者成立www.dpdk.org的开源社区,DPDK开始走上开源的大道。

开源

DPDK在代码开源后,任何开发者都被允许通过www.dpdk.org提交代码。随着开发者社区进一步扩大,Intel持续加大了在开源社区的投入,同时在NFV浪潮下,越来越多的公司和个人开发者加入这一社区,比如Brocade、Cisco、RedHat、VMware、IBM,他们不再只是DPDK的消费者,角色向生产者转变,开始提供代码,对DPDK的代码进行优化和整理。起初DPDK完全专注于Intel的服务器平台技术,专注于利用处理器与芯片组高级特性,支持Intel的网卡产品线系列。

DPDK 2.1版本在2015年8月发布,几乎所有行业主流的网卡设备商都已经加入DPDK社区,提供源代码级别支持。另外,除了支持通用网卡之外,能否将DPDK应用在特别的加速芯片上是一个有趣的话题,有很多工作在进行中,Intel最新提交了用于Crypto设备的接口设计,可以利用类似Intel的QuickAssit的硬件加速单元,实现一个针对数据包加解密与压缩处理的软件接口。

在多架构支持方面,DPDK社区也取得了很大的进展,IBM中国研究院的祝超博士启动了将DPDK移植到Power体系架构的工作,Freescale的中国开发者也参与修改,Tilera与Ezchip的工程师也花了不少精力将DPDK运行在Tile架构下。很快,DPDK从单一的基于Intel平台的软件,逐步演变成一个相对完整的生态系统,覆盖了多个处理器、以太网和硬件加速技术。

在Linux社区融合方面,DPDK也开始和一些主流的Linux社区合作,并得到了越来越多的响应。作为Linux社区最主要的贡献者之一的RedHat尝试在Fedora Linux集成DPDK;接着RedHat Enterprise Linux在安装库里也加入DPDK支持,用户可以自动下载安装DPDK扩展库。RedHat工程师还尝试将DPDK与Container集成测试,并公开发布了运行结果。传统虚拟化的领导者VMware的工程师也加入DPDK社区,负责VMXNET3-PMD模块的维护。Canonical在Ubuntu 15中加入了DPDK的支持。

延伸

由于DPDK主体运行在用户态,这种设计理念给Linux或者FreeBSD这类操作系统带来很多创新思路,也在Linux社区引发一些讨论。

DPDK的出现使人们开始思考,Linux的用户态和内核态,谁更适合进行高速网络数据报文处理。从简单数据对比来看,在Intel的通用服务器上,使用单核处理小包收发,纯粹的报文收发,理想模型下能达到大约57Mp/s(每秒百万包)。尽管在真实应用中,不会只收发报文不处理,但这样的性能相对Linux的普通网卡驱动来说已经是遥不可及的高性能。OpenVSwitch是一个很好的例子,作为主流的虚拟交换开源软件,也尝试用DPDK来构建和加速虚拟交换技术,DPDK的支持在OVS2.4中被发布,开辟了在内核态数据通道之外一条新的用户态数据通道。目前,经过20多年的发展,Linux已经累积大量的开源软件,具备丰富的协议和应用支持,无所不能,而数据报文进出Linux系统,基本都是在Linux内核态来完成处理。因为Linux系统丰富强大的功能,相当多的生产系统(现有软件)运行在Linux内核态,这样的好处是大量软件可以重用,研发成本低。但也正因为内核功能强大丰富,其处理效率和性能就必然要做出一些牺牲。

使用

在专业的通信网络系统中,高速数据进出速率是衡量系统性能的关键指标之一。大多通信系统是基于Linux的定制系统,在保证实时性的嵌入式开发环境中开发出用户态下的程序完成系统功能。利用DPDK的高速报文吞吐优势,对接运行在Linux用户态的程序,对成本降低和硬件通用化有很大的好处,使得以软件为主体的网络设备成为可能。对Intel®x86通用处理器而言,这是一个巨大的市场机会。

对于通信设备厂商,通用平台和软件驱动的开发方式具有易采购、易升级、稳定性、节约成本的优点。

● 易采购:通用服务器作为主流的基础硬件,拥有丰富的采购渠道和供应商,供货量巨大。

● 易升级:软件开发模式简单,工具丰富,最大程度上避免系统升级中对硬件的依赖和更新,实现低成本的及时升级。

● 稳定性:通用服务器平台已经通过大量功能的验证,产品稳定性毋庸置疑。而且,对于专用的设计平台,系统稳定需要时间累积和大量测试,尤其是当采用新一代平台设计时可能需要硬件更新,这就会带来稳定性的风险。

● 节约研发成本和降低复杂性:传统的网络设备因为功能复杂和高可靠性需求,系统切分为多个子系统,每个子系统需要单独设计和选型,独立开发,甚至选用单独的芯片。这样的系统需要构建复杂的开发团队、完善的系统规划、有效的项目管理和组织协调,来确保系统开发进度。而且,由于开发的范围大,各项目之间会产生路径依赖。而基于通用服务器搭建的网络设备可以很好地避免这些问题。

版权

DPDK全称是Data Plane Development Kit,从字面解释上看,这是专注于数据面软件开发的套件。本质上,它由一些底层的软件库组成。目前,DPDK使用BSD license,绝大多数软件代码都运行在用户态。少量代码运行在内核态,涉及UIO、VFIO以及XenDom0, KNI这类内核模块只能以GPL发布。BSD给了DPDK的开发者和消费者很大的自由,大家可以自由地修改源代码,并且广泛应用于商业场景。这和GPL对商业应用的限制有很大区别。作为开发者,向DPDK社区提交贡献代码时,需要特别注意license的定义,开发者需要明确license并且申明来源的合法性。

社区

参与DPDK社区[Ref1-1](www.dpdk.org)就需要理解它的运行机制。目前,DPDK的发布节奏大体上每年发布3次软件版本(announce@dpdk.org),发布计划与具体时间会提前公布在社区里。DPDK的开发特性也会在路标中公布,一般是通过电子邮件列表讨论dev@dpdk.org,任何参与者都可以自由提交新特性或者错误修正,具体规则可以参见www.dpdk.org/dev,本书不做详细解读。对于使用DPDK的技术问题,可以参与user@dpdk.org进入讨论。

子模块的维护者名单也会发布到开源社区,便于查阅。在提交代码时,源代码以patch方式发送给dev@dpdk.org。通常情况下,代码维护者会对提交的代码进行仔细检查,包括代码规范、兼容性等,并提供反馈。这个过程全部通过电子邮件组的方式来完成,由于邮件量可能巨大,如果作者没有得到及时回复,请尝试主动联系,提醒代码维护人员关注,这是参与社区非常有效的方式。开发者也可以在第一次提交代码时明确抄送相关的活跃成员和专家,以得到更加及时的反馈和关注。

目前,开源社区的大量工作由很多自愿开发者共同完成,因此需要耐心等待其他开发者来及时参与问答。通过提前研究社区运行方式,可以事半功倍。这对在校学生来说更是一个很好的锻炼机会。及早参与开源社区的软件开发,会在未来选择工作时使你具有更敏锐的产业视角和技术深度。作为长期浸润在通信行业的专业人士,我们强烈推荐那些对软件有强烈兴趣的同学积极参与开源社区的软件开发。

贡献

本书由目前DPDK社区中一些比较资深的开发者共同编写,很多作者是第一次将DPDK的核心思想付诸于书面文字。尽管大家已尽最大的努力,但由于水平和能力所限,难免存在一些瑕疵和不足,也由于时间和版面的要求,很多好的想法无法在本书中详细描述。但我们希望通过本书能够帮助读者理解DPDK的核心思想,引领大家进入一个丰富多彩的开源软件的世界。在本书编纂过程中我们得到很多朋友的帮助,必须感谢上海交通大学的金耀辉老师、中国科学技术大学的华蓓和张凯老师、清华大学的陈渝教授、中国电信的欧亮博士,他们给了我们很多中肯的建议;另外还要感谢李训和刘勇,他们提供了大量的资料和素材,帮助我们验证了大量的DPDK实例;还要感谢我们的同事杨涛、喻德、陈志辉、谢华伟、戴启华、常存银、刘长鹏、Jim St Leger、MJay、Patrick Lu,他们热心地帮助勘定稿件;最后还要特别感谢英特尔公司网络产品事业部的领导周晓梅和周林给整个写作团队提供的极大支持。正是这些热心朋友、同事和领导的支持,坚定了我们的信心,并帮助我们顺利完成此书。最后我们衷心希望本书读者能够有所收获。