尝试使用 Pktgen-DPDK
服务器 网络
Lastmod: 2024-06-17
Published: 2024-06-13

概述

我想进行一次简单的短包负载测试,于是尝试使用 Pktgen-DPDK。

事前需要启用 IOMMU。 启用 IOMMU 记事本

环境

目标环境版本
Ubuntu22.04
DPDK23.11.1
Pktgen-DPDK主分支
NICIntel 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 库

    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 的构建和安装

  • 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
  • pktgen 的选项

    • -P
      • 启用混杂模式
    • -m “[1-2].0”
      • 指定各端口的核心分配。在这种情况下,将端口 1 和 2 分配给核心 0。

实际发送数据包

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。