编译DPDK20与21以及testpmd和pktgen的测试

书接上文,本文描述DPDK20与21跑testpmd和pktgen测试的步骤。和DPDK19不同的是,DPDK20与21没有dpdk-setup.sh这个脚本工具了,感觉不是很方便欸。

目录

1. Setup

1.1 Build DPDK

1.1.1 meson build

1.1.2 ninja -C build

1.1.3 ninja install

1.1.4 ldconfig

1.2 Bind PMD

1.2.1 使用vfio

1.2.2 使用uio

1.3 Create hugepages

2. Run testpmd

3. Run pktgen


1. Setup

1.1 Build DPDK

下载和解压DPDK之后,进入DPDK文件夹。

1.1.1 meson build

#meson build

1.1.2 ninja -C build

#ninja -C build

 运行之后的最后一行是这样,运行的时候就是0到2479的过程。

[2479/2479] Linking target app/dpdk-testpmd.

1.1.3 ninja install

#cd build
#ninja install

运行之后最后一部分如下。

'./librte_raw_ioat.so' -> 'dpdk/pmds-21.0/librte_raw_ioat.so'
'./librte_raw_ioat.so.21' -> 'dpdk/pmds-21.0/librte_raw_ioat.so.21'
'./librte_raw_ioat.so.21.0' -> 'dpdk/pmds-21.0/librte_raw_ioat.so.21.0'
'./librte_raw_ntb.so' -> 'dpdk/pmds-21.0/librte_raw_ntb.so'
'./librte_raw_ntb.so.21' -> 'dpdk/pmds-21.0/librte_raw_ntb.so.21'
'./librte_raw_ntb.so.21.0' -> 'dpdk/pmds-21.0/librte_raw_ntb.so.21.0'
'./librte_raw_octeontx2_dma.so' -> 'dpdk/pmds-21.0/librte_raw_octeontx2_dma.so'
'./librte_raw_octeontx2_dma.so.21' -> 'dpdk/pmds-21.0/librte_raw_octeontx2_dma.so.21'
'./librte_raw_octeontx2_dma.so.21.0' -> 'dpdk/pmds-21.0/librte_raw_octeontx2_dma.so.21.0'
'./librte_raw_octeontx2_ep.so' -> 'dpdk/pmds-21.0/librte_raw_octeontx2_ep.so'
'./librte_raw_octeontx2_ep.so.21' -> 'dpdk/pmds-21.0/librte_raw_octeontx2_ep.so.21'
'./librte_raw_octeontx2_ep.so.21.0' -> 'dpdk/pmds-21.0/librte_raw_octeontx2_ep.so.21.0'
'./librte_raw_skeleton.so' -> 'dpdk/pmds-21.0/librte_raw_skeleton.so'
'./librte_raw_skeleton.so.21' -> 'dpdk/pmds-21.0/librte_raw_skeleton.so.21'
'./librte_raw_skeleton.so.21.0' -> 'dpdk/pmds-21.0/librte_raw_skeleton.so.21.0'
'./librte_regex_octeontx2.so' -> 'dpdk/pmds-21.0/librte_regex_octeontx2.so'
'./librte_regex_octeontx2.so.21' -> 'dpdk/pmds-21.0/librte_regex_octeontx2.so.21'
'./librte_regex_octeontx2.so.21.0' -> 'dpdk/pmds-21.0/librte_regex_octeontx2.so.21.0'
'./librte_vdpa_ifc.so' -> 'dpdk/pmds-21.0/librte_vdpa_ifc.so'
'./librte_vdpa_ifc.so.21' -> 'dpdk/pmds-21.0/librte_vdpa_ifc.so.21'
'./librte_vdpa_ifc.so.21.0' -> 'dpdk/pmds-21.0/librte_vdpa_ifc.so.21.0'

1.1.4 ldconfig

#ldconfig

注意,这里需要权限,可以root也可以sudo。

1.2 Bind PMD

vfio和uio选择一个即可。

1.2.1 使用vfio

#sudo modprobe vfio-pci

/* 看看IOMMU是否enable */
#cat /sys/module/vfio/parameters/enable_unsafe_noiommu_mode 
N
/* 如果没有就需要enable */
#sudo echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

/* down网卡*/
#ifconfig enp1s0 down

 查看网卡的状态:

#./usertools/dpdk-devbind.py --status

Network devices using kernel driver
===================================
0000:01:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp1s0 drv=r8169 unused=vfio-pci 
0000:21:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp33s0 drv=r8169 unused=vfio-pci 
0000:64:00.1 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp100s0f1 drv=r8169 unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

Crypto devices using kernel driver
==================================
0000:23:00.1 'Starship/Matisse Cryptographic Coprocessor PSPCPP 1486' drv=ccp unused=vfio-pci 

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

绑定网卡。 

/* dpdk dev bind */
#./usertools/dpdk-devbind.py --bind=vfio-pci 01:00.0 21:00.0
# ./usertools/dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' drv=vfio-pci unused=r8169
0000:21:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' drv=vfio-pci unused=r8169

Network devices using kernel driver
===================================
0000:64:00.1 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp100s0f1 drv=r8169 unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

Crypto devices using kernel driver
==================================
0000:23:00.1 'Starship/Matisse Cryptographic Coprocessor PSPCPP 1486' drv=ccp unused=vfio-pci 

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

1.2.2 使用uio

一来DPDK更推荐vfio,另一方面使用igb_uio更加复杂了,大家可以自行百度。

1.3 Create hugepages

#sudo mkdir -p /dev/hugepages
#sudo mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
#sudo echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages;

2. Run testpmd

这部分比较简单了,和之前的差不太多。

#./build/app/dpdk-testpmd -- -i

EAL: Detected 48 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL:   using IOMMU type 8 (No-IOMMU)
EAL: Ignore mapping IO port bar(0)
EAL: Probe PCI driver: net_r8168 (10ec:8168) device: 0000:01:00.0 (socket 0)
r8168: driver version 1.001 Dec  8 2022 17:18:20 init
EAL: Ignore mapping IO port bar(0)
EAL: Probe PCI driver: net_r8168 (10ec:8168) device: 0000:21:00.0 (socket 0)
r8168: driver version 1.001 Dec  8 2022 17:18:20 init
EAL: No legacy callbacks, legacy socket not created
Interactive-mode selected
testpmd: create a new mbuf pool <mb_pool_0>: n=523456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
Configuring Port 0 (socket 0)
Port 0: 00:E0:4C:68:00:9A
Configuring Port 1 (socket 0)
Port 1: 00:E0:4C:68:00:06
Checking link statuses...
Done
testpmd> start tx_first 
io packet forwarding - ports=2 - cores=1 - streams=2 - NUMA support enabled, MP allocation mode: native
Logical Core 1 (socket 0) forwards packets on 2 streams:
  RX P=0/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:01
  RX P=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00

  io packet forwarding packets/burst=32
  nb forwarding cores=1 - nb forwarding ports=2
  port 0: RX queue number: 1 Tx queue number: 1
    Rx offloads=0x0 Tx offloads=0x0
    RX queue: 0
      RX desc=512 - RX free threshold=64
      RX threshold registers: pthresh=0 hthresh=0  wthresh=0
      RX Offloads=0x0
    TX queue: 0
      TX desc=512 - TX free threshold=0
      TX threshold registers: pthresh=0 hthresh=0  wthresh=0
      TX offloads=0x0 - TX RS bit threshold=0
  port 1: RX queue number: 1 Tx queue number: 1
    Rx offloads=0x0 Tx offloads=0x0
    RX queue: 0
      RX desc=512 - RX free threshold=64
      RX threshold registers: pthresh=0 hthresh=0  wthresh=0
      RX Offloads=0x0
    TX queue: 0
      TX desc=512 - TX free threshold=0
      TX threshold registers: pthresh=0 hthresh=0  wthresh=0
      TX offloads=0x0 - TX RS bit threshold=0
testpmd> stop
Telling cores to stop...
Waiting for lcores to finish...

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 2139190        RX-dropped: 0             RX-total: 2139190
  TX-packets: 2139188        TX-dropped: 0             TX-total: 2139188
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 2139200        RX-dropped: 0             RX-total: 2139200
  TX-packets: 2139203        TX-dropped: 0             TX-total: 2139203
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 4278390        RX-dropped: 0             RX-total: 4278390
  TX-packets: 4278391        TX-dropped: 0             TX-total: 4278391
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Done.

3. Run pktgen

下载pktgen的时候需要注意pktgen的版本需要与DPDK的版本匹配,比如DPDK21需要pktgen 22.2.0,否则会报错。

/* 进入pktgen的目录下 */
#cd pktgen-21.03.1/
 
/* 设置DPDK源码包的绝对路径。当编译外部应用时,用户必须定义这个环境变量。 */
#export RTE_SDK=/home/Driver/dpdk-stable-20.11.6

/* compile pktgen */ 
#meson build
#ninja -C build

/* 这里加了个-T,不然看起来乱乱的 */
# ./build/app/pktgen -l 0-3 -n 3 -- -P -T -m"1.0,2.1"

以上就是全部内容。

如果觉得这篇文章有用的话,可以点赞、评论或者收藏,万分感谢,goodbye~

### 如何使用 DPDK-Pktgen 进行性能测试 #### 1. 环境准备 为了能够顺利运行 DPDK Pktgen,需要完成一系列初始化工作。这包括设置环境变量、加载大页内存、绑定网卡到用户空间驱动以及安装必要的依赖项。 以下是具体的准备工作: - 设置环境变量并启用大页支持[^2]。 - 将目标网卡绑定至 `uio_pci_generic` 或其他适合的用户空间驱动程序[^3]。 ```bash modprobe uio insmod $RTE_SDK/build/kmod/igb_uio.ko echo "options hugepages nr_hugepages=1024" | sudo tee /etc/modprobe.d/hugepages.conf mount -t hugetlbfs nodev /mnt/huge ``` #### 2. 编译安装 Pktgen 的构建依赖于已成功编译DPDK 库。因此,在编译 Pktgen 前需先确认 DPDK 已经正确安装。 具体命令如下所示[^5]: ```bash export RTE_SDK=/path/to/dpdk export RTE_TARGET=x86_64-native-linuxapp-gcc cd /path/to/pktgen-dpdk make ``` #### 3. 启动 Pktgen 并配置参数 启动 Pktgen 需要指定 EAL 参数(Environment Abstraction Layer),这些参数定义了应用程序使用的硬件资源行为模式。常见的启动脚本可能类似于以下形式: ```bash ./build/app/pktgen -c 0xf -n 4 --proc-type auto \ --file-prefix pg --socket-mem 1024,1024 \ -- -T -m "[1:2].0,[3:4].1" ``` 上述命令解释: - `-c 0xf`: CPU 核心掩码,表示哪些核心被分配给应用。 - `-n 4`: 指定 NUMA 节点数。 - `--socket-mem`: 分配每颗 NUMA 上的大页数量。 - `-T`: 表示开启统计功能。 - `-m "[1:2].0,[3:4].1"`: 映射逻辑核到物理端口。 #### 4. 发送数据包 通过 Web UI 或 CLI 控制台发送流量。例如,可以通过以下方式设定速率持续时间: ```text set all rate 10 # 设定所有端口以 10% 的线速发送 start all # 开始传输 stop all # 停止传输 show all stats # 查看实时统计数据 ``` #### 5. 数据分析 收集来自控制台输出的结果或者保存日志文件以便进一步处理。通常关注的关键指标有吞吐量 (Throughput),延迟 (Latency) 丢包率 (Packet Loss Rate)[^4]。 --- ### 示例代码片段展示如何自动化部署流程 下面提供一段简单的 Bash 脚本来实现部分自动化的部署过程: ```bash #!/bin/bash # Define paths and variables DPDK_DIR="/devel/dpdk" PKTGEN_DIR="/devel/pktgen-dpdk" # Install dependencies yum install -y gcc libpcap-devel kernel-devel kernel-headers # Clone repositories if not existent yet if [ ! -d "$DPDK_DIR" ]; then git clone http://dpdk.org/git/dpdk $DPDK_DIR fi if [ ! -d "$PKTGEN_DIR" ]; then git clone http://dpdk.org/git/apps/pktgen-dpdk $PKTGEN_DIR fi # Build DPDK SDK cd $DPDK_DIR && make config T=x86_64-native-linuxapp-gcc && make # Export environment variable & build pktgen application export RTE_SDK=$DPDK_DIR export RTE_TARGET=x86_64-native-linuxapp-gcc cd $PKTGEN_DIR && make ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值