DPDK+Pktgen环境安装

本文介绍如何利用DPDK和Pktgen实现高性能的数据包发送。通过详细步骤指导读者在CentOS环境下编译和配置这两款工具,实现对网卡性能的极限测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DPDK - Data Plane Development Kit (官网:http://dpdk.org/)
Pktgen - Packet generation (在dpdk官网有链接)
两者搭配,可以实现普通模式下网卡无法达到的包发送速率,在公司的服务器上测试千兆网卡基本可以打满,40G光口在OpenStack passthrough的模式下可以跑到24G左右,据说纯物理服务器可以打到38G左右的速率。第一次见到这种模式,还是比较有意思的,今天主要用最新的版本编译并运行一下这两个软件组合。

准备材料:
KVM + virt-manager
Centos7.4-1708_x64虚拟机 :操作系统安装是选择development模式 + 3个虚拟网卡(其中两个网卡类型为virtio,另外一个可以留用ssh链接guest) + libpcap-dev软件包
dpdk-17.05.2.tar.xz
pktgen-3.4.5.zip

dpdk-17.05.2是当前的一个stable版本,Pktgen则是在一直更新,下载最新的测试,安装方式很简单:

1.解压dpdk和pktgen
# tar xfJ dpdk-17.05.2.tar.xz
# unzip pktgen-3.4.5.zip

2.编译dpdk
# cd dpdk-stable-17.07.2/usertools
# ./dpdk-setup.sh
[12] x86_64-native-linuxapp-gcc
一般libpcap-dev安装正常之后应该都可以成功编译,编译完成之后会在dpdk-stable-17.07.2目录下生成一个x86_64-native-linuxapp-gcc目录,里面会存有dpdk相关的头文件和内核模块,其他程序调用会用到,并且自动将dpdk的相关程序安装到/usr/local/bin,/usr/local/sbin目录下

3.编译pktgen
有了上一步dpdk编译后的环境,首先配置RTE_SDK环境变量为dpdk所在目录,例如
export RTE_SDK=/root/dpdk1.7/dpdk-stable-17.05.2
再配置RTE_TARGET
export RTE_SDK=x86_64-native-linuxapp-gcc
直接编译
make
注意在这个版本的pktgen会出现两个问题:
a: pktgen会自动联网下载lua-5.3.4.tar.gz包,所以如果服务器无法联网就比较麻烦,我在编译完成之后搜索pktgen目录,发现下载的lua-5.3.4.tar.gz包是放在./lib/lua下面的,推测手动去其他地方下载后拷贝进去应该也可以使用
b: pktgen有两个地方编译会提示找不到rte_bus_pci.h,事实确实是没有这个头文件,查看报错的文件里面有一个宏定义,只要dpdk版本高于17.05,就include <rte_bus_pci.h>,实际上dpdk并没有生成这个文件,所以最简单的办法就是将这一段宏注释掉,并分别包含rte_bus.h和rte_pci.h,例如pktgen-stats.c中修改如下
/*
#if RTE_VERSION >= RTE_VERSION_NUM(17, 5, 0, 0)
#include <rte_bus_pci.h>
#endif
*/
#include <rte_bus.h>
#include <rte_pci.h>
然后编译就可以通过了

4.运行pktgen
pktgen实在是一个太过于强大的工具,信息量太大一时无法全部理清,只能参考文档先运行起来再说,基本上前提条件有三:
a: 系统已经配置了大页内存
b: 加载了dpdk的内核模块
c: dpdk已经绑定了网卡
把所有的内容都写下来,可以固化成一个脚本
——————————————————————————————————————————————————
#!/bin/sh
#配置大页内存
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
#加载dpdk的模块,注意路径一致
sudo modprobe uio
sudo insmod /root/dpdk1.7/dpdk-stable-17.05.2/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
#停止要绑定的网卡,目的是为了消除绑定在上面的路由信息,否则dpdk绑定时会提示此网卡上配置
#有路由表信息,无法绑定
ifconfig eth0 down
ifconfig eth1 down
#通过dpdk查询网卡的总线信息,在这里纯粹是为了验证
dpdk-devbind --status
#正式绑定网卡
dpdk-devbind -b igb_uio 00:08.0 00:09.0
#这是运行pktgen的参数
#/root/pktgen/pktgen-3.4.5/app/x86_64-native-linuxapp-gcc/pktgen
#app/x86_64-native-linuxapp-gcc/pktgen -c 0xf -n 3 --proc-type auto -m 512 – -P -T -m [1].0,[3].1
———————————————————————————————————————————————————

查询网卡可以直接执行"dpdk-devbind --status"命令或者通过"ethtool -i 网卡名" 找到其对应的总线信息。运行pktgen需要在其根目录下执行,不能cd到pktgen程序所在的目录,运行参数如上所示,也可以-h查看帮助。

今天先到这里,pktgen的功能比较复杂,一时还不能全部熟悉,下一步要研究参数的意义和灵活配置以及pktgen加载本地的pcap数据进行发包的可行性,还有dpdk绑定mellanox网卡的方法。

### 如何使用 DPDK-Pktgen 进行性能测试 #### 1. 环境准备 为了能够顺利运行 DPDKPktgen,需要完成一系列初始化工作。这包括设置环境变量、加载大页内存、绑定网卡到用户空间驱动以及安装必要的依赖项。 以下是具体的准备工作: - 设置环境变量并启用大页支持[^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 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值