DPDK解析-----DPDK,PF_RING对比

DPDK(Data Plane Development Kit)是数据平面开发工具包,由用于加速在各种CPU架构上运行的数据包处理的库组成。

在Linux上捕获数据包有多种方式,常见的有libpcap,pf-ring等。DPDK以高性能著称,想必相比传统的数据包捕获方式,一定有其独到之处。

本文主要就DPDK所使用的技术点进行宏观的说明,并将其与libpcap,pf-ring进行对比,若有写的不对的地方请帮忙指出。

参考文档:
[1]绝对干货!初学者也能看懂的DPDK解析
[2]Linux 设备驱动之 UIO 机制(基本概念)
[3]PF_RING学习笔记

若出现侵权请联系作者删除。

1.DPDK 技术特点


传统的数据包捕获瓶颈往往在于Linux Kernel,数据流需要经过Linux Kernel,就会带来Kernel Spcae和User Space数据拷贝的消耗;系统调用的消耗;中断处理的消耗等。

DPDK针对Linux Kernel传统的数据包捕获模式的问题,进行了一定程度的优化。DPDK的优化可以概括为:

  • UIO+mmap 实现零拷贝(zero copy)
  • UIO+PMD 减少中断和CPU上下文切换
  • HugePages 减少TLB miss
  • 其他代码优化

2.UIO


2.1 UIO简介

UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。

图片引自百度百科

一个设备驱动的主要任务有两个:

  • 存取设备的内存
  • 处理设备产生的中断

如上图所示,对于存取设备的内存 ,UIO 核心实现了mmap();对于处理设备产生的中断,内核空间有一小部分代码用处理中断,用户空间通过read()接口/dev/uioX来读取中断。

2.2 DPDK UIO机制

采用Linux提供UIO机制,可以旁路Kernel,将所有报文处理的工作在用户空间完成。

图片引自参考文档[1]

如上图,左边是传统的数据包获取方式,路径为:
网卡 -> Kernel驱动 -> Kernel TCP/IP协议栈 -> Socket接口 -> 业务
右边是DPDK的方式,基于UIO。数据路径为:
网卡 -> DPDK轮询模式-> DPDK基础库 -> 业务

2.3 DPDK 零拷贝(Zero Copy)

通过UIO+mmap 实现数据零拷贝(zero copy)是DPDK的特点之一。那么常规的Linux Kernel(libpcap)以及pf-ring处理数据包的流程要进行几次数据拷贝呢?

  1. libpcap
    libpcap采用的是传统的数据包获取方式,如上图左边路径。
    网卡接收到数据包后,第一步需要把数据从网卡拷贝到主存(RX buffer)中。但是在这个拷贝的过程中使用了DMA(Direct Memory Access)技术。DMA 传输将数据从一个地址空间复制到另外一个地址空间。由CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成,CPU是不需要参与,也不会产生CPU资源消耗。因此这个第一步的拷贝可以忽略。
    第二步,Kernel会将网卡通过DMA传输进入主存(RX buffer)的内容拷贝一份进行处理,这里进行了一次数据拷贝。
    第三步,由于内核空间和用户空间的内存是不共享的,Kernel会将数据包内容再进行一次拷贝用于用户空间使用。
    综上,传统的数据包捕获方式(libpcap)会进行两次数据包拷贝。

  2. pf-rfing
    pf-ring采用mmap()将传统的两次拷贝减少至一次拷贝。
    第一步,同样使用DMA技术,把数据从网卡拷贝到主存(RX buffer)中。
    第二步,pf-ring会将网卡通过DMA传输进入主存(RX buffer)的内容拷贝一份放入环形缓冲区中(ring)中,这里进行了一次数据拷贝。
    第三步,使用mmap()将环形缓冲区映射至用户空间,用户空间可以直接访问这个环形缓冲区中的数据。

  3. pf-ring zc
    pf-ring zc(zero copy)更是将pf-ring的一次拷贝也省去,达到了零拷贝的目的,具体的:
    第一步,使用DMA技术,把数据从网卡拷贝到主存(RX buffer)中。
    第二步,使用mmap()直接将RX buffer的数据映射到用户用户空间,使用户空间可以直接访问RX buffer的数据。
    下图非常清晰地展示了pf-ring zc实现零拷贝的过程:

    图片引自参考文档[3]

  4. DPDK
    DPDK实现零拷贝的方式与pf-ring zc类似,首先通过DMA将网卡数据拷贝至主存(RX buffer);随后使用mmap()直接将RX buffer的数据映射到用户用户空间,使用户空间可以直接访问RX buffer的数据,以此实现了零拷贝。

由上述可以看出,pf-ring zc和dpdk均可以实现数据包的零拷贝,两者均旁路了内核,但是实现原理略有不同。pf-ring zc通过zc驱动(也在应用层)接管数据包,dpdk基于UIO实现。

除了UIO之外,dpdk还支持VFIO。关于VFIO的介绍可以参考下面链接:
https://kernelgo.org/vfio-introduction.html

值得注意的是,无论是pf-ring zc还是dpdk,旁路内核就意味着应用程序完全接管网卡,这样一来,当通过UIO驱动或ZC驱动打开设备时,设备将无法用于标准网络。

3.PMD


DPDK的UIO驱动屏蔽了硬件发出中断,然后在用户态采用主动轮询的方式,这种模式被称为PMD(Poll Mode Driver)。

正常情况下,网卡收到数据包后,会发出中断信号,CPU接收到中断信号后,会停止正在运行的程序,保护断点地址和处理机当前状态,转入相应的中断服务程序并执行中断服务程序,完成后,继续执行中断前的程序。

DPDK采用轮询的方式,直接访问RX和TX描述符而没有任何中断,以便在用户的应用程序中快速接收,处理和传送数据包。这样可以减少CPU频繁中断,切换上下文带来的消耗。

在网卡大流量时,DPDK这种PMD的方式会带来较大的性能提升;但是在流量小的时候,轮询会导致CPU空转(不断轮询),从而导致CPU性能浪费和功耗问题。

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

与DPDK相比,pf-ring(no zc)使用的是NAPI polling和应用层polling,而pf-ring zc与DPDK类似,仅使用应用层polling。


图片引自官网

4.HugePages


Linux系统默认采用4KB作为页的大小(page size),页的大小越小,设备的内存越大,页面的个数就越多,页表的开销就越大,页表的内存占用也越大。

在操作系统引入MMU(Memory Management Unit)后,CPU读取内存的数据需要两次访问内存。第一次要查询页表将逻辑地址转换为物理地址,然后访问该物理地址读取数据或指令。

为了减少页数过多,页表过大而导致的查询时间过长的问题,便引入了TLB(Translation Lookaside Buffer),可翻译为地址转换缓冲器。TLB是一个内存管理单元,一般存储在寄存器中,里面存储了当前最可能被访问到的一小部分页表项。

引入TLB后,CPU会首先去TLB中寻址,由于TLB存放在寄存器中,且其只包含一小部分页表项,因此查询速度非常快。若TLB中寻址成功(TLB hit),则无需再去RAM中查询页表;若TLB中寻址失败(TLB miss),则需要去RAM中查询页表,查询到后,会将该页更新至TLB中。

而DPDK采用HugePages ,在x86-64下支持2MB、1GB的页大小,大大降低了总页个数和页表的大小,从而大大降低TLB miss的几率,提升CPU寻址性能。

5. 其他代码优化


目前对DPDK的代码研究还不是很深入,这里摘录自参考文档1

  1. SNA(Shared-nothing Architecture)

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

  1. SIMD(Single Instruction Multiple Data)

从最早的mmx/sse到最新的avx2,SIMD的能力一直在增强。DPDK采用批量同时处理多个包,再用向量编程,一个周期内对所有包进行处理。比如,memcpy就使用SIMD来提高速度。

SIMD在游戏后台比较常见,但是其他业务如果有类似批量处理的场景,要提高性能,也可看看能否满足。

  1. 不使用慢速API

  2. cpu affinity

  3. 编译执行优化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 1. 简介 本文档包含DPDK软件安装和配置的相关说明。旨在帮助用户快速启动和运行软件。文档主要描述了在Linux...
    半天妖阅读 17,892评论 0 22
  • 1、PF_RING简介 PF_RING是Luca研究出来的基于Linux内核级的高效数据包捕获技术。简单来说PF_...
    shaarawy18阅读 22,265评论 1 17
  • 目录: 虚拟化 dpdk的实现研究virtiovhostSR-IOV热迁移相关 研究拓展 本文记录近期对dpdk在...
    分享放大价值阅读 6,963评论 0 3
  • 背景 2017年年初以来,随着Redis产品的用户量越来越大,接入服务越来越多,再加上美团点评Memcache和R...
    SithCait阅读 700评论 0 0
  • 我知道我还是只是一个无根之萍,从学校实习开始到现在已经快要1年半了,自己的目标还是没有达到。不知道为什么?是不是自...
    小猪的花阅读 137评论 0 0