Linux环境下DPDK中文入门文档_第1页
Linux环境下DPDK中文入门文档_第2页
Linux环境下DPDK中文入门文档_第3页
Linux环境下DPDK中文入门文档_第4页
Linux环境下DPDK中文入门文档_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux环境下DPDK中文入门文档Release 17.02.0目录Linux环境下DPDK入门. 11 引言. 22 资料集. 23 系统需求. 23.1 x86平台的先决条件BIOS设置. 23.2 编译DPDK. 33.3 运行DPDK程序. 34 编译DPDK源码. 54.1 安装DPDK和浏览源码. 54.2 安装DPDK目标(target)开发环境. 64.3 浏览安装好的DPDK环境target. 64.4 加载DPDK用户态IO模块. 74.5 加载VFIO模块. 74.6 从内核模块绑定和解绑网卡. 75 编译和运行例子程序. 85.1 编译例子程序. 85.2 运行例子程

2、序. 95.2.1 程序使用的逻辑核. 95.2.2 程序使用的大页内存. 105.3 其它例子程序. 105.4 其它的测试程序. 106 开启其它功能. 106.1 高精度定时器(HPET)功能. 106.1.1 BIOS支持. 106.1.2 linux内核支持. 116.2 非root用户运行DPDK程序. 116.3 电源管理和省电功能. 116.4 使用DPDK的CPU亲和性减少上下文切换的开销. 126.5 加载DPDK KNI内核模块. 126.6 使用linux IOMMU透传来在INTEL VT-d虚拟化环境下运行DPDK. 126.7 40G网口高性能小包处理. 126.

3、7.1 使用16个字节的RX描述符. 126.7.2 高性能和报文时延间的均衡. 127 快速安装启动脚本. 127.1 脚本结构. 137.2 用例. 137.3 应用程序. 158 怎么在intel平台上获得网卡的最好性能. 178.1 硬件和内存需求. 178.1.1 网卡需求. 188.1.2 BIOS设置. 188.1.3 Linux内核启动参数. 188.2 运行DPDK前的配置. 188.3 获取intel网卡的最好性能例子. 191 引言文档是安装配置DPDK操作说明,旨在帮助客户快速上手和运行程序。文档介绍了在linux开发环境下如何编译和运行DPDK程序,但是并不深入细节。

4、之前曾经尝试着翻译来着,当时因为要离职,一时兴起就想着翻译,翻译的太烂,现在重新翻译,一方面是方便新入职的同事能够快速入门,另外一方面是现在工作的需要,还有一方面是学习KVM想休息一下,看内存那块弄得头昏脑胀,而且后面的例子会涉及到虚拟话那块的。下一个将翻译样例那本书(以及在自己机器上运行可能遇到的问题),同时会参杂着介绍开发者手册中的一些个人理解。2 资料集下面列出了所有DPDK文档资料的建议读取顺序:l 版本说明:提供了各个版本相关的信息,包括支持的特性,限制,修复的bug,出现的问题等等。也对频繁提到的问题以FAQ的方式做了回答。l 入门手册(本文的):讲述了如何安装配置DPDK;意在帮

5、助开发者快速上手和运行程序。l 开发者手册:n 软件架构和(通过例子)在linux环境下使用它n DPDK的内容包括构建系统(包括在DPDK根目录下构建开发环境和程序使用的命令)和移植程序指南。n 在已有软件和要新开发的软件中需要考虑到的优化。还提供了一个专有术语表。l API索引:提供了DPDK函数,数据结构和其它开发用到的结构体的详细信息。l 范例用户手册:介绍了一系列的范例程序。每一个章节介绍一个程序,展示程序的特殊功能,说明如何编译,运行和使用范例程序。3 系统需求本章介绍了编译DPDK需要的安装包。注意:如果DPDK要运行在intel 89xx系统通讯芯片平台,请翻阅对应该系列的li

6、nux入门手册。3.1 x86平台的先决条件BIOS设置对于主流的平台,使用DPDK的基本功能并不需要专门的BIOS设置,然而,对于额外的功能像HPET(高精度定时器),电量管理功能,以及在40G网卡上高性能小包处理,需要修改BIOS设置。修改设置的详细信息见第六章。3.2 编译DPDK需要的工具:注意:已经在Fedora18上测试运行过,在其它系统上安装命令和需要的安装包可能不一样,要知道其它版本linux发行版测试详细的细节,请查看DPDK版本说明。l GNU makel coreutils:cmp,sed,grep,arch,等等。l gcc:4.9版本或者是所有平台带的更新的版本。在一

7、些gcc版本中,很多特殊的编译标志和链接标志默认是打开的,会影响到性能(比如,-fstatck-protector)。请查阅对应版本的文档和执行gcc dumpspecs。l libc hreaders,通常打包成gcc-multilib(intel 64位架构上是glibc-devel.i686/libc6-dev-i386;glibc-devel.x86_64/libc6-dev,IBM power架构则是glibc-devel.ppc64)l 编译内核模块需要的内核头文件和源文件(kernel-devel.x86_64;kernel-devel.ppc64)l 在64位机器上编译32位程

8、序而外需要的库:n glibc.i686, libgcc.i686, libstdc+.i686 and glibc-devel.i686 for Intel i686/x86_64;n glibc.ppc64, libgcc.ppc64, libstdc+.ppc64 and glibc-devel.ppc64 for IBM ppc_64;注意:x86_x32 ABI库旨在ubuntu13.10以上版本或者最新Debian版本上支持。只支持gcc4.9+版本。l python,要使用dpdk安装包中各种帮助脚本必需的python版本2.7+或者是3.2+。其它的工具:l intel编译器i

9、cc:需要安装额外的库。在编译器安装文档看中icc安装说明。l IBM powerlinux高级工具链:这是一系列的开源开发工具和运行时库,能够让用户用到IBM最新的power硬件特性。要安装的话看IBM的官方安装文档。l libpcap头文件和库(libpcap-devel)编译和使用基于libpcap的轮询驱动。这个驱动默认是禁用的,可以通过修改编译时的配置文件参数CONFIG_RTE_LIBRTE_PMD_PCAP=y来打开。l libarchive头文件和库在单元测试用打开源文件用到。3.3 运行DPDK程序要运行DPDK程序,在目的机器上需要一些定制化的东西。3.3.1系统软件要求:

10、l 内核版本=2.6.34:通过命令uname r查看内核版本号l glibc=2.7(要用到cpuset特性):可以通过命令ldd version命令查看gcc版本号l 内核配置在Fedora操作系统和其它通用发行版,例如Ubuntu,红帽企业版linux,发行商提供的内核配置基本可以跑绝大多数DPDK程序。对于在其它内核上构建DPDK,下面几个选项需要能支持:n UIO(用户态IO)n HUGETLBFS(大页内存)n PROC_PAGE_MONITOR支持n HPET和HPET_MMAP配置项必须打开,如果用到HPET,具体细节看第六章。3.3.2在linux环境下使用大页内存对于大的报

11、文内存池内存分配,大页内存是必须的。(前一章说过运行的内核必须支持大页内存)。使用大页内存来分配,即使是小部分页要用到,性能也能够得到提升。减少了TLBmiss,对应就减少了虚拟地址转物理地址的时间。使用小页4K内存页,很高频率的TLBmiss发生会导致性能低下。申请大页给DPDK使用大页内存的分配最好是在系统启动时或者是尽量在系统启动后越早越好,这样可以减少分配的物理内存页物理地址碎片化。申请大页内存需要在内核启动时传递一个命令行参数。对于2MB内存页,分配1024个2MB内存页参数如下: hugepages=1024其它尺寸的大内存页,例如1G页,必须指定申请的内存页个数和默认内存页的大小

12、。例如分配4个1G的内存页,需要指定的参数如下:default_hugepagesz=1G hugepagesz=1G hugepages=4注意:大页内存的尺寸是CPU支持的大小来决定的。intel的机器上通过查看CPU flags来查看支持的大页内存尺寸。比如pse 代表支持2MB的内存页,pdpe1gb代表支持1G内存页。在IBM power架构机器上,支持大页内存尺寸为16MB和16GB。注意:对于64位的应用,如果平台支持,建议使用1G内存页。在双插槽的NUMA系统中,申请的大页内存一般会平均在两个socket上分配(假定两个socket都有足够的内存)。可以看linux内核源码树中

13、Documentation/kernel-parameters.txt获取更多内核选项的细节。备选项:对于2M的页,可以在系统启动后申请分配。echo想要分配的大页内存页个数到/sys/devices目录下的nr_hugepages文件。对于单NUMA(非NUMA)节点的系统,如下命令所示(假设需要1024个2M页):echo 1024 /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages在一个NUMA机器上,分别在不同node上分配指定数目的内存页:echo 1024 /sys/devices/system/node/node0/hug

14、epages/hugepages-2048kB/nr_hugepagesecho 1024 /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages注意:1G的内存页在系统启动后是无法申请。DPDK使用大页一旦申请到大页内存,要想其被DPDK使用到,执行以下步骤:mkdir /mnt/hugemount -t hugetlbfs nodev /mnt/huge要想是挂载即使是重启也永久有效,需要把下面一行加到/etc/fstab文件中:nodev /mnt/huge hugetlbfs defaults 0 0

15、1GB内存页,必须在挂载的时候将内存页的大小作为参数指定:nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 03.3.3LINUX环境下Xen Domain0支持现有的内存管理基于linux内核的大页机制。在Xen虚拟机管理器上,大页内存对非特权域(DomainU)的支持意味着DPDK在客户机上可以像普通机器上一样跑。然而,特权域(domain0)并不支持大页内存。需要插入新的内核模块rte_dom0_mm以便绕过这个限制来申请和映射大页内存,通过ioctl来申请,mmap来映射。开启DPDK对Xen Dom0支持默认情况下,Xen Dom0模式支持在D

16、PDK的build配置文件中是禁用的。要想支持Xen Dom0,配置项CONFIG_RTE_LIBRTE_XEN_DOM0需要在编译时改成y。此外,配置项CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID也必须置成y,以防万一收到错误的socket ID。加载rte_dom0_mm模块要在Xen Dom0中跑dpdk程序,rte_dom0_mm模块必须带上rsv_memsize参数加载到运行的内核中。可以在编译的DPDK目标目录的子目录中找到该模块。该模块的加载如下使用insmod命令(假设当前处于DPDK编译的目标目录下):sudo insmod kmod/rte_dom0

17、_mm.ko rsv_memsize=XX的值可以大于4095MB。配置DPDK使用的内存在rte_dom0_mm.ko模块加载完成后,用户必须配置DPDK使用的内存。将需要的内存大小echo到/sys/devices/目录下的memsize文件中即可。使用如下命令(假设需要2048MB内存):echo 2048 /sys/kernel/mm/dom0-mm/memsize-mB/memsize用户也可以检查已经使用了多少内存:cat /sys/kernel/mm/dom0-mm/memsize-mB/memsize_rsvdXen Dom0不支持NUMA配置,所以参数-socket-mem对

18、于Xen Dom0是无效的。注意:内存大小值不能超过rsv_memsize值。在Xen Domain0中运行DPDK程序要跑DPDK程序需要额外提供一个命令行参数-xen-dom0。4 编译DPDK源码注意:本章写的部分安装过程也可以通过后续一章中描述的脚本实现。4.1 安装DPDK和浏览源码首先,解压压缩包并移动到解压的DPDK源码目录:tar xJf dpdk-.tar.xzcd dpdk-DPDK包含以下几个子目录:l lib:DPDK库的源码l drivers:DPDK轮询驱动的源码l app:DPDK应用程序的源码(自动化测试)l examples:DPDK应用程序样例源码l con

19、fig,buildtools,mk:框架相关的Makefiles,脚本和配置文件4.2 安装DPDK目标(target)开发环境DPDK target格式是:ARCH-MACHINE-EXECENV-TOOLCHAIN详解:l ARCH 可以是:i686,x86_64,ppc_64l MACHINE 可以是:native,power8l EXECENV 可以是:linuxapp,bsdappl TOOLCHAIN 可以是:gcc,icc将要被安装的target环境取决于要安装的机器上的包是32位还是64位。可以编译产生的target在DPDK/config目录下定义了。不要用defconfig

20、_前缀,就是编译的时候不要带上这个前缀。注意:配置文件是RTE_MACHINE下的最优配置集合。在配置文件中,RTE_MACHINE被定义为native,意味着这是针对本机环境下最佳优化的编译。对于这些设置的更多信息,可以采用的值,看DPDK开发者手册。当使用ICC编译器时,下面的命令分别对应32位和64位环境使用。注意这个shell脚本更新$PATH环境变量,因此换个会话就失效了。编译安装的目录可能是不同的: source /opt/intel/bin/iccvars.sh intel64source /opt/intel/bin/iccvars.sh ia32安装和生成target,在DP

21、DK的根目录下使用make install T= 命令。例如,使用icc编译64位target:make install T=x86_64-native-linuxapp-icc使用gcc编译32位的:make install T=i686-native-linuxapp-gcc只是做创建target的准备,而不是编译,例如,在编译之前需要手动修改配置文件的,使用命令make config T=:make config T=x86_64-native-linuxapp-gcc警告:任何内核模块,比如igb_uio,kni等,必须编译时的内核和要运行时的内核一致。如果DPDK不是在编译产生的目标

22、机器上运行, RTE_KERNELDIR环境变量必须指向要运行target机器对应内核版本。一旦目标环境创建完成,用户可能需要进入目标环境目录,修改源码并重新编译。用户也可能修改编译时的DPDK配置项,通过编辑build目录下的.config文件(这个文件是从顶层目录的config目录下defconfig文件拷贝到本地来的):cd x86_64-native-linuxapp-gccvi .configmake此外,make clean命令可以清除所有之前编译留下的文件。4.3 浏览安装好的DPDK环境target一旦target创建完成就包含所有的苦,包括轮询驱动,和用户程序编译需要的DPD

23、K环境头文件。此外,test和testpmd程序在build/app目录下创建完成,可用于测试。kmod目录下包含需要加载到内核中的几个内核模块。4.4 加载DPDK用户态IO模块运行DPDK程序,一个合适的uio模块需要加载到运行中的内核。在很多例子中,标准的uio_pci_generic LINUX内核模块可以提供用户态驱动能力。该模块加载如下:sudo modprobe uio_pci_generic和上述不同的是,DPDK提供了igb_uio模块来实现(在kmod目录下):sudo modprobe uiosudo insmod kmod/igb_uio.ko注意:对于缺乏对传统中断支

24、持的设备,比如VF设备,igb_uio模块可能需要被uio_pci_generic替换掉。在DPDK1.7之前版本提供了对VFIO的支持,在支持VFIO的平台上UIO就不是必须的了。4.5 加载VFIO模块使用VFIO的DPDK应用程序,vfiopci模块必须加载:sudo modprobe vfio-pci需要注意的是要使用VFIO,你的内核必须支持才行。VFIO内核模块在LINUX内核3.6.0版本之后就囊括经来了,默认是有的。然而,请翻阅linux发行版文档确定一下。使用VFIO,BIOS和内核都必须支持,BIOS需要打开支持虚拟化的配置选项(例如Intel? VT-d).在非特权用户下

25、运行DPDK程序,要正确的操作VFIO,需要建立正确的权限设置。这个可以通过DPDK安装脚本实现(dpdk-setup.sh,位于usertools目录下)4.6 从内核模块绑定和解绑网卡在1.4版本,DPDK程序不再自动解绑所有支持DPDK的网口,当网口绑定在内核驱动上且正在运行时。取而代之的是,DPDK程序在运行前,必须将使用的所有网口绑定到uio_pci_generic,igb_uio或者是vfio-pci模块上。任何linux控制下的网口将被DPDK轮询驱动忽略,不能被DPDK程序使用。警告:DPDK默认不再在启动时自动解绑内核驱动管理的网口。任何PDDK程序使用的网口必须在程序运行前

26、解除linux控制,绑定到对应的驱动上(uio_pci_generic,igb_uio或者是vfio-pci).将绑定到DPDK的网口解绑并交给linux控制,可以使用usertool子目录下的dpdk_nic_bind.py脚本。这个脚本可以展示当前系统中所有网口的状态,可以将其从不同的内核模块间解绑和绑定,包括uio和vfio模块。下面是使用脚本的例子。要想获取脚本的全部使用描述和参数,可以带上help或者是usage参数启动脚本。注意,uio或者是vfio内核模块需要在运行dpdk-nic-bind.py脚本之前加载到内核中。查看系统中所有网口的状态:./usertools/dpdk-d

27、evbind.py -statusNetwork devices using DPDK-compatible driver=0000:82:00.0 82599EB 10-GbE NIC drv=uio_pci_generic unused=ixgbe0000:82:00.1 82599EB 10-GbE NIC drv=uio_pci_generic unused=ixgbeNetwork devices using kernel driver=0000:04:00.0 I350 1-GbE NIC if=em0 drv=igb unused=uio_pci_generic *Active*

28、0000:04:00.1 I350 1-GbE NIC if=eth1 drv=igb unused=uio_pci_generic0000:04:00.2 I350 1-GbE NIC if=eth2 drv=igb unused=uio_pci_generic0000:04:00.3 I350 1-GbE NIC if=eth3 drv=igb unused=uio_pci_genericOther network devices=绑定设备eth1,“04:00.1”到uio_pci_generic驱动上:./usertools/dpdk-devbind.py -bind=uio_pci_

29、generic 04:00.1或者是:./usertools/dpdk-devbind.py -bind=uio_pci_generic eth1恢复设备82:00.0到原始的内核驱动上:./usertools/dpdk-devbind.py -bind=ixgbe 82:00.05 编译和运行例子程序本章讲的是怎么在DPDK环境下编译和运行程序。也指出了样例程序保存在哪里。注意:本章写的部分安装过程也可以通过后续一章中描述的脚本实现。5.1 编译例子程序DPDK目标环境目录创建完成(例如x86_64-native-linuxapp-gcc),就包含了创建一个dpdk应用程序需要的库和头文件。

30、当在linux DPDK环境下编译程序,下面两个环境遍历必须export:l RTE_SDK 指向DPDK编译安装目录即target所在目录l RTE_TARGET 指向DPDK target目录名下面展示的是运行在linux DPDK环境下的例子helloworld。可以在$RTE_SDK/examples目录下找到。目录下包含main.c文件,默认编译生成的二进制文件在build目录下:cd examples/helloworld/export RTE_SDK=$HOME/DPDKexport RTE_TARGET=x86_64-native-linuxapp-gccmakeCC main

31、.oLD helloworldINSTALL-APP helloworldINSTALL-MAP helloworld.mapls build/apphelloworld helloworld.map注意:在上面的例子中,helloworld是在DPDK框架目录中,为了保证DPDK框架的完整性,可以把helloworld移动到外部。在下面的例子中,helloworld被拷贝到一个新目录中重新编译。export RTE_SDK=/home/user/DPDKcp -r $(RTE_SDK)/examples/helloworld my_rte_appcd my_rte_app/export RT

32、E_TARGET=x86_64-native-linuxapp-gccmakeCC main.oLD helloworldINSTALL-APP helloworldINSTALL-MAP helloworld.map5.2 运行例子程序警告:必须在运行DPDK程序前安装好UIO驱动和大页内存。警告:任何进程使用的网口在程序启动之前必须绑定到适当的内核模块上,如之前章节所述。程序必须链接DPDK target环境EAL(环境抽象层)库,这个库提供了每一个DPDK程序通用的选项。下面是可以传递给EAL的参数列表:./rte-app -c COREMASK -n NUM -b -socket-me

33、m=MB,. -m MB -r NUM -v -file-prefix -proc-type - xen-dom0EAL参数如下:l -c COREMASK:要使用CPU core16进制掩码。注意core编号在不同的平台不一样,需要事先确定好。l -n NUM:每个处理器socket的内存通道数l -b :网口黑名单,EAL不能使用的PCI设备(可以同时存在多个-b选项)l -socket-mem:在指定socket上分配大页内存l -m MB:指定分配大大页内存数,不限处理器的socket。加以使用socket-mem代替这个参数。l -r NUM:内存的rank数l -v:显示程序版本号

34、l -huge-dir:大页内存的挂载点l -file-prefix:大页内存文件的前缀l -proc-type:进程类型l -xen-dom0:支持程序在Xen Domain0中非大页内存下运行l -vmware-tsc-map:使用VMware TSC代替本地的RDTSCl -base-virtaddr :指定虚拟地址的基址l -vfio-intr:指定VFIO使用的中断类型(如果不是用VFIO则无效)-c是必须的,其它都是可选的。运行例子程序(假设该平台每个处理器socket有4个内存通道,有4个cpu核,且程序都使用上):./helloworld -c f -n 4注意:-proc-t

35、ype和file-prefix EAL参数用于DPDK多进程。可以查阅DPDK范例程序一书中多进程章节和DPDK开发手册获取更多细节。5.2.1 程序使用的逻辑核CPU核掩码参数是DPDK程序必须带上的。掩码的每个bit位代表linux显示的每个逻辑核的编号。不同的平台之间,逻辑核编号和逻辑核编号与NUMA socket的映射关系是不同的,所以建议在选在使用核之前先弄清楚该平台的核分布。在初始化DPDK 环境抽象层时,会打印出要使用的逻辑核以及其所在的socket。这些信息也可以通过查看/proc/cpuinfo文件来知道,例如,执行 cat /proc/cpuinfo。每个逻辑核的物理ID属

36、性表明其属于哪个CPU socket。注意:逻辑核分布视图可以通过使用linux工具lstopo获取。在Fedora系统中,可以使用下面的命令安装使用:sudo yum install hwloc./lstopo警告:逻辑核的分布在不同的主板上是不一样的,在选择使用的核之前要检查一下。5.2.2 程序使用的大页内存运行DPDK程序,建议大页内存用多少就分配多少。如果没有传入-m或者是socket-mem参数,DPDK程序在启动时自动完成。如果实际使用的内存超过了传入参数值指定的值,程序将失败并退出。然而,如果用户要申请使用的内存小于预先分配的内存大小,特别是使用了-m选项时,程序自身也会失败。

37、假定系统在socket0和socket1上各预先分配有1024个2MB内存页,用户请求使用128MB内存,64个页可能不符合要求:l 内核给予应用程序分配的大页内存都在socket1上。这种情况下,如果应用程序试图在socket0上创建一个对象,比如一个无锁队列或者是内存池,程序会失败。要避免这种问题,建议使用socket-mem选项代替-m选项。l 那些大页内存在物理上是分布在各处的,然而DPDK EAL试图分配在物理地址上连续的一段内存,而可能现有的内存页不是连续的,这种情形下,应用程序无法申请大的内存池而失败。socket-mem选项可以在指定的socket上分配指定大小的内存页。要想做

38、到这个,就得在这个选项后面接上要在各个socket上分配内存大小,例如:-socket-mem=0,512,就是在socket1上分配512MB内存。同理,在4socket的系统中,只在socket0和2上各分配1GB内存:-socket-mem=1024,0,1024。某一个CPUsocket上没有内存分配,那么就不需要显式的引用,例如前面socket3就是。如果不能在指定的socket上分配到足够的内存,EAL初始化失败。5.3 其它例子程序其它的例子程序在$RTE_SDK./example目录下。这些程序的编译和运行方式与本文中之前章节介绍的差不多。此外,可以查阅DPDK范例程序手册,该

39、手册介绍了在编译和执行程序时的特殊命令参数,以及代码的说明。5.4 其它的测试程序另外,有两个额外的测试程序在DPDK库创建的时候编译出来。源码在DPDK/app目录下,名为test和testpmd。DPDK目标库创建完成,那么就可以在build/app目录中找到。l test程序提供了DPDK各种函数的特定测试。l testpmd程序提供了一些不同的报文吞吐测试和特性,例如如何使用intel82599万兆网卡的Flow Director(引流)特性。6 开启其它功能6.1 高精度定时器(HPET)功能6.1.1 BIOS支持要使用HPET必须BIOS中支持,否则默认采用TSC。一般情况下,在

40、系统启动的时候按F2键可以进入BIOS。用户可以开启HPET选项。在intel的Crystal Forest平台BIOS上,路径是Advanced - PCH-IO Configuration - High Precision Timer - (Change from Disabled to Enabled if necessary).在已经启动的系统中,下面的命令可以查看HPET是否开启:grep hpet /proc/timer_list如果返回为空,那么必须重启机器并在BIOS中开启HPET(重复上述的指令)。6.1.2 linux内核支持DPDK通过将时间戳计数器映射到处理器地址空间来

41、利用平台的HPET,如此需要HPET_MMAP内核配置项支持。警告:在Fedora系统和其他通用linux发行版,例如ubuntu,HPET_MMAP内核选项是默认关闭的。带此参数重新编译内核,请查阅发行版文档了解相关操作。在DPDK中使用HPET默认情况下,DPDK编译配置文件中HPET选项是关闭的。要使用HPET,CONFIG_RTE_LIBEAL_USE_HPET配置项必须改成y,需要在编译时修改参数。程序使用rte_get_hpet_cycles()和rte_get_hpet_hz()接口调用,在程序初始化时调用rte_eal_hpet_init()接口来将HPET作为rte_time

42、r库的默认时间源。这个接口将确保HPET可用,如果不可用则返回错误值。例如,如果HPET_MMAP内核不支持。那么程序可以针对支持或者是不支持而决定采取什么动作。注意:如果程序需要时间API,但是HPET不支持,建议采用rte_get_timer_cycles()和rte_get_timer_hz()接口代替HPET接口。这个通用接口既可以使用TSC,也可以使用HPET作为时间源,取决于是否在程序启动是调用rte_eal_hpet_init()接口,如果调用了的话,系统是否支持。6.2 非root用户运行DPDK程序尽管程序通过DPDK能够直接使用网口和硬件资源,但是这些程序如果是作为普通用户

43、而不是root用户,那么需要做一些小的权限调整。要实现这个,下面这些linux系统文件的所有者和权限必须调整,以便普通linux用户也能在使用DPDK的时候访问它们:l 所有的大页内存挂载点目录,例如/mnt/hugel 在/dev目录下的用户态IO设备文件,/dev/uio0,/dev/uio1,等等。l 用户态IO系统文件配置和资源文件,例如uio0:/sys/class/uio/uio0/device/config/sys/class/uio/uio0/device/resourcel 如果要使用HPET,文件/dev/hpet注意:在一些linux系统上安装时,/dev/hugepag

44、es会默认作为大页内存的挂载点创建。6.3 电源管理和省电功能如果要使用DPDK的电源管理功能,那么必须在平台BIOS中开启增强型INTEL SpeedStep(步进?)技术开关。否则,系统文件/sys/devices/system/cpu/cpu0/cpufreq不会存在,且基于CPU主频调节的电源管理就无法使用。查阅相关的BIOS文档确定这些设置如何访问。例如,在一些INTEL平台BIOS是不一致的,增强型INTEL SpeedStep技术的路径是: Advanced- Processor Configuration- Enhanced Intel SpeedStep? Tech此外,要开

45、启电源管理C3和C6也一样要打开。C3和C6在同样的BIOS平台: Advanced- Processor Configuration- Processor C3 Advanced- Processor Configuration- Processor C66.4 使用DPDK的CPU亲和性减少上下文切换的开销当一些线程被DPDK程序使用时,这些线程每一个会被固定到系统中的一个逻辑核心上(一个线程对应一个逻辑核心),对于linux调度器来说,也有可能会在这些核心上运行其他任务。为了阻止调度器将其他任务调度到DPDK使用的核心上,需要使用内核参数isolcpus来将这些核心从Linux调度器中隔

46、离开来.例如,DPDK程序使用逻辑核性2,4,6运行程序,下面的这个选项需要加到内核启动参数中:isolcpus=2,4,66.5 加载DPDK KNI内核模块要运行DPDK KNI例子程序,需要额外加载一个内核模块(kni模块)到运行的linux内核中。可以在DPDK target目录下的kmod目录中找到。同理如加载igb_uio模块,加载kni也是通过ismod命令来(假设我们当前处于DPDK target目录下):insmod kmod/rte_kni.ko6.6 使用linux IOMMU透传来在INTEL VT-d虚拟化环境下运行DPDK要在linxu内核中开启intel VT-d

47、,一系列的内核配置项需要设置:l IOMMU_SUPPORTl IOMMU_APIl INTEL_IOMMU此外,要在intel VT-d虚拟化环境下运行DPDK,当使用igb_uio驱动时,必须设置内核参数iommu=pt。这个是主机中DMAR(DMA Remapping(DMA地址重映射)透传的结果。INTEL_IOMMU_DEFAULT_ON在内核中也没有设置,内核参数inte_iommu=on必须使用。这可以确保intel IOMMU按照期望被初始化。请注意,使用igb_uio驱动时必须使用iommu=pt参数,而vfio-pci驱动则是使用iommu=pt和iommu=on二者都可以

48、运行。6.7 40G网口高性能小包处理在最新版本的固件镜像中,性能增强的问题解决了,固件更新可以获取更高的性能。用户需要检查本地的intel网卡驱动版本。用户需要查阅DPDK版本说明文档确定这个版本对应的网卡i40E驱动版本。6.7.1 使用16个字节的RX描述符i40e轮询驱动支持16和32字节的RX描述符大小,而16个字节的能够提供更高的小包处理性能。需要在配置文件中修改CONFIG_RTE_LIBRTE_I40E_16BYTE_RX_DESC参数为使用16个字节的RX描述符。6.7.2 高性能和报文时延间的均衡由于硬件设计的原因,每个报文描述符的回写需要在网卡内产生一个中断信号。最小的中

49、断间隔需要在编译时修改配置文件中的CONFIG_RTE_LIBRTE_I40E_ITR_INTERVAL参数。尽管有默认配置,用户可以根据自己的实际情况,看是更在乎性能还是时延来调优这个参数。7 快速安装启动脚本dpdk-setup.sh脚本,在usertools子目录下,可以帮助用户执行下面的任务:l 编译DPDK库l 插入和移走DPDK IGB_UIO内核模块l 插入和移走VFIO内核模块l 插入和移走DPDK KNI内核模块l 创建和删除NUMA和非NUMA下的大页内存l 网口状态试图展示和分配网口给DPDK程序使用l 为使用VFIO的非特权用户分配权限l 运行test和testpmd程

50、序l 展示在meminfo中的大页信息l 列出/mnt/huge中的大页l 删除创建的DPDK库7.1 脚本结构dpdk-setup.sh脚本是用户按照用户的执行命令逻辑顺序来组织起来的一系列的步骤。每一个步每一步都提供了一些提示信息帮助用户完成要求的任务。下面是每一步的简单概述。step 1:编译DPDK库最开始,用户必须选择一个DPDK target,匹配类型和编译选项,以便生成正确的库。用户必须按照前面章节所述,将所有需要的库,模块,更新和编译需要的东西安装好。step2:安装环境用户配置DPDK程序运行所需的linux环境。大页内存的建立。任何已存的大页内存会被移除。DPDK用到的内核

51、模块也在这步中插入,DPDK程序使用的网卡接口也绑定到对应的模块。step3:运行程序用户可能需要在上面步骤完成后运行test程序。test程序允许执行一系列的DPDK功能测试。testpmd支持收发包相关的测试。step4:检查系统这步提供了一些工具来检查系统的大页内存状态。step5:系统还原最后一步是恢复系统到原有的状态。7.2 用例下面是一些使用dpdk-setup.sh脚本的用例。这个脚本应该使用source命令来运行。警告:脚本需要在root权限下运行。source usertools/dpdk-setup.sh-RTE_SDK exported as /home/user/rte-Step 1: Select the DPDK environment to build-1 i686-native-linuxapp-gcc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论