概述
我想进行一次简单的短包负载测试,于是尝试使用 Pktgen-DPDK。
事前需要启用 IOMMU。 启用 IOMMU 记事本
环境
目标环境 | 版本 |
---|---|
Ubuntu | 22.04 |
DPDK | 23.11.1 |
Pktgen-DPDK | 主分支 |
NIC | Intel X520 DA2 |
安装必要的包
安装依赖包
sudo apt-get update sudo apt-get install -y git build-essential libnuma-dev python3-pyelftools linux-headers-$(uname -r) meson ninja-build
DPDK 的构建和安装
下载 DPDK 库
- DPDK 下载 使用当前最新的 LTS 版本 23.11.1
wget https://fast.dpdk.org/rel/dpdk-23.11.1.tar.xz tar xf dpdk-23.11.1.tar.xz cd dpdk-stable-23.11.1
构建 DPDK
meson setup build ninja -C build
安装
ninja -C build install ldconfig
Hugepages 的设置
Hugepages 的设置 DPDK 为了实现高性能,利用大内存页(Hugepages)。
echo "vm.nr_hugepages=1024" > /etc/sysctl.d/90-hugapage.conf sysctl --system
Pktgen-DPDK 的构建和安装
git clone https://github.com/pktgen/Pktgen-DPDK.git cd Pktgen-DPDK
构建
meson setup build ninja -C build
安装
ninja -C build install
网络接口的绑定
检查网络接口
dpdk-devbind.py --status 使用内核驱动的网络设备 =================================== 0000:07:00.0 'RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp7s0 drv=r8169 unused= 0000:09:00.0 '82599ES 10-Gigabit SFI/SFP+ 网络连接 10fb' if=enp9s0f0 drv=ixgbe unused= 0000:09:00.1 '82599ES 10-Gigabit SFI/SFP+ 网络连接 10fb' if=enp9s0f1 drv=ixgbe unused=
绑定 vfio-pci
dpdk-devbind.py --bind=vfio-pci 0000:09:00.1
如果出现
Error: Driver 'vfio-pci' is not loaded.
的情况 加载 vfio-pci 驱动modprobe vfio-pci
确认是否绑定成功
dpdk-devbind.py --status 使用 DPDK 兼容驱动的网络设备 ============================================ 0000:09:00.1 '82599ES 10-Gigabit SFI/SFP+ 网络连接 10fb' drv=vfio-pci unused=ixgbe
drv=vfio-pci 所以 OK
使用 Pktgen-DPDK
启动 Pktgen-DPDK
pktgen -l 0-1 -n 2 --proc-type auto --socket-mem 512 -- -P -m "[1-2].0"
DPDK 的选项
- -l 0-1
- 使用逻辑核心 0-1
- -n 2
- 使用两个内存通道
- –proc-type auto
- 自动决定进程类型
- –socket-mem 512
- 为 Socket 0 分配 512MB
- -l 0-1
pktgen 的选项
- -P
- 启用混杂模式
- -m “[1-2].0”
- 指定各端口的核心分配。在这种情况下,将端口 1 和 2 分配给核心 0。
- -P
实际发送数据包
reset 0
set 0 dst mac XX:XX:XX:XX:XX:XX // 目标 MAC 地址
set 0 dst ip 192.168.3.2 // 目标 IP 地址
set 0 src ip 192.168.3.1/24 // 源 IP 地址
set 0 size 64 // 负载大小
start 0
最后
这样,NIC 应该可以输出大约 10Mpps 的短包?
这样就可以模拟 DDoS 的情况了!所以,我尝试了使用 Pktgen-DPDK。