ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:24.91KB ,
资源ID:4332347      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4332347.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DPDK安装步骤详细说明.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DPDK安装步骤详细说明.docx

1、DPDK安装步骤详细说明前言DPDK是专为快速收发包所开发的一系列的库文件和驱动代码。可以在Intel的芯片上运行。可以用来在极短的时间里面完成收发包(一般低于80个周期) 可以开发快速的抓包算法。可以运行第三方的快速路径栈而DPDK最大的优点就是改进小封包吞吐量与作业负荷效能,传统的网路架构都是针对大封包吞吐量进行最佳化,而Intel DPDK可以解决小封包所带来效能不佳的问题。除了应用在企业终端外, Intel DPDK 也可以在软体定义网路 (SDN) 与网路功能虚拟化 (NFV) 中扮演着重要的角色。本文主要是对官方提供的intel-dpdk-getting-started-guide

2、 Revision-002进行总结,提取其中的关键知识点。同时对一些知识点进行了延伸,方便新手对DPDK的一些相关概念有个基本的认识,对整个DPDK的安装过程有个整体的认识第一章一些基本概念刚开始接触DPDK的时候,会遇到很多基本的概念,通过后面的测试实践发现,很多时候都是由于基本概念不明导致错误不能被检查出来,所有本文总结了一些相关的概念,同时对概念下面的一些子概念也进行了一定的延伸。一.1Linux环境下的UIO( Userspace I/O )UIO指的是运行在用户空间的I/O技术,是实现用户空间下驱动程序的支撑机制。 Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用

3、程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题。由于DPDK是应用层平台,所以与此紧密相连的网卡驱动程序(主要是intel自身的千兆igb与万兆ixgbe驱动程序)都通过uio机制运行在用户态下。 Intel DPDK 的igb_uio内核模块依赖于内核的UIO。 需要以模块方式编译可以通过如下命令进行编译sudo /sbin/modprobe uio一.2大内存页(Hugepages)机制一.2.1如何配置大内存页大内存页指的是为包处理的缓冲区缓冲区分配更大的大内存池,利用大内存页

4、的主要好处当然是通过利用大内存页提高内存使用效率。可以得到明显的性能提高,因为需要更少的页,更少的TLB( Translation Lookaside Buffers),减少了虚拟页地址到物理页地址的转换时间。如果不使用大内存页机制的话,TLB的命中率会降低,反而会降低性能。大内存页最好在启动的时候进行分配,这样可以避免物理空间中有太多的碎片,提高发包的效率。普通的页大小为4KB, 默认的大内存页的大小为2MB,也可以设置其他的大内存页大小,可以可以从CPU的标识中看出支持哪种大内存页如果有 “pse”的标识,说明支持2M的大内存页。 如果有“pdpe1gb”的标识,说明支持1G的大内存页。

5、如果64位机建议使用1GB的大页。比如如果想设置一个4G的大内存页,而且这个大内存页由4个1G大小的页构成,可以把如下配置传递给内核。default_hugepagesz=1G hugepagesz=1G hugepages=4 但是如果使用大量的大内存页的话,最好增加当前登录会话打开文件限制,以减少运行DPDK程序时发生的错误。可以使用ulimit的命令,比如ulimit -Sn 2048。在两插槽的NUMA系统中, 大内存页会在两个插槽的CPU中进行平均分配。对于2MB的大内存页的情况,也可以在系统启动以后再进行大内存页的分配。在NON-NUMA系统, 使用命令echo 1024 /sys

6、/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages。对于NUMA系统, 需要对每个服务器都进行分配,使用命令echo 1024 /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages echo 1024 /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages对于1G的大内存页,不能在系统启动以后进行分配。一.2.2如何使用大内存页如果已经配置好了大内存页机制,就可以让DPDK

7、利用大内存页的机制了。可以输入如下的命令mkdir /mnt/hugemount -t hugetlbfs nodev /mnt/huge在运行程序 的时候,最好把分配给大页的所有空间都利用起来。如果DPDK的程序在运行的时候传递了-m 或者-socket-mem的参数,大内存页的分配在启动的时候会自动加载。如果传递给程序的内存页数量比程序要求的要少,也就是内存页不够用,程序将会中止。但是,如果用户要求的内存空间小于预留的内存空间时,同样有可能出现程序崩溃的情况。原因如下,假设系统为Socket1 和Socket 0 各预留了1024个大内存页。如果用户需要128M的内存,也就是64个大内存页

8、,但是这64个大页可能有以下的限制:这64个大页可能都被分配给Socket 1,如果用户要求访问Socket 0的内存,程序中止。为了避免这个问题,尽量使用-socket-mem的选项,而不是-m。这些页面可能被分配到物理内存的任何地方,尽管Intel DPDK EAL会尽力分配临近的内存块,但是还是不可避免的会遇到不临近的情况,在这种情况下可能不能分配大内存池。socket-mem这个选项是用来为每个CPU的Socket分配特定的内存大小的。比如-socket-mem=0,512,其中0是表示给Socket 0 分配0MB , 512表示给Socket 1分配512MB内存大小。同理对拥有4

9、个Socket的系统,如果要给Socket 0 ,2都分配1GB的内存大小,可以使用下面的选项配置:-socket-mem=1024,0,1024 一.3TLB其中TLB(Translation Lookaside Buffer)指的是旁路转换缓冲,或称为页表缓冲,是一个存放着页表缓存(虚拟地址到物理地址的转换表)的内存管理单元,用于改进虚拟地址到物理地址转换速度。X86体系的系统内存里存放了两级页表,第一级页表称为页目录,第二级称为页表。由于“页表”存储在主存储器中,查询页表所付出的代价很大,由此产生了TLB。TLB是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致

10、的,在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目(Entry),同样地,在TLB里边也缓存了同样大小的页表条目(Entry)。1:TLB在X86体系的CPU里的实际应用最早是从Intel的486CPU开始的,在X86体系的CPU里边,一般都设有如下4组TLB:第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表

11、缓存(Data-TLB);2:TLB命中和TLB失败如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit);如果TLB中没有所需的页表,则称为TLB失败(TLB Miss)。当CPU收到应用程序发来的虚拟地址后,首先到TLB中查找相应的页表数据,如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit)接下来CPU再依次看TLB中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存里了,若没有则到内存中取相应地址所存放的数据。一.4CPU的物理核,逻辑核概念DPDK在使用的时候经常会要求进行CPU的core的分配,本小节将对CPU的物理核,逻辑核的概念进行简单的介

12、绍。一个物理封装的CPU(通过physical id区分判断)可以有多个核(通过core id区分判断)。而每个核可以有多个逻辑cpu(通过processor区分判断)。一个核通过多个逻辑cpu实现这个核自己的超线程技术。一.4.1物理处理器封装个数Sockets, 中文翻译成“插槽”,也就是所谓的物理处理器封装个数,即俗称的“物理CPU数”,管理员可能会称之为“路”。例如一块“Intel Core i3-2310M”只有1个“物理处理器封装个数”。若对于有多个处理器插槽的服务器,“物理处理器封装个数”很可能会大于1。可以使用如下命令查询物理处理器的封装个数。cat /proc/cpuinfo

13、| grep physical id| sort| uniq| wc l具有相同physical id的CPU是同一个CPU封装的线程或核心或者使用lscpu | grep CPU socket(iscpu可以看到很多cat /proc/cpuinfo看不到的东西,建议使用)一.4.2处理器核心数processor cores,即俗称的“CPU核心数”,也就是每个物理CPU中core的个数例如“Intel Core i3-2310M”是双核处理器,它有2个“处理器核心数”。可以通过以下的命令来查看:cat /proc/cpuinfo| grep cpu cores| uniq具有相同core

14、id的CPU是同一个core的超线程一.4.3逻辑处理器数逻辑处理器数英文名是logical processors,即俗称的“逻辑CPU数”, 逻辑核心处理器,就是虚拟物理核心处理器的一个超线程技术例如“Intel Core i3-2310M”支持超线程,一个物理核心能模拟为两个逻辑处理器,即一块“Intel Core i3-2310M”有4个“逻辑处理器数”。可以使用cat /proc/cpuinfo| grep processor| wc l一.4.4SIBLINGSIBLING是内核认为的单个物理处理器所有的超线程个数,也就是一个物理封装中的逻辑核的个数。如果SIBLING等于实际物理核

15、数的话,就说明没有启动超线程,反之启用超线程。也就是说使用cat /proc/cpu命令如果“siblings”和“cpu cores”一致,则说明不支持超线程,或者超线程未打开。如果“siblings”是“cpu cores”的两倍,则说明支持超线程,并且超线程已打开一.4.5超线程超线程全名为Hyper-Threading,利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行速度。采用超线程即是可在同一时间里,应用程序可以使用芯片的不同部分。虽然单线程芯片每秒钟能够处理成千上万条指

16、令,但是在任一时刻只能够对一条指令进行操作。而超线程技术可以使芯片同时进行多线程处理,使芯片性能得到提升。虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。如果有两个逻辑CPU具有相同的”core id”,那么超线程是打开的。一.5CPU亲和性CPU的亲和性也就是cpu affinity机制,指的是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器, 通过处理器关联可以将虚拟处理器映射到一个或多个物

17、理处理器上 , 也就是说把一个程序绑定到一个物理CPU上。在越来越多核心的cpu机器上,如何提高外设以及程序工作效率的最直观想法就是让各个cpu核心各自干专门的事情。而且在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。另外一种使用绑核考虑就是将重要的业务进程隔离开,对于部分实时进程调度优先级高,可以将其绑定到一个指定核上,既可以保证实时进程的调度,也可以避免其他CPU上进程被该实时进程干扰。DPDK利

18、用cpu affinity主要是将控制面线程以及各个数据面线程绑定到不同的cpu,省却了来回反复调度的性能消耗,线程之间互不干扰的完成工作。第二章编译DPDK工具链二.1安装DPDK把从官网下到的DPDK的安装包,并解压以后可以得到如下的目录userdroid:/rte-source$ lsapp/ config/ examples/ lib/ LICENSE.GPL LICENSE.LGPL Makefile mk/ scripts/ tools/ lib: DPDK的库函数 app:的应用的源文件 examples:应用的一些例程源码 config, tools, scripts, mk:

19、 makefiles,脚本和一些配置文件。指得一提的是,官方文档中约定rte-source为软件解压的目录路径。二.2DPDK目标环境变量DPDK的编译工具都以如下格式表示:ARCH-MACHINE-EXECENV-TOOLCHAIN ARCH :表示体系结构, i686表示32位操作系统, x86_64表示64位操作系统 MACHINE :一般是 default ,但是在安装pktgen-DPDK的时候会选择wr。native表示编译过后的程序会尽量适应创建他的平台 EXECENV: 链接环境, linuxapp表示运行在linux用户空间 TOOLCHAIN:编译工具链 gcc, icc(

20、使用的是C+编译器)使用make install T= ARCH-MACHINE-EXECENV-TOOLCHAIN就可以编译所有的程序。二.3加载DPDK igb_uio模块要运行DPDK的所有程序,必须首先加载igb_uio模块。 Linux系统中一般的驱动设备都是运行在内核空间,但是DPDK是应用层平台,所以与此紧密相连的网卡驱动程序都通过uio机制运行在用户态下。可以使用如下命令加载模块:sudo insmod kmod/igb_uio.ko二.4把网络端口绑定到igb_uio上dpdk会让网卡脱离系统内核,重新绑定到igb_uio上,然会从用户态里去控制网卡,可以在执行程序的时候使用

21、-b的选项让某个端口不被解绑。一定从内核驱动中解绑,从系统角度是看不到这张网卡,也就是说通过ifconfig命令,看不到这张网卡的信息,而且所有网络应该程序也都用不了这张网卡。要用这个网卡,就需要用DPDK的API来写发包,收包程序。如果这个网卡要配IP,则需要在程序里自已实现TCP/IP协议。对网卡的绑定和解绑使用pci_unbind.py脚本。比如roothost:DPDK# ./tools/pci_unbind.py status可以看网卡绑定的情况:Network devices using IGB_UIO driver=0000:82:00.0 82599EB 10-Gigabit

22、SFI/SFP+ Network Connection drv=igb_uio unused=ixgbe0000:82:00.1 82599EB 10-Gigabit SFI/SFP+ Network Connection drv=igb_uio unused=ixgbeNetwork devices using kernel driver=0000:04:00.0 I350 Gigabit Network Connection if=em0 drv=igb unused=igb_uio *Active*0000:04:00.1 I350 Gigabit Network Connection

23、if=eth1 drv=igb unused=igb_uio0000:04:00.2 I350 Gigabit Network Connection if=eth2 drv=igb unused=igb_uio 0000:04:00.3 I350 Gigabit Network Connection if=eth3 drv=igb unused=igb_uioOther network devices=To bind device eth1, 04:00.1, to the igb_uio driver:为了把网卡eth1, 04:00.1, 绑定到igb_uio的驱动上,使用如下命令root

24、host:DPDK# ./tools/pci_unbind.py -bind=igb_uio 04:00.1 To restore device 82:00.0 to its original kernel binding: roothost:DPDK# ./tools/pci_unbind.py -bind=ixgbe 82:00.0再次执行如下命令,看网卡的状态。roothost:DPDK# ./tools/pci_unbind.py -status Intel DPDKCompiling and Running Sample ApplicationsNetwork devices usi

25、ng IGB_UIO driver=0000:04:00.1 I350 Gigabit Network Connection drv=igb_uio unused=igb0000:82:00.1 82599EB 10-Gigabit SFI/SFP+ Network Connection drv=igb_uio unused=ixgbeNetwork devices using kernel driver=0000:04:00.0 I350 Gigabit Network Connection if=em0 drv=igb unused=igb_uio *Active*0000:04:00.2

26、 I350 Gigabit Network Connection if=eth2 drv=igb unused=igb_uio0000:04:00.3 I350 Gigabit Network Connection if=eth3 drv=igb unused=igb_uio 0000:82:00.0 82599EB 10-Gigabit SFI/SFP+ Network Connection if=p802p1 drv=ixgbe unused=igb_uioOther network devices=可以看出0000:04:00.1已经绑定到了igb_uio上。第三章编译和运行程序三.1编

27、译程序目标环境的目录建立以后,就已经包含了所有的库,头文件。此时需要设置两个非常重要的环境变量: RTE_SDK -指向DPDK安装文件夹。例如把从官网上下到的DPDK安装包解压到用户的根目录下,并且改名为dpdk , 那么RTE_SDK应为/dpdk RTE_TARGET 指向DPDK目标环境目录,也就是前面定义的ARCH-MACHINE-EXECENV-TOOLCHAIN下面介绍一个运行在DPDK环境下的helloworld程序的建立过程userdroid:/rte$ cd examples/helloworld/ userdroid:/rte/examples/helloworld$ e

28、xport RTE_SDK=$HOME/rte userdroid:/rte/examples/helloworld$ export RTE_TARGET=x86_64-default-linuxapp-gcc userdroid:/rte/examples/helloworld$ makeCC main.oLD helloworldINSTALL-APP helloworldINSTALL-MAP helloworld.mapuserdroid:/rte/examples/helloworld$ ls build/app helloworld helloworld.map三.2运行程序注意:

29、UIO驱动必须首先安装,大内存页必须提前分配才可以运行一个程序。建立了DPDK的目标环境以后,如果要运行DPDK程序,首先必须把该程序链接到到目标环境的EAL(Environmental Abstraction Layer,环境抽象层)库中。通用方法是传递给EAL的一系列参数./rte-app -c COREMASK -n NUM -b -socket-mem=MB,. -m MB -r NUM -v -file-prefix -proc-type 该命令格式使用的是 BNF巴科斯范式,其规则如下在双引号中的字(word)代表着这些字符本身。在双引号外的字(有可能有下划线)代表着语法部分。尖括

30、号( )内包含的为必选项。方括号( )内包含的为可选项。大括号( )内包含的为可重复0至无数次的项。竖线( | )表示在其左右两边任选一项,相当于OR的意思。:= 是“被定义为”的意思。每个选项的详细解释如下:-c COREMASK十六进制的掩码,比如只想使用2个逻辑core ,可以使用-c 0x3-n NUM内存通道数 -b 端口的黑名单,可以让一些PCI设备不会被EAL环境所利用-socket-mem(注意是“-”不是-”)给某一个物理CPU的内存-m MB分配的内存-r NUM内存阶数-v启动时显示版本信息-huge-dir大内存页挂载的路径-file-prefix大内存页的文件名-proc-type运行例程的类型其中-c , -n 是必须使用的,其他的可选。比如可以usertarget:$ ./helloworld -c f -n 4-proc-type 和 -file-prefix可以在同时运行多个DPDK程序的时候使用运行helloworld rterte-desktop:/rte/exa

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1