概要
ちょっとしたショートパケットの負荷試験をしてみたいと思い、Pktgen-DPDKを使ってみました。
事前にIOMMUを有効にしておく必要があります。IOMMUの有効化メモ
環境
対象環境 | バージョン |
---|---|
Ubuntu | 22.04 |
DPDK | 23.11.1 |
Pktgen-DPDK | mainブランチ |
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 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のビルドとインストール
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を割り当てる
- -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を使ってみました。