提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、测试拓扑图
二、VirtualBox的网卡配置
三、DPDK支持的网卡
四、DPDK安装
1.DPDK向导
1). 英文向导
2). 中文向导
2.DPDK源码下载
3.DPDK源码解压
4.相关依赖包安装
5.DPDK源码编译
6.DPDK示例编译
五、dpdk-kmods安装
1.dpdk-kmods下载
2.dpdk-kmods编译
3.gcc12安装
4.dpdk-kmods安装
5.dpdk-kmods错误解决
六、分配大页内存
七、DPDK绑定网口
八、DPDK解绑定网口
九、DPDK TestPMD
1.概述
1).转发模式
2).Run dpdk-testpmd
2.常用命令
3.Test Case1
1).测试目的
2).测试Topo
3).测试和配置步骤
4.Test Case2
1).测试目的
2).测试Topo
3).测试和配置步骤
十、DPDK L2FWD
1.概述
1).Run dpdk-l2fwd
2.常用命令
3.Test Case1
1).测试目的
2).测试Topo
3).测试和配置步骤
十一、Trex部署
1.Trex包下载
2.Trex包解压
3.绑定网口并配置
4.如需修改网卡请编辑配置文件
5.启动trex
1).先启动trex主程序,本方案是用网线做的回环测试。
2).再开启TRex客户端程序
3).客户端中stats可查看流量情况
4).主程序界面也可以看到实时流量统计
总结
前言
Ubuntu版本信息:
cat /etc/issue
Ubuntu 22.04.4 LTS \n \l
uname -a
6.5.0-25-generic #25~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Feb 20 16:09:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
VirtualBox7.0.14 r161095 (Qt5.15.2)
提示:以下是本篇文章正文内容,下面案例可供参考
一、测试拓扑图
二、VirtualBox的网卡配置
如果使用到了VirtualBox,请参考下面设置网卡:
网卡1:用于上公网,ssh等控制
连接方式:桥接网卡
名称:WIFI
混在模式:拒绝
网卡2:用于DPDK测试
连接方式:桥接网卡
名称:笔记本的有线网口或USB扩展网口
混在模式:全部允许
网卡3:用于DPDK测试
连接方式:桥接网卡
名称:笔记本的有线网口或USB扩展网口
混在模式:全部允许
三、DPDK支持的网卡
Intel网卡
参见:dpdk support intel nics
四、DPDK安装
1.DPDK向导
1). 英文向导
Getting Started Guide for Linux — Data Plane Development Kit 17.05.2 documentation
2). 中文向导
Linux平台上DPDK入门指南 — dpdk 0.11 documentation
2.DPDK源码下载
23.11.0:dpdk-23.11.tar.xz : DPDK
3.DPDK源码解压
tar -xvf dpdk-23.11.tar.xz
4.相关依赖包安装
命令如下:
sudo apt install meson
sudo apt install python3-pyelftools
sudo apt install pkg-config
5.DPDK源码编译
命令如下:
cd dpdk-23.11
meson build
cd build
ninja
sudo ninja install卸载只需执行 ninja uninstall 即可
6.DPDK示例编译
命令如下:
cd dpdk-23.1/1build
meson configure -Dexamples=all
or
meson configure -Dexamples=helloworld,l2fwd
ninja编译完的app在build/examples下 直接执行app即可
五、dpdk-kmods安装
1.dpdk-kmods下载
git clone http://dpdk.org/git/dpdk-kmods
2.dpdk-kmods编译
命令如下:
cd dpdk-kmods/linux/igb_uio
make
得到igb_uio.ko
3.gcc12安装
有些时候gcc11编译不过kmods,可以安装gcc12,并把gcc切换到gcc12后进行编译,如果编译成功,请忽略此步骤。
sudo apt install gcc-12
sudo apt install g++-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 1 --slave /usr/bin/g++ g++ /usr/bin/g++-11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 2 --slave /usr/bin/g++ g++ /usr/bin/g++-12
sudo update-alternatives --config gcc
4.dpdk-kmods安装
命令如下:
//装载内核模块
sudo modprobe uio
sudo insmod dpdk-kmods/linux/igb_uio/igb_uio.ko intr_mode=legacy
注意: 加载驱动时要带着参数intr_mode=legacy,如果不加参数,将会有问题!
5.dpdk-kmods错误解决
如果出现错误: insmod: ERROR: could not insert module igb_uio.ko: Invalid parameters
首先使用 uname -r查看当前内核版本
再使用modinfo igb_uio.ko查看vermagic字段是否当前内核版本一致,发现不一致
重新编译dpdk,编译后,查看一致性
六、分配大页内存
sudo mkdir -p /dev/hugepages
sudo mount -t hugetlbfs none /dev/hugepages
sudo echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
七、DPDK绑定网口
//查看网卡信息
lspci | grep Ethernet
lshw -class network -businfo
usertools/dpdk-devbind.py --status//绑定网卡到DPDK
sudo usertools/dpdk-devbind.py -b igb_uio enp13s0f0 enp13s0f1
八、DPDK解绑定网口
比如:网卡 enp13s0f0 和 enp13s0f1被 DPDK 占用后,ifconfig 里就没有了,要恢复需要进行如下操作
lspci | grep Eth
两个网卡设备号是 0000:0d:00.0 和 0000:0d:00.1
//解绑两个网卡的 igb_uio 驱动,绑定 e1000 驱动:
dpdk-devbind.py -u 0d:00.0 0d:00.1
dpdk-devbind.py -b e1000 0d:00.0 0d:00.1
//启动网卡
ifconfig enp13s0f0 up
ifconfig enp13s0f1 up
九、DPDK TestPMD
1.概述
dpdk-testpmd是dpdk自带的一个例子程序,用来进行dpdk的包转发测试
1).转发模式
TestPMD有3中不同的转发模式。
Input/output mode: 收发模式,这是TestPMD启动时默认的模式,这种模式下cpu的核从网卡的一个口收包,再从另一个口转发出去,统一网卡即可收包又可发包。
Rx-only mode: 接收模式,这种模式下TestPMD收到包后就丢弃。
Tx-only mode: 发送模式,这种模式下TestPMD产生64字节长度的IP包从网卡的网卡发出。
后两种模式分别用于收发测试。
这三种模式外,其它模式详见 TestPMD documentation.
2).Run dpdk-testpmd
sudo build/app/dpdk-testpmd -l 0,1,2,3 -n 4 -- -i --nb-cores=2
“--”之前的参数为EAL参数;
-l EAL的逻辑核(dpdk中类似于线程的概念)列表。0,1表示有两个逻辑核;-c:通过十六进制的掩码来设置使用哪些cpu核,就上述的-c 0xf,0xf的二进制是1111,假设我有8个核,所以就是使用0~3号核。
-n EAL的内存通道数(设置每个socket的内存通道数),一般为4;-b:表示不会使用黑名单中的pci设备
-a:表示白名单中的pci设备
“--”之后的是testpmd程序本身的参数;
-i 启用交互模式,此时可以使用命令行;
--nb-cores 用于转发的逻辑核数目。注意testpmd本身需要一个逻辑核用于交互,所以这个参数的值应>0,≤总逻辑核数-1;
--nb-ports 用于转发的网络接口。如果不指定则使用所有可用的接口;2表示用前两个接口。–stats:如果不开启交互模式,设置stats值,用来每个一段时间统计信息
–nb:设置转发内核的数量
–rxq:设置rx队列的数量
–txq:设置tx队列的数量-h EAL参数帮助
-- -h testpmd程序本身的参数帮助
2.常用命令
//查看转发配置
testpmd> show config fwd
//使用“start”命令开启转发
testpmd> start
//stop命令后停止程序,此时会显示出各个端口的独立统计和总体统计
testpmd> stop
//查看当前所有在用端口的相关统计
testpmd> show port stats all
//清除当前所有在用端口的相关统计
testpmd> clear port stats all
//查看当前转发相关统计
testpmd> show fwd stats all
//清除当前转发相关统计
testpmd> clear fwd stats all
//设置TestPMD为接收模式
testpmd> stop
testpmd> set fwd rxonly
testpmd> start//获取帮助信息
testpmd> help
testpmd> help display
3.Test Case1
1).测试目的
TestPMD应用程序把两个以太网口连接到外部的流量发生器。在不同的网络工作负载下测试两块网卡间的数据收发,吞吐量和功能。
2).测试Topo
3).测试和配置步骤
sudo build/app/dpdk-testpmd -l 0,1,2,3 -n 4 -- -i --nb-cores=2
//进入testpmd命令行
testpmd> show config fwd
testpmd> start
testpmd> clear port stats all
testpmd> show port stats all
testpmd> clear fwd stats all
testpmd> show fwd stats all
在另外一端的PC机或Virtualbox上run trex或 pktgen
//使用trex或pktgen发包进行测试,详细命令和参数使用,参照trex和pktgen章节
4.Test Case2
1).测试目的
TestPMD应用程序把两个以太网端口连成环回模式。 在没有外部流量发生器的情况下检查网络设备的接收和传输功能,测试同一块网卡两个口之间的数据收发。
2).测试Topo
3).测试和配置步骤
sudo build/app/dpdk-testpmd -l 0,1,2,3 -n 4 -- -i --nb-cores=2
//进入testpmd命令行
testpmd> show config fwd
//使用参数tx_first,无参数时,有时候无法发包
testpmd> start tx_first
testpmd> clear port stats all
testpmd> show port stats all
testpmd> clear fwd stats all
testpmd> show fwd stats all
十、DPDK L2FWD
1.概述
dpdk-l2fwd是DPDK中的非常经典的例子。二层转发模型。
就是在相邻的网卡接口间互相传递报文。
网口0和网口1之间报文互传。
网口2和网口3之间报文互传。
............
1).Run dpdk-l2fwd
sudo build/examples/dpdk-l2fwd -l 0-1 -n 2 -a 0d:00.0 -a 0d:00.1 -- -q 1 -p 0x3 --no-mac-updating -P
注意:一定要加入参数 -P 打开端口混杂模式(允许全部mac地址通过,而不是只是接收本端口的mac地址)
EAL options
-l:测试的端口list(0,1或0-1表示port0和port1;0,1,2,3或0-3表示port0,port1,port2和port3)
- -c:指定分配给DPDK使用的逻辑数 (-c 1 只使用一个cpu core) (-c 和 -l是互斥的,不能同时使用)
- -n:每个CPU的内存通道数
- DPDK EAL的默认参数,必须参数为-c COREMASK -n NUM。
- COREMASK:一个十六进制位掩码表示分配的逻辑内核数量。
- NUM:一个十进制整数表示内存通道数量。
--:(破折号)分开了EAL参数和应用程序参数
-p PORTMASK
PORTMASK:一个十六进制位掩码表示分配的端口 (-c 0x3 表示port0和port1)。-q NQ
NQ:表示分配给每个逻辑内核的收发队列数量(-q 8 表示8个队列)。-T t
t: 表示打印统计数据到屏幕上的时间间隔,默认为10秒。
2.常用命令
sudo build/examples/dpdk-l2fwd -l 0-1 -n 2 -a 0d:00.0 -a 0d:00.1 -- -q 1 -p 0x3 --no-mac-updating -P
3.Test Case1
1).测试目的
2).测试Topo
3).测试和配置步骤
sudo build/examples/dpdk-l2fwd -l 0-1 -n 2 -a 0d:00.0 -a 0d:00.1 -- -q 1 -p 0x3 --no-mac-updating -P
在另外一端的PC机或Virtualbox上run trex或 pktgen
//使用trex或pktgen发包进行测试,详细命令和参数使用,参照trex和pktgen章节
十一、Trex部署
TRex是cisco基于Intel dpdk开发的软件程序
1.Trex包下载
Index of /trex/release (cisco.com) 下载v3.04.tar.gz
2.Trex包解压
mkdir trex
cd trex
tar -xvf ../Downloads/v3.04.tar.gz
3.绑定网口并配置
//装载内核模块
sudo modprobe uio
sudo insmod ../../dpdk-kmods/linux/igb_uio/igb_uio.ko//绑定网卡到DPDK
sudo usertools/dpdk-devbind.py -b igb_uio enp13s0f0 enp13s0f1
sudo ./dpdk_setup_ports.py -i
weiy@weiy-VirtualBox:~/work/trex/v3.04$ sudo ./dpdk_setup_ports.py -i
By default, IP based configuration file will be created. Do you want to use MAC based config? (y/N)y
+----+------+---------+-------------------+-------------------------------------+---------+----------+----------+
| ID | NUMA | PCI | MAC | Name | Driver | Linux IF | Active |
+====+======+=========+===================+=====================================+=========+==========+==========+
| 0 | -1 | 00:03.0 | 08:00:27:e4:f1:fb | 82540EM Gigabit Ethernet Controller | e1000 | enp0s3 | *Active* |
+----+------+---------+-------------------+-------------------------------------+---------+----------+----------+
| 1 | -1 | 00:08.0 | 08:00:27:99:33:25 | 82540EM Gigabit Ethernet Controller | igb_uio | | |
+----+------+---------+-------------------+-------------------------------------+---------+----------+----------+
| 2 | -1 | 00:09.0 | 08:00:27:40:93:58 | 82540EM Gigabit Ethernet Controller | igb_uio | | |
+----+------+---------+-------------------+-------------------------------------+---------+----------+----------+
Please choose an even number of interfaces from the list above, either by ID, PCI or Linux IF
Stateful will use order of interfaces: Client1 Server1 Client2 Server2 etc. for flows.
Stateless can be in any order.
Enter list of interfaces separated by space (for example: 1 3) : 1 2For interface 1, assuming loopback to its dual interface 2.
Destination MAC is 08:00:27:40:93:58. Change it to MAC of DUT? (y/N).
For interface 2, assuming loopback to its dual interface 1.
Destination MAC is 08:00:27:99:33:25. Change it to MAC of DUT? (y/N).
Print preview of generated config? (Y/n)
### Config file generated by dpdk_setup_ports.py ###- version: 2
interfaces: ['00:08.0', '00:09.0']
port_info:
- dest_mac: 08:00:27:40:93:58 # MAC OF LOOPBACK TO IT'S DUAL INTERFACE
src_mac: 08:00:27:99:33:25
- dest_mac: 08:00:27:99:33:25 # MAC OF LOOPBACK TO IT'S DUAL INTERFACE
src_mac: 08:00:27:40:93:58platform:
master_thread_id: 0
latency_thread_id: 1
dual_if:
- socket: 0
threads: [2,3]
Save the config to file? (Y/n)
Default filename is /etc/trex_cfg.yaml
Press ENTER to confirm or enter new file:
File /etc/trex_cfg.yaml already exist, overwrite? (y/N)y
Saved to /etc/trex_cfg.yaml.
上面操作修改部分看红框:
4.如需修改网卡请编辑配置文件
sudo vim /etc/trex_cfg.yaml
5.启动trex
1).先启动trex主程序,本方案是用网线做的回环测试。
sudo ./t-rex-64 -i
weiy@weiy-VirtualBox:~/work/trex/v3.04$ sudo ./t-rex-64 -i
Starting Scapy server.......... Scapy server is started
The ports are bound/configured.
Starting TRex v3.04 please wait ...
set driver name net_e1000_em
driver capability : TCP_UDP_OFFLOAD SLRO
set dpdk queues mode to ONE_QUE
Number of ports found: 2
zmq publisher at: tcp://*:4500
wait 1 sec .
port : 0
------------
link : link : Link Up - speed 1000 Mbps - full-duplex
promiscuous : 0
port : 1
------------
link : link : Link Up - speed 1000 Mbps - full-duplex
promiscuous : 0
number of ports : 2
max cores for 2 ports : 1
tx queues per port : 3
-------------------------------
RX core uses TX queue number 65535 on all ports
core, c-port, c-queue, s-port, s-queue, lat-queue
------------------------------------------
1 0 0 1 0 0
--------------------------------Per port stats table
ports | 0 | 1
-----------------------------------------------------------------------------------------
opackets | 0 | 0
obytes | 0 | 0
ipackets | 0 | 0
ibytes | 0 | 0
ierrors | 0 | 0
oerrors | 0 | 0
Tx Bw | 0.00 bps | 0.00 bps-Global stats enabled
Cpu Utilization : 0.0 %
Platform_factor : 1.0
Total-Tx : 0.00 bps
Total-Rx : 0.00 bps
Total-PPS : 0.00 pps
Total-CPS : 0.00 cpsExpected-PPS : 0.00 pps
Expected-CPS : 0.00 cps
Expected-BPS : 0.00 bpsActive-flows : 0 Clients : 0 Socket-util : 0.0000 %
Open-flows : 0 Servers : 0 Socket : 0 Socket/Clients : -nan
drop-rate : 0.00 bps
current time : 5.4 sec
test duration : 0.0 sec
2).再开启TRex客户端程序
再打开一个终端运行./trex-console
weiy@weiy-VirtualBox:~/work/trex/v3.04$ ./trex-console
Using 'python3' as Python interpeter
Connecting to RPC server on localhost:4501 [SUCCESS]
Connecting to publisher server on localhost:4500 [SUCCESS]
Acquiring ports [0, 1]: [SUCCESS]
Server Info:Server version: v3.04 @ STL
Server mode: Stateless
Server CPU: 1 x 12th Gen Intel(R) Core(TM) i5-1240P
Ports count: 2 x 1Gbps @ 82540EM Gigabit Ethernet Controller-=TRex Console v3.0=-
Type 'help' or '?' for supported actions
trex> start -f stl/bench.py -m 100% -d 60 -t vm=cached,size=1518
###################################
-m 表示使用多大的带宽,对于10G网卡,90%表示发送9G左右的流量。
-d 测试时间,60秒后自动停止发包。
-f 指定脚本,脚本用于构造发送什么样的数据。
-t 这些参数会传给 -f 参数所指定的脚本,对于 stl/bench.py 我们可以使用 size 指定数据包大小。
3).客户端中stats可查看流量情况
trex>stats
4).主程序界面也可以看到实时流量统计
总结
本操作过程,在PC机和虚拟机VirtualBox(如果笔记本上run virtualbox,网卡不够可以外接带网口的扩展坞进行测试)上验证成功,一方发包,一方run dpdk-l2fwd,vice verse。