本篇主要介绍DPDK的简单安装使用和一点其他相关内容,希望对初学者有所帮助。
本文打算写的内容:
- 对DPDK是什么和做什么用的简单介绍
- CentOS和Ubuntu安装DPDK的环境及流程
- 关于一个基于DPDK的很好用的报文发送工具 —— dpdk-pktgen的简单安装使用教程
1. 对DPDK的介绍
来自官方项目地址
DPDK is a set of libraries and drivers for fast packet processing.
It supports many processor architectures and both FreeBSD and Linux.
是一个用来进行快速报文处理的库和驱动集,支持多核架构以及FreeBSD和Linux。
评论指正:官方文档中many processor architectures应该是多种处理器架构的意思
用途:用来绑定和优化物理网卡驱动,提高其处理性能
DPDK相关技术:
(不详写,具体建议Google)
- 大页内存:用来减少TLB miss,提高效率
- IGB UIO:用户态的网卡驱动,用来取代原有的驱动,其中用户态是DPDK的核心之一(话说我至今搞不明白IGB是什么的缩写)
- 轮询模式:用来取代收报文进行处理时产生的中断,靠中断的话CPU效率太低,所以采用轮询来处理
- NUMA架构:Non Uniform Memory Access Architecture,建议Google
2. DPDK安装
2.1. 环境配置
名称 | 配置 |
---|---|
操作系统 | CentOS / Ubuntu |
CPU | 8核 |
内存 | 4G |
网卡 | 最好两张以上 |
大页内存 | 最好512MB以上 |
DPDK版本 | 越高坑越少 |
2.2. 影响因素
上面是个建议的运行配置,下面详细说说
- 关于系统版本:一般没太大影响,DPDK似乎会被内核驱动的版本影响,但是我运行高版本的DPDK时没遇到类似问题
- 关于CPU: CPU核数自然是越高越好,这直接牵扯到处理能力。但是实际使用DPDK时牵扯到一个绑定CPU给DPDK线程的问题,这个具体到那里时会有所介绍,这里只简单表示:没必要绑定多余的CPU给DPDK线程,性能反而有可能降低。
- 内存:没啥好说的,越高越好,内存够大才能分配足够的大页内存,而大页内存又是直接影响DPDK性能的因素之一
- 网卡: DPDK绑定网卡之后原来的网络驱动就没用了,原先的协议栈中网络层及IP地址之类的全都会失效,还想连网建议多搞个网卡
-
大页内存:越高越好,影响性能,低了DPDK甚至没法正常用,可能报这个 ——
- DPDK版本:现在都19.05了,除非是基于DPDK进行开发的开发者,版本改动可能影响较大,新接触建议选择高版本,坑少真的能省很多很多事情……
- 关于一些其他的可能的性能影响因素: 建议开启CPU超频,建议关掉防火墙,关掉蓝牙等用不上的功能
2.3. 安装过程
- 安之前最好安一下DPDK一些的依赖项,比较重要的:
# CentOS:
1: sudo yum install libnuma-devel
2: sudo yum install git
3: sudo yum install gcc
4: sudo yum install net-tools
# Ubuntu:
1: sudo apt install libnuma-dev
2: sudo apt install git
3: sudo apt install gcc
4: sudo apt install net-tools
其他还缺什么的话,建议根据到时候具体的错误信息进行查询
- 安装过程
1: ifconfig
2: sudo ens33 ifconfig down
3: cd /
4: git clone https://github.com/DPDK/dpdk.git
5: cd dpdk
6: export RTE_SDK = /dpdk
7: sudo ./usertools/dpdk-setup.sh
步骤1和2: 查看网卡信息,然后关了回头要绑定给DPDK的网卡,不关绑不上的,绑不上用不了的,会提示你还没绑网卡的
步骤6: 配置环境变量,下在哪配在哪,这里顺带一提,大部分基于DPDK开发的应用都要配两个特别重要的环境变量:RTE_SDK
和RTE_TARGET
,这俩一个代表DPDK下载地址,一个代表编译后文件的生成地址。
步骤7: 运行DPDK安装脚本,不建议自行一个个使用命令来安装。
运行步骤7之后:
------------------------------------------------------------------------------
RTE_SDK exported as /root/dpdk
------------------------------------------------------------------------------
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] arm64-armv8a-linuxapp-clang
[2] arm64-armv8a-linuxapp-gcc
[3] arm64-armv8a-linux-clang
[4] arm64-armv8a-linux-gcc
[5] arm64-bluefield-linuxapp-gcc
[6] arm64-bluefield-linux-gcc
[7] arm64-dpaa2-linuxapp-gcc
[8] arm64-dpaa2-linux-gcc
[9] arm64-dpaa-linuxapp-gcc
[10] arm64-dpaa-linux-gcc
[11] arm64-octeontx2-linuxapp-gcc
[12] arm64-octeontx2-linux-gcc
[13] arm64-stingray-linuxapp-gcc
[14] arm64-stingray-linux-gcc
[15] arm64-thunderx2-linuxapp-gcc
[16] arm64-thunderx2-linux-gcc
[17] arm64-thunderx-linuxapp-gcc
[18] arm64-thunderx-linux-gcc
[19] arm64-xgene1-linuxapp-gcc
[20] arm64-xgene1-linux-gcc
[21] arm-armv7a-linuxapp-gcc
[22] arm-armv7a-linux-gcc
[23] i686-native-linuxapp-gcc
[24] i686-native-linuxapp-icc
[25] i686-native-linux-gcc
[26] i686-native-linux-icc
[27] ppc_64-power8-linuxapp-gcc
[28] ppc_64-power8-linux-gcc
[29] x86_64-native-bsdapp-clang
[30] x86_64-native-bsdapp-gcc
[31] x86_64-native-freebsd-clang
[32] x86_64-native-freebsd-gcc
[33] x86_64-native-linuxapp-clang
[34] x86_64-native-linuxapp-gcc
[35] x86_64-native-linuxapp-icc
[36] x86_64-native-linux-clang
[37] x86_64-native-linux-gcc
[38] x86_64-native-linux-icc
[39] x86_x32-native-linuxapp-gcc
[40] x86_x32-native-linux-gcc
----------------------------------------------------------
Step 2: Setup linux environment
----------------------------------------------------------
[41] Insert IGB UIO module
[42] Insert VFIO module
[43] Insert KNI module
[44] Setup hugepage mappings for non-NUMA systems
[45] Setup hugepage mappings for NUMA systems
[46] Display current Ethernet/Crypto device settings
[47] Bind Ethernet/Crypto device to IGB UIO module
[48] Bind Ethernet/Crypto device to VFIO module
[49] Setup VFIO permissions
----------------------------------------------------------
Step 3: Run test application for linux environment
----------------------------------------------------------
[50] Run test application ($RTE_TARGET/app/test)
[51] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
----------------------------------------------------------
Step 4: Other tools
----------------------------------------------------------
[52] List hugepage info from /proc/meminfo
----------------------------------------------------------
Step 5: Uninstall and system cleanup
----------------------------------------------------------
[53] Unbind devices from IGB UIO or VFIO driver
[54] Remove IGB UIO module
[55] Remove VFIO module
[56] Remove KNI module
[57] Remove hugepage mappings
[58] Exit Script
Option:
输入对应的命令数字就可以执行操作了,执行的顺序是:
-
x86_64-native-linuxapp-gcc
选择build的平台,系统和编译器,及x86_64平台,linux系统,c语言编译器 -
Insert IGB UIO module
插入IGB UIO驱动,必须在编译后才能正常运行,而它运行后才能顺利执行后面的操作 -
Setup hugepage mappings for NUMA systems
配置大页内存,选之后输入数目就行了,一般大页内存分两种,2M的和1G的 -
Bind Ethernet/Crypto device to IGB UIO module
把网卡绑定给UIO,详细如下:
Option: 47
Network devices using DPDK-compatible driver
============================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000
Network devices using kernel driver
===================================
0000:02:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens39 drv=e1000 unused=igb_uio
No 'Crypto' devices detected
============================
No 'Eventdev' devices detected
==============================
No 'Mempool' devices detected
=============================
No 'Compress' devices detected
==============================
Enter PCI address of device to bind to IGB UIO driver:
假设你要绑定最上面那个,输入02:01.0
就可以了,绑定之前记得在ifconfig里面把它关了
-
Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
从括号里就能看到DPDK自带的app编译完了都在RTE_TARGET
这个路径下面,这个是个DPDK的测试程序,可以检测下DPDK安成功了没 - 关于testpmd,直接看这里吧
3. dpdk - pktgen
这是一个基于DPDK开发的报文发送工具,能指定MAC地址和包大小让它使用起来十分灵活
但是对于这个工具我个人还有许多没搞懂的地方,大家使用时见仁见智吧~
直接丢安装方法,先安装依赖:
1: wget -c http://www.lua.org/ftp/lua-5.3.5.tar.gz
2: tar zxvf lua-5.3.5.tar.gz
3: cd lua-5.3.5
4: make linux
Ubuntu
5: sudo apt-get install libreadline5
6: sudo apt-get install libreadline-gplv2-dev
CentOS
5/6: yum install readline-devel
7: sudo make install
dpdk - pktgen是用lua语言做脚本的,所以需要下载lua和相关内容
注意步骤7哪个系统都是要运行的
然后安装dpdk - pktgen
1: export RTE_SDK=/root/dpdk
2: export RTE_TARGET=x86_64-native-linuxapp-gcc
3: cd $RTE_SDK
4: make install T=x86_64-native-linuxapp-gcc
5: cd /root/pktgen-dpdk
6: make
7: ./app/x86_64-linuxapp-gcc/pktgen -l 0-2 -n 3 -- -P -m "[1].0, [2].1"
8: set 0 dst mac <mac addr>
9: set 0 dst ip <ip addr>
10: set 0 size <size between 64 - 1518>
11: start 0 # str
其中步骤1-7是安装过程,步骤8-11是简单使用过程。
其中步骤7很重要,涉及到初始化操作,直接影响后续使用时的性能表现。
步骤8表示设置MAC地址,dst
表示接收端,src
表示发送端
步骤9表示设置IP地址,dst
同上
步骤10表示发包的包大小
步骤11表示端口0开始发包,str
表示所有端口开始发包
具体可以运行时使用help
命令自行查看
参数 | 数值 |
---|---|
-l | 使用到的cpu核 |
-n | 内存通道数目 |
-m | 内核掩码 |
关于以上内容和性能表现之间的关系本篇并不涉及,内核掩码要讲也可以另开一篇了,所以也不会涉及到,可以自行google。
最后放一个运行时的效果图: