朱河清:在Intel负责两个全球领先网络开源软件技术研发(DPDK, Hyperscan),开源软件大幅促进了软件定义网络与网络功能虚拟化的行业转变浪潮,拥有15年的电信与数据中心网络软件专业背景,加入Intel之前,曾在华为与上海贝尔工作。

---------------------------------------------------------------------

清明假期出大事了,除了北邮断网,DPDK挪窝了,加州时间43日,在Open Network Summit 上正式宣布,DPDK正式加入Linux Foundationhttp://www.sdnlab.com/18794.html。黄金会员ARM,AT&T, Cavium, , Intel, Mellanox, NXP, Redhat, ZTE。白银会员6wind, Huawei, Spirent,WindRiver, AtomicRules,社区会员 清华大学等。

 

DPDK最初动机很简单,网络处理器的软件解决方案,证明IA多核处理器能够支撑高性能数据包处理。

 

什么是DPDK?对于用户来说,它可能是一个出色的包数据处理性能加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。DPDK在主流Linux包含,比如Debian, Fedora,Redhat, Ubuntu, FreeBSD

 

DPDK代码在www.dpdk.org上自由提交,软件发布时间是14次,分别是20172月、58月和11月。本质上,是一个软件优化。进一步讲,是对Linux的网络运行环境进行优化。 

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java

一张图示,大致包含这些软件模块,最核心的是CorePMDPMD- 基于轮询的用户态驱动。轮询,这一点很直接,为了避免中断上下文切换的开销。LINUX也采用该方法改进对大吞吐数据的处理,效果很好。

 

用户态驱动,在这种工作方式下,既规避了不必要的内存拷贝又避免系统调用。一个间接的影响在于,用户态驱动不受限于内核现有的数据格式和行为定义。有个假设: 很多应用都是在用户态,亲和性和独占,DPDK工作在用户态,线程的调度仍旧依赖内核。利用线程的CPU亲和绑定的方式,特定任务可以被指定只在某个核上工作。

 

好处是避免线程在不同核间频繁切换,核间线程切换容易导致因cache miss和cache write back造成的大量性能损失。如果更进一步地限定某些核不参与linux系统调度,就能使线程独占该核,保证更多cache hit的同时,也避免了同一个核内的多任务切换开销。

 

降低访存开销,网络数据包处理是一种典型的I/O密集型(I/O bound)工作负载。无论是CPU指令还是DMA,对于内存子系统(Cache+DRAM)都访问频繁。利用一些已知的高效方法来减少访存的开销能够有效提升性能。比如利用内存大页能有效降低TLB miss,比如利用内存多通道的交错访问能有效提高内存访问的有效带宽,再比如利用对于内存非对称性的感知可以避免额外的访存延迟,比如Hugepage

 

DPDK很强调软件优化,四处吸取营养,比如结构的cache line对齐(cache alignment),比如数据在多核间访问避免跨cache line共享(false sharing),比如适时地预取数据(prefeching),再如多元数据批量操作(multi-buffer)。简单说,可以在一个例子中阅读,著名的l3fwd(链接http://www.dpdk.org/browse/dpdk/tree/examples/l3fwd

 

DPDK 大量利用IA新硬件技术,DDIO,SIMD等等。在网卡驱动上,花了很多力,充分挖掘网卡的潜能,经过DPDK I/O加速的数据包通过PCIe网卡进入到系统内存,PCIe外设到系统内存之间的带宽利用效率、数据传送方式(coalesce操作)等都是直接影响I/O性能的因素。DPDK充分利用网卡硬件加速特性,比如RSS, FDIRChecksum Offload, TSO 等等。结合网卡多队列技术,1G/10G/25G/40G/100G的低成本线速转发。

 

虚拟化是资源的逻辑表示,DPDK大力推动网络虚拟化。靠得是SR-IOVVIRTIO,我们在NFV容器化下,引入了VIRTIO-user的概念,SR-IOVPCI-e透传技术, 将物理网卡切片,直接透传到虚拟机。DPDK VF性能很高,可以实现线速转发,借助多核,大量的虚机可以并行运行,这是NFV的主要方式之一。

 

VIRTIO 是一种半虚拟化的设备抽象接口规范现代数据中心中大量采用的是KVMvSwitch的主要Host/Guest接口,DPDK实现了VIRTIO前端,也就是虚机侧的轮训驱动,在主机侧、后端,实现了VHOST-user的轮训驱动,这个就构成了对vSwitch加速的基础。

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java_02

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java_03

http://www.dpdk.org/browse/dpdk/tree/drivers/net/vhost、http://www.dpdk.org/browse/dpdk/tree/drivers/net/virtio这是驱动程序所在地,Intel的网卡驱动http://www.dpdk.org/browse/dpdk/tree/drivers/net/i40e 这是XL710系列;http://www.dpdk.org/browse/dpdk/tree/drivers/net/ixgbe 这个是著名的82599系列。

 

我们是将容器网络优化,也放入DPDK中,关键在于VIRTIO-user

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java_04

这种方式可以在容器上运行VIRTIO-PMD,对接主机侧ovs-dpdk,类似OVS-DPDK加速机制,实现性能提升,2016年,DPDK的另外一大发展就是Cryptodev,我们最近推了一篇文章(http://mp.weixin.qq.com/s/fwRehoM5NTVLU6V_Bud-AQ)里面解释的比较详细,需要提一点,这个APIVPP 17.01 Release开始加入DPDK Cryptodev Support

 

什么是VPP? 请移步 https://fd.io/ The Fast Data Project (FD.io),他们是这么说的,“Relentlessly focused on data IO speed and efficiency for more flexible and scalable networks and storage。”Cisco开源了矢量化的报文处理(VPP)

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java_05

VPP 17.01 Release开始加入DPDK Cryptodev的支持,用于IPsec处理。 

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java_06

DPDKAPI提供了Crypto软件实现,硬件加速实现。预计以后在IA实现100Gbps IPsec是轻松搞定了 

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java_07

究竟DPDK有什么成功案例? 

SDN实战团技术分享(三十八):DPDK助力NFV与云计算_java_08

这些都是公开的开源项目信息,商业公司也不少,国内Alibaba, UCLOUD都在DPDKSummit做过公开演讲。 


利用DPDK加速NFV(邓辉 中国移动)

 

利用DPDK优化云基础设施(孙成浩 阿里巴巴)

 

构建core以及高能效应用的最佳实践(梁存铭Intel

 

基于英特尔ONP构建虚拟化的IP接入方案(欧亮 中国电信)

 

DPDK加速无线数据核心网络(陈东华 中兴)

 

电信业务场景下的数据面挑战(刘郡 华为)

利用DPDK优化云基础设施 这是Alibaba 2015年的公开演讲,https://dpdksummit.com/us/en/past-events可以查找2015UCLOUD 2016年讲过他们的Load BalancerTopSec 交流过将DPDK移植到内核态的历程,最后也回到了用户态,电信的成功案例不细说了。今年在上海,我们预期5月中旬还有新一期DPDK Summit,欢迎踊跃投稿参与。

 

Q&A

Q:vpp可以用来做协议解析框架吗

A:协议解析网卡也能offload一些,但在低层协议上L2/L3/L4,协议识别的关注点可能在高层上,应用类的识别比较复杂,还有国情,肯定VPP现在还不行。作为起点,开始接受报文的协议处理,是不错的选择,可以把这个问题扔到VPP社区里,问问他们的路标如何?


Q:请问DPDKDPI深度包检测方面的应用如何具体实施有应用案例?

A: DPDK被广泛使用在DPI, DPI是一个复杂的系统,DPDK关注解决报文进出,HyperscanIntel贡献给业界的一个核心复杂算法,可以用于正则表达式与字符串查找,在48日北京有个Hyperscan Workshop,我们会有具体案例分析


Q:请教个问题,nfvdpdk一直loop对服务器性能消耗太高,virtio中断模式是否有资料能简单介绍一下?

A: 是的,我们早就注意到了这个问题,在2015年的DPDK Summit讲座中,梁存铭就做了专题,讨论引入中断模式,可以参考l3fwd-power这个sample以及相应文档,virtio interrupt 最近都有提交patch


Q:ovs-dpdk SR-IOV, 哪个适合企业数据中心的云计算?

A: 使用sr-iov还是vSwitch,取决于上层应用,见仁见智,sr-iov需要依赖硬件做报文过滤与分发,vSwitch是软件解决方法,决策点还是在数据中心的设计者,如何设计上层应用以及业务的弹性与跨平台(live migration),vSwitch提供了通用性,和具体网卡解耦合,易于做迁移,升级,但是性能稍差,SR-IOV性能好,具体部署还是需要看业务部署的需求


Q:如果服务器应用例如nginx mysql不使用内核协议栈和内核驱动,使用dpdk加用户态协议栈,有这样的用法没有?

A: dpdk加用户态协议栈 业界有广泛实践mTCPSeaStar等等很多user space stack, FD.io上,也有两个项目,TLDKVPP Stack,都在快速发展中


Q:能否形象地解释一下dpdksr-iov这两种技术的区别吗?仅仅是对网络性能优化软、硬件两种不同方案,还是本身就不在一个层次,或者是互补功能

A:sr-iov可以在Linux内核驱动 或者DPDK用户态中使用,SR-IOV是规范,DPDK是软件


Q:基于DPDK可以做通用上层应用平台吗?无修改兼容己有成熟软件

A; 应该可以的, 可以学习Alibaba的案例胶片


Q:如果不用sr-iov,而使用ovsdpdk,加dpdk-usernfv最高性能理论上最高能达到多少?

A:这取决于你的模型,不同数量的vm,以及不同的traffic流得到的数据是不一样的,涉及到使用多少CPU资源在后端,多少CPU资源在前端,后续可以专门讨论一下这个话题。


Q:我理解dpdk更好的开发了报文处理的并行性 想请问下dpdk何种机制用来提升线程或进程间通信性能 例如统计计数 qos会需要到 dpdk有特殊设计么?

A:dpdk提供了很多种优化的技术,不仅仅是并行性的优化。进程间通信可以用shared memoryrte_ring,具体可以参考代码里的案例,比如 multi process


Q:dpdk +docker有人用吗

A:dpdk运行在容器中,是当下最流行的一个用法,可以sr-iov, 可以virtio-user作为进入容器的高速接口


Q:后面版本有什么新功能?

A:DPDK Roadmap会发布在网站上,http://www.dpdk.org/dev/roadmap


Q:DPDK以后会提供运行期修改Qos配置的功能吗?

A:现在就可以动态配置Qos的,可以参考最近推出的QoS API,不过,支持高复杂度的QoS的网卡还不多,抽象层的API才推出来,后续会继续完善