冲破内核限制,提升服务器千万QPS的性能

服务器 0

大家好,这里是极客重生,移动互联网爆炸式发展,导致网络流量徒增,从而推动着网络技术不断地发展,而CPU的运行频率基本停留在10年前的水平,为了迎接超高速网络技术的挑战,软件也需要大幅度创新,结合硬件技术的发展,DPDK(Data Plane Development Kit),一个以软件优化为主的数据面技术应时而生,它为今天高性能网络IO技术的发展提供了绝佳的平台可行性。

1678da8423d7b3a1544fd4e6457be4d1.png

极客星球:深入理解网络编程

同时作为技术人员,我们可以从中DPDK学习大量的高性能编程技巧和代码优化技巧,包括高性能软件架构最佳实践高效数据结构设计内存优化技巧应用程序性能分析以及网络性能优化的技巧,深入理解DPDK原理,对软件性能优化的理解会上升一个level。

文章目录

一、  网络IO的处境和趋势

二、  Linux + x86网络IO瓶颈

三、  DPDK的基本原理

四、  DPDK的基石UIO

五、  DPDK核心优化:PMD

六、  DPDK的高性能代码实现

七、  高性能编程技术和代码优化技术(总结)

八、  ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍DPDK生态

欢迎校招和社招同学加入极客星球2.0(升级版),一起快速进步,升职加薪:

  • 修炼基本功(职业发展基础):分享多年基础技术深度理解,基础概念深度解析,经典书籍推荐和读书分享(一起带领大家精读几本好书,解决书中疑问,读一本相当别人读十本),经典源码阅读分享等,不定期直播分享和答疑解惑;

  • 扩展技术和商业视野(认知和视野):分享热门技术发展,国内外大厂技术内幕,业界解决方案;

  • 校招/社招免费就业指导(找到好工作):模拟面试,简历修改,面试题分析,学习路线就业指导,面试高薪工作指导等;

  • 职场普升/技术专家(职场发展):分享各种不同公司宝贵的职场普升经验,技术方向选择, 大厂普升经验,技术专家成长经验,让你少走几年的弯路;

  • 专属高质量交流群(人脉圈子):技术趋势,技术热点,分享学习心得,技术学习讨论,技术趋势,技术热点,分享学习心得,技术学习讨论,技术难题分享,群里有已经在各个大厂的同学和前辈,找到志同道合朋友,相互请教和学习;

    b0d1334f798269bef5a1c7e0b19e992e.jpegc005055c34a134ac8734579ea67e472a.png9db1c82ffc7f5961ede9c1b8684d56c8.png

    硬核深入理解系列:

  • 深入理解计算机系统

  • 深入理解操作系统(调度,内存,网络,IO)

  • 深入理解并发技术全景指南

  • 深入理解编程语言

  • 深入理解算法与数据结构

  • 深入理解网络协议

  • 深入理解网络编程

  • 深入理解性能优化  (进大厂,升级高级工程师的核心能力)

  • 深入理解分布式技术(互联网大厂必备核心技能)

  • 深入理解数据库

  • 深入理解代码设计

  • 深入理解架构设计

详细了解:极客星球  ,现在加入超级优惠,早点加入一起学习成长,早点突破成长瓶颈,记得加我微信:fr35331508, 拉你进极客星球的群:

edcdc9fabee2d461fdaa9047574cb6a8.png

一、网络IO的处境和趋势

从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10GE/25GE/40GE/100GE/200GE/400GE的演变,从中可以得出单机的网络IO能力必须跟上时代的发展。

1. 单机性能的飙升

网卡从1G到100G的发展,CPU从单核到多核到多CPU的发展,服务器的单机能力通过横行扩展达到新的高点。但是软件开发却无法跟上节奏,单机处理能力没能和硬件门当户对,如何开发出与时并进高吞吐量的服务,单机百万千万并发能力。即使有业务对QPS要求不高,主要是CPU密集型,但是现在大数据分析、人工智能等应用都需要在分布式服务器之间传输大量数据完成作业。这点应该是我们互联网后台开发最应关注,也最关联的。

2. 传统的电信领域

IP层及以下,例如路由器、交换机、防火墙、基站等设备都是采用硬件解决方案。基于专用网络处理器(NP),有基于FPGA,更有基于ASIC的。但是基于硬件的劣势非常明显,发生Bug不易修复,不易调试维护,并且网络技术一直在发展,例如2G/3G/4G/5G等移动技术的革新,这些属于业务的逻辑基于硬件实现太痛苦,不能快速迭代。传统领域面临的挑战是急需一套软件架构的高性能网络IO开发框架。

3. 云计算的发展

云计算的出现通过网络虚拟化(NFV)共享硬件成为趋势,NFV的定义是通过标准的服务器、标准交换机实现各种传统的或新的网络功能(NAT,LB,VXLAN,VPN,VPC等)。急需一套基于常用系统和标准服务器的高性能网络IO开发框架。

二、Linux + x86网络IO瓶颈

根据经验,在C1(8核)上跑应用每1W包处理需要消耗1%软中断CPU,这意味着单机的上限是100万PPS(Packet Per Second)。从TGW(Netfilter版)的性能100万PPS,AliLVS优化了也只到150万PPS,并且他们使用的服务器的配置还是比较好的。假设,我们要跑满10GE网卡,每个包64字节,这就需要2000万PPS。

:以太网万兆网卡速度上限是1488万PPS,因为最小帧大小为84B

《Bandwidth, Packets Per Second, and Other Network Performance Metrics》

100G是2亿PPS,即每个包的处理耗时不能超过50纳秒。而一次Cache Miss,不管是TLB、数据Cache、指令Cache发生Miss,回内存读取大约65纳秒,NUMA体系下跨Node通讯大约40纳秒。所以,即使不加上业务逻辑,即使纯收发包都如此艰难。我们要控制Cache的命中率,我们要了解计算机体系结构,不能发生跨Node通讯。

从这些数据,我希望可以直接感受一下这里的挑战有多大,理想和现实,我们需要从中平衡。内核弊端(问题)

  • 上下文切换 传统的收发报文方式都必须采用硬中断来做通讯,每次硬中断大约消耗100微秒,这还不算因为终止上下文所带来的Cache Miss。

  • 内存拷贝: 数据必须从内核态用户态之间切换拷贝带来大量CPU消耗,全局锁竞争。

  • 处理路径:Linux协议栈处理路径长,多核扩展性不足,系统调用开销大。

  • 多核并发:内核工作在多核上,为可全局一致,即使采用Lock Free,也避免不了锁总线、内存屏障带来的性能损耗。

  • 局部性失效:从网卡到业务进程,经过的路径太长,有些其实未必要的,例如netfilter框架,这些都带来一定的消耗,而且容易Cache Miss。

三、DPDK的基本原理

从前面的分析可以得知IO实现的方式、内核的瓶颈,以及数据流过内核存在不可控因素,这些都是在内核中实现,内核是导致瓶颈的原因所在,要解决问题需要绕过内核。所以主流解决方案都是旁路网卡IO,绕过内核直接在用户态收发包来解决内核的瓶颈。

Linux社区也提供了旁路机制Netmap,官方数据10G网卡1400万PPS,但是Netmap没广泛使用。其原因有几个:

  1. Netmap需要驱动的支持,即需要网卡厂商认可这个方案。

  2. Netmap仍然依赖中断通知机制,没完全解决瓶颈。

  3. Netmap更像是几个系统调用,实现用户态直接收发包,功能太过原始,没形成依赖的网络开发框架,社区不完善。

业内通常采用消除海量中断、旁路内核协议栈、减少内存拷贝、CPU 多核任务分担、Intel VT 等技术来综合提升服务器数据平面的报文处理性能,普通用户较难掌握。业界迫切需要一种综合的性能优化方案,同时提供良好的用户开发和商业集成环境,DPDK 加速技术方案成为其中的典型代表。

那么,我们来看看发展了十几年的DPDK,从Intel主导开发,到华为、思科、AWS等大厂商的加入,核心玩家都在该圈子里,拥有完善的社区,生态形成闭环。早期,主要是传统电信领域3层以下的应用,如华为、中国电信、中国移动都是其早期使用者,交换机、路由器、网关是主要应用场景。但是,随着上层业务的需求以及DPDK的完善,在更高的应用也在逐步出现,尤其当前云计算领域(网络吞吐量巨大),已经成为云网络主要的核心技术之一。

DPDK 是一个开源的数据平面开发工具集,提供了一个用户空间下的高效数据包处理库函数,它通过环境抽象层旁路内核协议栈、轮询模式的报文无中断收发、优化内存/缓冲区/ 队列管理、基于网卡多队列和流识别的负载均衡等多项技术,实现了在 x86 处理器架构下的高性能报文转发能力,用户可以在 Linux 用户态空间开发各类高速转发应用,也适合与各类商业化的数据平面加速解决方案进行集成。

英特尔在 2010 年启动了对 DPDK 技术的开源化进程,于当年 9 月通过 BSD 开源许可协议正式发布源代码软件包,为开发者提供支持。开源社区的参与者们大幅推进了 DPDK 的技术创新和快速演进, 而今它已发展成为 SDN 和 NFV 的一项关键技术。

58dd386b5a80827767cc4b346ce072bd.png

DPDK旁路原理

左边是内核协议栈:

 网卡 -> 驱动 -> 协议栈 -> Socket接口 -> 业务

右边是DPDK的方式(基于UIO(Userspace I/O)旁路数据):

网卡 -> DPDK轮询模式-> DPDK基础库 -> 业务

用户态的好处是易用开发和维护,灵活性好。并且Crash也不影响内核运行,鲁棒性强。

而DPDK不光是bypass 内核协议栈,还无所不及地采用各种手段,把凡是能够影响的网络IO性能的瓶颈点都做了极致的优化。

6cc808f5cb5a834074d97ab1841676ba.png

DPDK架构

核心模块

  • 环境抽象层

      环境抽象层 (EAL) 提供了一个通用接口,该接口对应用程序和库隐藏了环境细节。EAL 提供的服务是:

  • DPDK 加载和启动

  • 支持多进程和多线程执行类型

  • 核心关联/分配程序

  • 系统内存分配/解除分配

  • 原子/锁操作

  • 时间参考

  • PCI总线访问

  • 跟踪和调试功能

  • CPU特性识别

  • 中断处理

  • 报警操作

  • 内存管理(malloc)

  • 环管理器 (librte_ring)

    环形结构在有限大小的表中提供了一个无锁的多生产者、多消费者 FIFO API。它比无锁队列有一些优势;更容易实施,适应批量操作,速度更快。环由内存池管理器 (librte_mempool) 使用,并可用作核心和/或逻辑核心上连接在一起的执行块之间的通用通信机制。

  • 内存池管理器 (librte_mempool)

    内存池管理器负责分配内存中的对象池。池由名称标识并使用环来存储空闲对象,它提供了一些其他可选服务,例如每核对象缓存和对齐助手,以确保填充对象以在所有 RAM 通道上均匀分布它们。

  • 网络数据包缓冲区管理 (librte_mbuf)

    mbuf 库提供了创建和销毁缓冲区的功能,DPDK 应用程序可以使用这些缓冲区来存储消息缓冲区。消息缓冲区在启动时创建并存储在内存池中,使用 DPDK 内存池库。该库提供了一个 API 来分配/释放 mbuf,操作用于承载网络数据包的数据包缓冲区。

  • 定时器管理器 (librte_timer)

    该库为 DPDK 执行单元提供定时器服务,提供异步执行功能的能力。它可以是周期性的函数调用,也可以是一次性调用。它使用环境抽象层 (EAL) 提供的计时器接口来获取精确的时间参考,并且可以根据需要在每个内核的基础上启动。

  •  以太网* 轮询模式驱动程序架构

    DPDK 包括用于 1 GbE、10 GbE 和 40 GbE 的轮询模式驱动程序 (PMD),以及半虚拟化的 virtio 以太网控制器,这些控制器旨在在没有异步、基于中断的信号机制的情况下工作。

  • 数据包转发算法支持

    DPDK 包括哈希(librte_hash)和最长前缀匹配(LPM,librte_lpm)库,以支持相应的数据包转发算法。

  • librte_net

    librte_net 库是 IP 协议定义和便利宏的集合。它基于 FreeBSD* IP 堆栈中的代    码,包含协议编号(用于 IP 标头)、IP 相关宏、IPv4/IPv6 标头结构以及 TCP、UDP 和 SCTP 标头结构。

DPDK优点

  • PMD用户态驱动,使用无中断方式直接操作网卡的接收和发送队列;

  • 采用HugePage减少TLB Miss;

  • DPDK采用向量SIMD指令优化性能;

  • CPU亲缘性和独占;

  • 内存对齐:根据不同存储硬件的配置来优化程序,确保对象位于不同channel和rank的起始地址,这样能保证对象并并行加载,性能也能够得到极大的提升;

  • Cache对齐,提高cache访问效率:

  • NUMA亲和,提高numa内存访问性能;

  • 减少进程上下文切换:保证活跃进程数目不超过CPU个数;减少堵塞函数的调用,尽量采样无锁数据结构;

  • 利用空间局部性,采用预取Prefetch,在数据被用到之前就将其调入缓存,增加缓存命中率;

  • 充分挖掘网卡的潜能:借助现代网卡支持的分流(RSS, FDIR)和卸载(TSO,chksum)等特性;

DPDK支持的CPU体系架构

x86、ARM、PowerPC(PPC)

DPDK支持的网卡列表

https://core.dpdk.org/supported

四、DPDK的基石UIO

为了让驱动运行在用户态,Linux提供UIO机制。使用UIO可以通过read感知中断,通过mmap实现和网卡的通讯。

UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题.通过UIO的运行原理图可以看出,用户空间下的驱动程序比运行在内核空间的驱动要多得多,UIO框架下运行在内核空间的驱动程序所做的工作比较简单。

UIO原理:

4a0a7c3b7b275090d62f455fbdf8b6f5.png

要开发用户态驱动有几个步骤:

‍‍‍1.开发运行在内核的UIO模块(分配和记录设备需要的资源和注册uio设备),因为硬中断只能在内核处理;

2.通过/dev/uioX读取中断;

3.通过mmap和外设共享内存,实现零拷贝;

五、DPDK核心优化:PMD

UIO旁路了内核,主动轮询去掉硬中断,DPDK从而可以在用户态做收发包处理。带来Zero Copy、无系统调用的好处,同步处理减少上下文切换带来的Cache Miss。

运行在PMD的Core会处于用户态CPU100%的状态

caa2f2d6ef15e2611cb972542d516e2f.png

网络空闲时CPU长期空转,会带来能耗问题。所以,DPDK推出Interrupt DPDK模式。

Interrupt DPDK:

82bc71b7984db4c51a8970dbfde33bd9.png

图片引自David Su/Yunhong Jiang/Wei Wang的文档《Towards Low Latency Interrupt Mode DPDK》

它的原理和NAPI很像,就是没包可处理时进入睡眠,改为中断通知。并且可以和其他进程共享同个CPU Core,但是DPDK进程会有更高调度优先级。

六、DPDK的高性能代码实现

1. 采用HugePage减少TLB Miss

49b09837ac1dca04e6ea3965ecc32c80.png

默认下Linux采用4KB为一页,页越小内存越大,页表的开销越大,页表的内存占用也越大。CPU有TLB(Translation Lookaside Buffer)成本高所以一般就只能存放几百到上千个页表项。如果进程要使用64G内存,则64G/4KB=16000000(一千六百万)页,每页在页表项中占用16000000 * 4B=62MB。如果用HugePage采用2MB作为一页,只需64G/2MB=2000,数量不在同个级别。

ea663742860016beecc4f598a92c7bf4.png

而DPDK采用HugePage,在x86-64下支持2MB、1GB的页大小,几何级的降低了页表项的大小,从而减少TLB-Miss。并提供了内存池(Mempool)、MBuf、无锁环(Ring)、Bitmap等基础库。根据我们的实践,在数据平面(Data Plane)频繁的内存分配释放,必须使用内存池,不能直接使用rte_malloc,DPDK的内存分配实现非常简陋,不如ptmalloc。

2. SNA(Shared-nothing Architecture)

8236b4f6d8e584cc3e92ece1cd744b23.png

软件架构去中心化,尽量避免全局共享,带来全局竞争,失去横向扩展的能力。NUMA体系下不跨Node远程使用内存。

3. SIMD(Single Instruction Multiple Data)

8010d058cf0a581fdaa5cab3ab8622b5.png

从最早的mmx/sse到最新的avx2,SIMD的能力一直在增强。DPDK采用批量同时处理多个包,再用向量编程,一个周期内对所有包进行处理。比如,memcpy就使用SIMD来提高速度。SIMD在游戏后台比较常见,但是其他业务如果有类似批量处理的场景,要提高性能,也可看看能否满足。

4. 不使用慢速API

这里需要重新定义一下慢速API,比如说gettimeofday,虽然在64位下通过vDSO已经不需要陷入内核态,只是一个纯内存访问,每秒也能达到几千万的级别。但是,不要忘记了我们在10GE下,每秒的处理能力就要达到几千万。所以即使是gettimeofday也属于慢速API。DPDK提供Cycles接口,例如rte_get_tsc_cycles接口,基于HPET或TSC实现。

在x86-64下使用RDTSC指令,直接从寄存器读取,需要输入2个参数,比较常见的实现:

366a87888100d75d2fc6533dc042d489.png

这么写逻辑没错,但是还不够极致,还涉及到2次位运算才能得到结果,我们看看DPDK是怎么实现:

86be287c4d7df681397f69df888f6a07.png

巧妙的利用C的union共享内存,直接赋值,减少了不必要的运算。但是使用tsc有些问题需要面对和解决

1) CPU亲和性,解决多核跳动不精确的问题

2) 内存屏障,解决乱序执行不精确的问题

3) 禁止降频和禁止Intel Turbo Boost,固定CPU频率,解决频率变化带来的失准问题

5. 编译执行优化

1) 分支预测

8c06b2b7ee08175abac050945f4e0515.png

现代CPU通过pipeline、superscalar提高并行处理能力,为了进一步发挥并行能力会做分支预测,提升CPU的并行能力。遇到分支时判断可能进入哪个分支,提前处理该分支的代码,预先做指令读取编码读取寄存器等,预测失败则预处理全部丢弃。我们开发业务有时候会非常清楚这个分支是true还是false,那就可以通过人工干预生成更紧凑的代码提示CPU分支预测成功率。

f56cfaa382b2f0013e0a5e635ebe7385.png

2) CPU Cache预取

f2be6876554383cbbade39d5ffa4a670.png

Cache Miss的代价非常高,回内存读需要65纳秒,可以将即将访问的数据主动推送的CPU Cache进行优化。比较典型的场景是链表的遍历,链表的下一节点都是随机内存地址,所以CPU肯定是无法自动预加载的。但是我们在处理本节点时,可以通过CPU指令将下一个节点推送到Cache里。

API文档:https://doc.dpdk.org/api/rte__prefetch_8h.html

87db0c15c81ffcf23d1bab094a35bd16.png

3) 内存对齐

b1e99ac21ba833d1a3f10cf11471039c.jpeg

内存对齐有2个好处:

3.1 避免结构体成员跨Cache Line,需2次读取才能合并到寄存器中,降低性能。结构体成员需从大到小排序和以及强制对齐。

参考《Data alignment: Straighten up and fly right》

0dc68e3d6334bd54023e2a1e4e63b29d.png

3.2 多线程场景下写产生False sharing,造成Cache Miss,结构体按Cache Line对齐

43fd5a3fb9a388ed334682a351cf014b.jpeg

dd3225b6b5057c975edbf919b411d632.png

4) 常量优化

常量相关的运算的编译阶段完成。比如C++11引入了constexp,比如可以使用GCC的__builtin_constant_p来判断值是否常量,然后对常量进行编译时得出结果。举例网络序主机序转换

f2f5ae78b4133cdfb7267a3166190141.png

其中rte_constant_bswap32的实现

ea63742359341d0f699d29e389e9978e.png

5)使用CPU指令

现代CPU提供很多指令可直接完成常见功能,比如大小端转换,x86有bswap指令直接支持了。

f66cccde72f118955b2af6b619c6d93b.png

这个实现,也是GLIBC的实现,先常量优化、CPU指令优化、最后才用裸代码实现。毕竟都是顶端程序员,对语言、编译器,对实现的追求不一样,所以造轮子前一定要先了解好轮子。

Google开源的cpu_features可以获取当前CPU支持什么特性,从而对特定CPU进行执行优化。高性能编程永无止境,对硬件、内核、编译器、开发语言的理解要深入且与时俱进。

七、高性能编程技术和代码优化

性能评估公式

43b31b45d906a22cc90a8f8df010a12f.png

  • IPP 表示代码的复杂程度,IPC 表示代码执行的效率

  • 2G主频CPU处理10G网卡达到线速•2GHz/14.8Mpps =134 clock cycles

1.用户空间轮询

  • 减少中断带来开销;

  • 减少系统调用带来开销;

  • 零拷贝减少内存拷贝的时间;

  • 轮询 Polling,busy looping 提供了I/O批量处理的可能性;

  • 避免中断性能瓶颈是DPDK提升数据包处理速度的关键之一;

2.多核CPU性能优化

  • RSS硬件队列;

  • CPU独占:独占CPU资源,减少调度影响,提高系统性能;

  • CPU绑定:减少CPU上下文切换,提高系统性能;

  • 中断亲和 : 中断负载均衡,减轻其他CPU负担,提高系统性能;

  • 进程亲和:减少CPU上下文切换,提高系统性能;

  • 中断隔离:减少中断对CPU调度影响,提高系统性能;

  • Per CPU:Per-CPU是基于空间换时间的方法, 让每个CPU都有自己的私有数据段(放在L1中),并将一些变量私有化到 每个CPU的私有数据段中. 单个CPU在访问自己的私有数据段时, 不需要考虑其他CPU之间的竞争问题,也不存在同步的问题.  注意只有在该变量在各个CPU上逻辑独立时才可使用;

3. 锁优化

  • 无锁数据结构,将并发最大化;

  • Per-CPU设计,尽量避免资源竞争;

  • 采用RCU机制,读写共享数据可以无锁并行;

  • spinlock,采用非阻塞锁,防止上下文切换导致cache miss;

  • 采用CAS原子操作(Compare and Swap)进行无锁设计;

4.批量处理

  • 轮询机制允许一次接收或发送多个报文;

  • 批量处理分摊的接收或发送操作本身的开销;

  • 绝大部分报文需要做相同或相似的计算处理,意味着相同的指令会被反复地执行,报文的批量计算分摊了函数调用的上下文切换,堆栈的初始化等等开销,同时大大减少了l1i cache miss

  • 对于某一个函数,l1icache miss 仅仅发生在第一个报文被处理的时刻

  • 批量计算提供了更好的代码优化可能性(数据预取,多重循环等)

5.Cache优化

  • CPU的速度远远大于RAM的速度

  • 程序在运行时具有局部性规律

        时间局部性,很快还会访问

        空间局部性,相邻也会访问

  • 不同级别cache速度差异 L1 > L2 > L3

  • 减少Cache Miss是提升性能的关键

  • Cache 层次化结构

28ce8ea228c9111da65ac2c254851b48.png

  • iCacheMiss 常常被忽略

       更优的代码,编译器优化选项

       更小的代码尺寸

       更好的代码布局- 分支预测

  • 代码布局影响iCache命中率

4bdab8f9bb83acf18d138ec905bbf716.png

            B 段代码较少会被调用

  • Cache一致性问题

    原则是避免多个核访问同一个内存地址或数据结构

    在数据结构上,每个核都有独立的数据结构

    多个核访问同一个网卡:每个核都创建单独的接收队列和发送队列

6. 代码优化技巧

  • Cache Line 对齐,减少dCache miss, 避免伪共享;

  • 数据预取,减少dCache miss, prefetch 指令;

  • 分支预测,优化代码布局, 提高CPU流水线效率;‍‍‍‍‍‍

  • 函数内联,减少函数调用开销;

  • CPU扩展指令集SIMD:sse,avx,减少指令数量,最大化的利用一级缓存访存的带宽;

  • 多重循环处理报文,更好地优化CPU流水线;

  • 编译器优化;

八、DPDK应用生态

对我们互联网后台开发来说DPDK框架本身提供的能力还是比较裸的,比如要使用DPDK就必须实现TCP/IP协议栈(ARP,IP,TCP/UDP, socket等)这些基础功能,有一定上手难度。如果要更高层的业务使用,还需要用户态的协议栈支持。不建议直接使用DPDK。

594ef049f003c66b69980410518bd000.png

应用

目前生态完善,社区强大(一线大厂支持)的应用层开发项目是FD.io(The Fast Data Project),有思科开源支持的VPP,比较完善的协议支持,ARP、VLAN、Multipath、IPv4/v6、MPLS等。用户态传输协议UDP/TCP有TLDK。从项目定位到社区支持力度算比较靠谱的框架。

e44b5489b706e20a98d201b459ad1485.png

Fd.io: The Universal Dataplane

FD.io(快速数据 - 输入/输出)是多个项目和库的集合,用于扩展基于数据平面开发套件 (DPDK) 的应用,以在通用硬件平台上支持灵活、可编程和可组合的服务。FD.io 为软件定义基础设施开发人员社区提供了一个登陆站点,其中包含多个项目:

965ecfcde8d04bb9a5fc3e448a0391a5.jpeg

促进基于软件的数据包处理的创新,以创建适用于许多架构(x86、ARM、 PowerPC)和部署环境(裸机、VM、容器)。

OVS

4bf52958f44e77a4790dd2a38a8cfb0c.jpeg

Open vSwitch 是一个多核虚拟交换机平台,支持标准的管理接口和开放可扩展的可编程接口,支持第三方的控制接入。

https://github.com/openvswitch/ovs

VPP

VPP 是 cisco 开源的一个高性能的包处理框架,提供了 交换/路由 功能,在虚拟化环境中,使它可以当做一个虚拟交换机来使用。在一个类 SDN 的处理框架中,它往往充当数据面的角色。经研究表明,VPP 性能要好于 ovs+dpdk 的组合,但它更适用于NFV,适合做特定功能的网络模块。

https://wiki.fd.io/view/VPP

Lagopus

Lagopus 是另一个多核虚拟交换的实现,功能和 OVS 差不多,支持多种网络协议,如 Ethernet,VLAN,QinQ,MAC-in-MAC,MPLS 和 PBB,以及隧道协议,如 GRE,VxLan 和 GTP。

https://github.com/lagopus/lagopus/blob/master/QUICKSTART.md

OPENCONTRAIL

一个集成了 SDN 控制器的虚拟路由器,现在多用在 OpenStack 中,结合 Neutron 为 OpenStack 提供一站式的网络支持。

http://www.opencontrail.org/

CloudRouter

一个分布式的路由器。

https://cloudrouter.org/

用户空间协议栈

mTCP

mTCP 是一个针对多核系统的高可扩展性的用户空间 TCP/IP 协议栈。

https://github.com/eunyoung14/mtcp/blob/master/README

IwIP

IwIP 针对 RAM 平台的精简版的 TCP/IP 协议栈实现。

http://git.savannah.gnu.org/cgit/lwip.git/tree/README

Seastar

Seastar 是一个开源的,基于 C++ 11/14 feature,支持高并发和低延迟的异步编程高性能库。

http://www.seastar-project.org/

f-stack

腾讯开源的用户空间协议栈,移植于 FreeBSD协议栈,粘合了 POSIX API,上层应用(协程框架,Nginx,Redis),纯 C 编写,易上手。

https://github.com/f-stack/f-stack

可以从事开发岗位

  • 高级网络开发工程师

  • DPDK开发工程师

  • 云产品研发工程师

  • 云基础开发工程师

  • 高性能优化工程师

  • SDN开发工程师

  • NFV开发工程师

参考

GBN手札 - 一文看懂DPDK

https://feisky.gitbooks.io/sdn

https://www.dpdk.org/

http://doc.dpdk.org/guides/prog_guide/index.html

https://www.cnblogs.com/bakari/p/8404650.html

最后

DPDK的内容远不止如此,如果对DPDK感兴趣可以参考更多内容:

DPDK官网

https://www.dpdk.org/

DPDK源码

https://github.com/DPDK/dpdk

DPDK编程指南

http://doc.dpdk.org/guides/prog_guide/index.html

经典书籍推荐

《深入浅出DPDK》

- END -


欢迎校招和社招同学加入极客星球2.0(升级版),一起快速进步,升职加薪:

  • 修炼基本功(职业发展基础):分享多年基础技术深度理解,基础概念深度解析,经典书籍推荐和读书分享(一起带领大家精读几本好书,解决书中疑问,读一本相当别人读十本),经典源码阅读分享等,不定期直播分享和答疑解惑;

  • 扩展技术和商业视野(认知和视野):分享热门技术发展,国内外大厂技术内幕,业界解决方案;

  • 校招/社招免费就业指导(找到好工作):模拟面试,简历修改,面试题分析,学习路线就业指导,面试高薪工作指导等;

  • 职场普升/技术专家(职场发展):分享各种不同公司宝贵的职场普升经验,技术方向选择, 大厂普升经验,技术专家成长经验,让你少走几年的弯路;

  • 专属高质量VIP交流群(人脉圈子):技术趋势,技术热点,分享学习心得,技术学习讨论,技术难题分享,群里有已经在各个大厂的同学和前辈,找到志同道合朋友,相互请教和学习;

    870dfcbe225f09c6545e657277d6003a.jpeg5ab174e63ee6ef7ff5f8b3f062a7482c.pngf2458268dc35e144d5b96d6fe3f8aae2.png

    硬核深入理解系列:

  • 深入理解计算机系统

  • 深入理解操作系统(调度,内存,网络,IO)

  • 深入理解并发技术全景指南

  • 深入理解编程语言

  • 深入理解算法与数据结构

  • 深入理解网络协议

  • 深入理解网络编程

  • 深入理解性能优化  (进大厂,升级高级工程师的核心能力)

  • 深入理解分布式技术(互联网大厂必备核心技能)

  • 深入理解数据库

  • 深入理解代码设计

  • 深入理解架构设计

详细了解:极客星球  ,现在加入超级优惠,早点加入一起学习成长,早点突破成长瓶颈,专属的VIP群,任何技术难题都在讨论,每天都在进步,记得加我微信:fr35331508, 拉你进极客星球的群:

ca707d562a3e389858b97f4b581063b5.png

    坚持干货内容,欢迎大家关注极客重生  

感谢大家在看,转发,点赞

推荐阅读;

后端开发成长指南

做完这些lab,国内外大厂横着走

Linux黑科技:浅析动态追踪技术

大厂年终奖,有人欢喜有人忧!

也许您对下面的内容还感兴趣: