DPDK安装步骤详细说明Word格式文档下载.docx
- 文档编号:17256214
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:11
- 大小:24.91KB
DPDK安装步骤详细说明Word格式文档下载.docx
《DPDK安装步骤详细说明Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DPDK安装步骤详细说明Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
如果不使用大内存页机制的话,TLB的命中率会降低,反而会降低性能。
大内存页最好在启动的时候进行分配,这样可以避免物理空间中有太多的碎片,提高发包的效率。
普通的页大小为4KB,默认的大内存页的大小为2MB,也可以设置其他的大内存页大小,可以可以从CPU的标识中看出支持哪种大内存页
如果有“pse”的标识,说明支持2M的大内存页。
如果有“pdpe1gb”的标识,说明支持1G的大内存页。
如果64位机建议使用1GB的大页。
比如如果想设置一个4G的大内存页,而且这个大内存页由4个1G大小的页构成,可以把如下配置传递给内核。
default_hugepagesz=1Ghugepagesz=1Ghugepages=4
但是如果使用大量的大内存页的话,最好增加当前登录会话打开文件限制,以减少运行DPDK程序时发生的错误。
可以使用ulimit的命令,比如ulimit-Sn2048。
在两插槽的NUMA系统中,大内存页会在两个插槽的CPU中进行平均分配。
对于2MB的大内存页的情况,也可以在系统启动以后再进行大内存页的分配。
在NON-NUMA系统,使用命令echo1024>
/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages。
对于NUMA系统,需要对每个服务器都进行分配,使用命令
echo1024>
/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
/sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
对于1G的大内存页,不能在系统启动以后进行分配。
一.2.2如何使用大内存页
如果已经配置好了大内存页机制,就可以让DPDK利用大内存页的机制了。
可以输入如下的命令
mkdir/mnt/huge
mount-thugetlbfsnodev/mnt/huge
在运行程序的时候,最好把分配给大页的所有空间都利用起来。
如果DPDK的程序在运行的时候传递了-m或者--socket-mem的参数,大内存页的分配在启动的时候会自动加载。
如果传递给程序的内存页数量比程序要求的要少,也就是内存页不够用,程序将会中止。
但是,如果用户要求的内存空间小于预留的内存空间时,同样有可能出现程序崩溃的情况。
原因如下,
假设系统为Socket1和Socket0各预留了1024个大内存页。
如果用户需要128M的内存,也就是64个大内存页,但是这64个大页可能有以下的限制:
●这64个大页可能都被分配给Socket1,如果用户要求访问Socket0的内存,程序中止。
为了避免这个问题,尽量使用--socket-mem的选项,而不是-m。
●这些页面可能被分配到物理内存的任何地方,尽管Intel®
DPDKEAL会尽力分配临近的内存块,但是还是不可避免的会遇到不临近的情况,在这种情况下可能不能分配大内存池。
socket-mem这个选项是用来为每个CPU的Socket分配特定的内存大小的。
比如--socket-mem=0,512,其中0是表示给Socket0分配0MB,512表示给Socket1分配512MB内存大小。
同理对拥有4个Socket的系统,如果要给Socket0,2都分配1GB的内存大小,可以使用下面的选项配置:
--socket-mem=1024,0,1024
一.3TLB
其中TLB(TranslationLookasideBuffer)指的是旁路转换缓冲,或称为页表缓冲,是一个存放着页表缓存(虚拟地址到物理地址的转换表)的内存管理单元,用于改进虚拟地址到物理地址转换速度。
X86体系的系统内存里存放了两级页表,第一级页表称为页目录,第二级称为页表。
由于“页表”存储在主存储器中,查询页表所付出的代价很大,由此产生了TLB。
TLB是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致的,在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目(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字节页面)的数据页表缓存(Data-TLB);
2:
TLB命中和TLB失败
如果TLB中正好存放着所需的页表,则称为TLB命中(TLBHit);
如果TLB中没有所需的页表,则称为TLB失败(TLBMiss)。
当CPU收到应用程序发来的虚拟地址后,
首先到TLB中查找相应的页表数据,如果TLB中正好存放着所需的页表,则称为TLB命中(TLBHit)
接下来CPU再依次看TLB中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存里了,若没有则到内存中取相应地址所存放的数据。
一.4CPU的物理核,逻辑核概念
DPDK在使用的时候经常会要求进行CPU的core的分配,本小节将对CPU的物理核,逻辑核的概念进行简单的介绍。
一个物理封装的CPU(通过physicalid区分判断)可以有多个核(通过coreid区分判断)。
而每个核可以有多个逻辑cpu(通过processor区分判断)。
一个核通过多个逻辑cpu实现这个核自己的超线程技术。
一.4.1物理处理器封装个数
Sockets,中文翻译成“插槽”,也就是所谓的物理处理器封装个数,即俗称的“物理CPU数”,管理员可能会称之为“路”。
例如一块“IntelCorei3-2310M”只有1个“物理处理器封装个数”。
若对于有多个处理器插槽的服务器,“物理处理器封装个数”很可能会大于1。
可以使用如下命令查询物理处理器的封装个数。
cat/proc/cpuinfo|grep"
physicalid"
|sort|uniq|wc–l
具有相同physicalid的CPU是同一个CPU封装的线程或核心
或者使用
lscpu|grep"
CPUsocket"
(iscpu可以看到很多cat/proc/cpuinfo看不到的东西,建议使用)
一.4.2处理器核心数
processorcores,即俗称的“CPU核心数”,也就是每个物理CPU中core的个数
例如“IntelCorei3-2310M”是双核处理器,它有2个“处理器核心数”。
可以通过以下的命令来查看:
cpucores"
|uniq
具有相同coreid的CPU是同一个core的超线程
一.4.3逻辑处理器数
逻辑处理器数英文名是logicalprocessors,即俗称的“逻辑CPU数”,
逻辑核心处理器,就是虚拟物理核心处理器的一个超线程技术
例如“IntelCorei3-2310M”支持超线程,一个物理核心能模拟为两个逻辑处理器,即一块“IntelCorei3-2310M”有4个“逻辑处理器数”。
可以使用
processor"
|wc–l
一.4.4SIBLING
SIBLING是内核认为的单个物理处理器所有的超线程个数,也就是一个物理封装中的逻辑核的个数。
如果SIBLING等于实际物理核数的话,就说明没有启动超线程,反之启用超线程。
也就是说使用cat/proc/cpu命令
●如果“siblings”和“cpucores”一致,则说明不支持超线程,或者超线程未打开。
●如果“siblings”是“cpucores”的两倍,则说明支持超线程,并且超线程已打开
一.4.5超线程
超线程全名为Hyper-Threading,利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行速度。
采用超线程即是可在同一时间里,应用程序可以使用芯片的不同部分。
虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进行操作。
而超线程技术可以使芯片同时进行多线程处理,使芯片性能得到提升。
虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。
当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。
因此超线程的性能并不等于两颗CPU的性能。
如果有两个逻辑CPU具有相同的”coreid”,那么超线程是打开的。
一.5CPU亲和性
CPU的亲和性也就是cpuaffinity机制,指的是进程要在指定的CPU上尽量长时间地运行而不被迁移到其他处理器,通过处理器关联可以将虚拟处理器映射到一个或多个物理处理器上,也就是说把一个程序绑定到一个物理CPU上。
在越来越多核心的cpu机器上,如何提高外设以及程序工作效率的最直观想法就是让各个cpu核心各自干专门的事情。
而且在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPUcache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。
另外一种使用绑核考虑就是将重要的业务进程隔离开,对于部分实时进程调度优先级高,可以将其绑定到一个指定核上,既可以保证实时进程的调度,也可以避免其他CPU上进程被该实时进程干扰。
DPDK利用cpuaffinity主要是将控制面线程以及各个数据面线程绑定到不同的cpu,省却了来回反复调度的性能消耗,线程之间互不干扰的完成工作。
第二章编译DPDK工具链
二.1安装DPDK
把从官网下到的DPDK的安装包,并解压以后可以得到如下的目录
user@droid:
~/rte-source$ls
app/config/examples/lib/LICENSE.GPLLICENSE.LGPLMakefilemk/scripts/tools/
•lib:
DPDK的库函数
•app:
的应用的源文件
•examples:
应用的一些例程源码
•config,tools,scripts,mk:
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(使用的是C++编译器)
使用makeinstallT=ARCH-MACHINE-EXECENV-TOOLCHAIN就可以编译所有的程序。
二.3加载DPDKigb_uio模块
要运行DPDK的所有程序,必须首先加载igb_uio模块。
Linux系统中一般的驱动设备都是运行在内核空间,但是DPDK是应用层平台,所以与此紧密相连的网卡驱动程序都通过uio机制运行在用户态下。
可以使用如下命令加载模块:
sudoinsmodkmod/igb_uio.ko
二.4把网络端口绑定到igb_uio上
dpdk会让网卡脱离系统内核,重新绑定到igb_uio上,然会从用户态里去控制网卡,可以在执行程序的时候使用-b的选项让某个端口不被解绑。
一定从内核驱动中解绑,从系统角度是看不到这张网卡,也就是说通过ifconfig命令,看不到这张网卡的信息,而且所有网络应该程序也都用不了这张网卡。
要用这个网卡,就需要用DPDK的API来写发包,收包程序。
如果这个网卡要配IP,则需要在程序里自已实现TCP/IP协议。
对网卡的绑定和解绑使用pci_unbind.py脚本。
比如
root@host:
DPDK#./tools/pci_unbind.py–status
可以看网卡绑定的情况:
NetworkdevicesusingIGB_UIOdriver
====================================
0000:
82:
00.0'
82599EB10-GigabitSFI/SFP+NetworkConnection'
drv=igb_uiounused=ixgbe
00.1'
Networkdevicesusingkerneldriver
===================================
04:
I350GigabitNetworkConnection'
if=em0drv=igbunused=igb_uio*Active*
if=eth1drv=igbunused=igb_uio
00.2'
if=eth2drv=igbunused=igb_uio0000:
00.3'
if=eth3drv=igbunused=igb_uio
Othernetworkdevices
=====================
<
none>
Tobinddeviceeth1,04:
00.1,totheigb_uiodriver:
为了把网卡eth1,04:
00.1,绑定到igb_uio的驱动上,使用如下命令
DPDK#./tools/pci_unbind.py--bind=igb_uio04:
00.1
Torestoredevice82:
00.0toitsoriginalkernelbinding:
root@host:
DPDK#./tools/pci_unbind.py--bind=ixgbe82:
00.0
再次执行如下命令,看网卡的状态。
DPDK#./tools/pci_unbind.py--status
Intel®
DPDK—CompilingandRunningSampleApplications
drv=igb_uiounused=igb
if=eth2drv=igbunused=igb_uio
if=eth3drv=igbunused=igb_uio0000:
if=p802p1drv=ixgbeunused=igb_uio
可以看出0000:
00.1已经绑定到了igb_uio上。
第三章编译和运行程序
三.1编译程序
目标环境的目录建立以后,就已经包含了所有的库,头文件。
此时需要设置两个非常重要的环境变量:
•RTE_SDK-——指向DPDK安装文件夹。
例如把从官网上下到的DPDK安装包解压到用户的根目录下,并且改名为dpdk,那么RTE_SDK应为~/dpdk
•RTE_TARGET——指向DPDK目标环境目录,也就是前面定义的ARCH-MACHINE-EXECENV-TOOLCHAIN
下面介绍一个运行在DPDK环境下的helloworld程序的建立过程
~/rte$cdexamples/helloworld/user@droid:
~/rte/examples/helloworld$exportRTE_SDK=$HOME/rteuser@droid:
~/rte/examples/helloworld$exportRTE_TARGET=x86_64-default-linuxapp-gccuser@droid:
~/rte/examples/helloworld$make
CCmain.o
LDhelloworld
INSTALL-APPhelloworld
INSTALL-MAPhelloworld.map
~/rte/examples/helloworld$lsbuild/apphelloworldhelloworld.map
三.2运行程序
注意:
UIO驱动必须首先安装,大内存页必须提前分配才可以运行一个程序。
建立了DPDK的目标环境以后,如果要运行DPDK程序,首先必须把该程序链接到到目标环境的EAL(EnvironmentalAbstractionLayer,环境抽象层)库中。
通用方法是传递给EAL的一系列参数
./rte-app-cCOREMASK-nNUM[-b<
domain:
bus:
devid.func>
][--socket-mem=MB,...]
[-mMB][-rNUM][-v][--file-prefix][--proc-type<
primary|secondary|auto>
]
该命令格式使用的是BNF巴科斯范式,其规则如下
●在双引号中的字("
word"
)代表着这些字符本身。
●在双引号外的字(有可能有下划线)代表着语法部分。
●尖括号(<
>
)内包含的为必选项。
●方括号([])内包含的为可选项。
●大括号({})内包含的为可重复0至无数次的项。
●竖线(|)表示在其左右两边任选一项,相当于"
OR"
的意思。
●:
:
=是“被定义为”的意思。
每个选项的详细解释如下:
-cCOREMASK
十六进制的掩码,比如只想使用2个逻辑core,可以使用-c0x3
-nNUM
内存通道数
-b<
端口的黑名单,可以让一些PCI设备不会被EAL环境所利用
--socket-mem(注意是“--”不是"
-”)
给某一个物理CPU的内存
-mMB
分配的内存
-rNUM
内存阶数
-v
启动时显示版本信息
--huge-dir
大内存页挂载的路径
--file-prefix
大内存页的文件名
--proc-type
运行例程的类型
其中-c,-n是必须使用的,其他的可选。
比如可以user@target:
~$./helloworld-cf-n4
--proc-type和--file-prefix可以在同时运行多个DPDK程序的时候使用
运行helloworld
rte@rte-desktop:
~/rte/exa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DPDK 安装 步骤 详细 说明
![提示](https://static.bdocx.com/images/bang_tan.gif)