Pktgen-DPDK を使ってみる
サーバ ネットワーク
Lastmod: 2024-06-17
Published: 2024-06-13

概要

ちょっとしたショートパケットの負荷試験をしてみたいと思い、Pktgen-DPDKを使ってみました。

事前にIOMMUを有効にしておく必要があります。IOMMUの有効化メモ

環境

対象環境バージョン
Ubuntu22.04
DPDK23.11.1
Pktgen-DPDKmainブランチ
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ライブラリのダウンロード

    • DPDK Download 現時点で最新の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のビルドとインストール

  • 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
    
    Network devices using kernel driver
    ===================================
    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+ Network Connection 10fb' if=enp9s0f0 drv=ixgbe unused=
    0000:09:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 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
    Network devices using DPDK-compatible driver
    ============================================
    0000:09:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 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をDPDKで使用する
    • -n 2
      • 2つのメモリチャンネルを使用
    • –proc-type auto
      • プロセスタイプを自動的に決定にする
    • –socket-mem 512
      • ソケット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を使ってみました。