このトピックでは、Pktgen を使用して Elastic Compute Service (ECS) インスタンスのネットワークパフォーマンスをテストする方法について説明します。
次の例では、Pktgen を使用してネットワークパフォーマンスをテストする方法を示します。
ステップ 1:環境の準備
送信者として 1 台、受信者として 1 台、合計 2 台のサーバーを準備します。各サーバーにセカンダリネットワークインターフェースカード (NIC) を追加します。一方の NIC を管理アクセスに、もう一方をテストに使用します。2 つのテスト用 NIC が通信できることを確認します。次に、ifconfig コマンドを実行し、両方のテスト用 NIC の IP アドレスと MAC アドレスを記録します。この情報は、送信者側でトラフィックを設定するために必要です。
ステップ 2:ソフトウェアのインストール
CentOS 6 はサポートが終了 (EOL) しました。Linux コミュニティのルールに従い、CentOS 6 のリポジトリアドレス http://mirror.centos.org/centos-6/ からすべてのコンテンツが削除されました。Alibaba Cloud でデフォルトの CentOS 6 リポジトリを引き続き使用すると、エラーが報告されます。CentOS 6 の特定のインストールパッケージを使用するには、CentOS 6 のリポジトリアドレスを変更する必要があります。詳細については、「CentOS 6 のリポジトリアドレスを変更する方法」をご参照ください。
送信側と受信側の両方のインスタンスで、次の操作を実行します。
Linux ECS インスタンスにログインします。詳細については、「Workbench を使用した Linux インスタンスへの接続」をご参照ください。
次のコマンドを実行して、
pktgenディレクトリを作成します。cd /root/ mkdir pktgen次のコマンドを実行して、
pktgenディレクトリに移動します。cd pktgen次のコマンドを実行して、Pktgen、Lua、および DPDK のインストールパッケージをダウンロードします。
wget https://git.dpdk.org/apps/pktgen-dpdk/snapshot/pktgen-dpdk-pktgen-3.6.5.zip https://www.lua.org/ftp/lua-5.4.3.tar.gz https://fast.dpdk.org/rel/dpdk-18.11.11.tar.xz説明注:コンパイルの問題を防ぐため、Pktgen、Lua、および DPDK のバージョンには互換性が必要です。この記事ではコマンド例のバージョンを使用していますが、他の互換性のあるバージョンも使用できます。
次のコマンドを順に実行して、インストールパッケージを解凍します。
tar -Jxvf dpdk-18.11.11.tar.xz tar -zxvf lua-5.4.3.tar.gz unzip pktgen-dpdk-pktgen-3.6.5.zipコンパイル中に依存関係が不足している場合は、次のコマンドを実行して必要なパッケージをインストールします。
CentOS 7
yum -y install kernel-devel.x86_64 yum -y install numactl-devel.x86_64 yum -y install elfutils-libelf-devel yum -y install libpcap-develCentOS 8
説明libpcap-develパッケージは CentOS 8 にはデフォルトでインストールされていないため、手動でインストールする必要があります。次のコマンドを実行する前に、「CentOS オペレーティングシステム」の手順に従ってミラーリポジトリを変更してください。次に、
Centos-vault-8.5.2111.repoファイルから[PowerTools]ブロックをコピーし、CentOS-PowerTools.repoという名前の新しいファイルに貼り付けます。
dnf config-manager --add-repo /etc/yum.repos.d/CentOS-PowerTools.repo dnf config-manager --set-enabled PowerTools dnf -y upgrade libmodulemd dnf -y install kernel-devel.x86_64 dnf -y install elfutils-libelf-devel dnf -y install numactl-devel.x86_64 dnf -y install libpcap-devel
次のコマンドを順に実行して、DPDK をコンパイルおよびインストールします。
cd dpdk-stable-18.11.11 make config T=x86_64-native-linuxapp-gcc make all -j32 cd ..次のコマンドを順に実行して、Lua をコンパイルおよびインストールします。
cd lua-5.4.3 make make install cd ..次のコマンドを順に実行して、Pktgen をコンパイルおよびインストールします。
cd pktgen-dpdk-pktgen-3.6.5/ export RTE_SDK=/root/pktgen/dpdk-stable-18.11.11/ export RTE_TARGET=build make -j32
ステップ 3:ドライバーの vfio へのバインド
送信側と受信側の両方のインスタンスで、次の操作を実行します。
次のコマンドを実行して
/proc/cmdlineファイルを確認し、オペレーティングシステムの GRUB 設定にintel_iommu=onが含まれていることを確認します。cat /proc/cmdline出力は次のようになります。パラメーターがない場合は、次の手順で追加します。
BOOT_IMAGE=/boot/vmlinuz-3.10.0-XXXX.19.1.el7.x86_64 root=UUID=9f2d3e15-XXXX-XXXX-8385-0165b4b67864 ro crashkernel=auto spectre_v2=retpoline rhgb quiet net.ifnames=0 console=tty0 console=ttyS0,115200n8 noibrs intel_iommu=on次のコマンドを実行して、
/etc/default/grubファイルを編集します。vim /etc/default/grubiキーを押して編集モードに入り、GRUB_CMDLINE_LINUX の行にintel_iommu=onを追加します。変更後の内容は次の図のようになります。
ファイルを保存して閉じるには、
Escキーを押し、:wqと入力してEnterキーを押します。次のコマンドを実行して、設定を更新します。
grub2-mkconfig -o /boot/grub2/grub.cfg次のコマンドを実行して、サーバーを再起動します。
reboot
次のコマンドを順に実行して、
vfioおよびvfio-pciドライバーをロードします。modprobe vfio modprobe vfio-pci次のコマンドを実行して、
noniommu_modeを設定します。echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode次のコマンドを実行して、NIC の
bus-info値を表示し、記録します。ethtool -i eth1説明注:この例では
eth1NIC を使用しています。ご利用の環境に合わせて実際の NIC 名を使用してください。システムは次のような出力を表示します。
driver: virtio_net version: 1.0.0 firmware-version: expansion-rom-version: bus-info: 0000:00:08.0 supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no次のコマンドを実行して、
eth1NIC から virtio ドライバーをアンバインドします。重要この例では、
eth1NIC から virtio ドライバーをアンバインドします。この操作により、NIC のネットワーク接続が中断されます。この操作はオフピーク時間に実行することを推奨します。echo "[$Bus-info]" > /sys/bus/pci/drivers/virtio-pci/unbind説明注:
[$Bus-info]をステップ 4 で記録したbus-infoの値に置き換えてください。次のコマンドを実行して、
bus-infoをvfio-pciドライバーにバインドします。/root/pktgen/dpdk-stable-18.11.11/usertools/dpdk-devbind.py -b vfio-pci [$Bus-info]説明[$Bus-info]をステップ 4 で記録したbus-infoの値に置き換えてください。CentOS 8.3 (Python 3.6.8) 環境では、python3インタープリターを使用してスクリプトを実行する必要があります。コマンドを次のように変更します:python3 /root/pktgen/dpdk-stable-18.11.11/usertools/dpdk-devbind.py -b vfio-pci [$Bus-info]
ステップ 4:ヒュージページの設定
送信側と受信側の両方のインスタンスで次の操作を実行します。ご利用のシステムの NUMA ノード数を確認し、対応するコマンドを実行してください。
デュアルノードシステムの場合
echo 8000 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages echo 8000 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepagesシングルノードシステムの場合
echo 8000 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
ステップ 5:Pktgen の起動
送信側と受信側の両方のインスタンスで、次の操作を実行します。
pktgen-dpdk-pktgen-3.6.5ディレクトリで、次のコマンドを実行して Pktgen を起動し、Pktgen ターミナルを立ち上げます。./app/build/pktgen -c 0x1ffff -n 4 --socket-mem 16000 -w [$Bus-info] -- -P -m "[1-16:1-16].0"説明0x1ffff:プロセスの CPU コアマスクを指定します。最下位ビットのコアはシェルコントロール用に予約され、他のコアはポートでのパケットの送受信に使用されます。
"[1-16:1-16].0":パケット処理用の CPU コアを指定します。この範囲は、CPU コアマスクで定義されたコアのサブセットである必要があります。
1-16 (コロンの前) はパケット受信用です。
1-16 (コロンの後) はパケット送信用です。
.0 はポート 0 を指定します。
送信パフォーマンスが不十分な場合は、CPU コアの範囲を調整できます。パケット送信により多くのコアを使用すると、より多くのヒュージページが必要になることに注意してください。ヒュージページが不足していると、Pktgen の起動に失敗します。
システムは次のような出力を表示します。
Copyright (c) <2010-2019>, Intel Corporation. All rights reserved. Powered by DPDK EAL: Detected 64 lcore(s) EAL: Detected 1 NUMA nodes EAL: Multi-process socket /var/run/dpdk/rte/mp_socket EAL: No free hugepages reported in hugepages-1048576kB EAL: Probing VFIO support... EAL: VFIO support initialized EAL: PCI device 0000:00:08.0 on NUMA socket -1 EAL: Invalid NUMA socket, default to 0 EAL: probe driver: 1af4:1000 net_virtio EAL: using IOMMU type 8 (No-IOMMU) Lua 5.4.3 Copyright (C) 1994-2021 Lua.org, PUC-Rio *** Copyright (c) <2010-2019>, Intel Corporation. All rights reserved. *** Pktgen created by: Keith Wiles -- >>> Powered by DPDK <<< Initialize Port 0 -- TxQ 16, RxQ 16, Src MAC 00:16:3e:24:9b:a4 Port 0: Link Up - speed 10000 Mbps - full-duplex <Enable promiscuous mode> RX/TX processing lcore: 1 rx: 1 tx: 1 RX/TX processing lcore: 2 rx: 1 tx: 1 RX/TX processing lcore: 3 rx: 1 tx: 1 RX/TX processing lcore: 4 rx: 1 tx: 1 - Ports 0-0 of 1 <Main Page> Copyright (c) <2010-2019>, Intel Corporation Flags:Port : P-----R--------:0 Link State : <UP-10000-FD> ----TotalRate---- Pkts/s Max/Rx : 1/0 1/0 Max/Tx : 0/0 0/0 MBits/s Rx/Tx : 0/0 0/0 Broadcast : 0 Multicast : 0 Sizes 64 : 0 65-127 : 0 128-255 : 0 256-511 : 0 512-1023 : 0 1024-1518 : 0 Runts/Jumbos : 2/0 ARP/ICMP Pkts : 2/0 Errors Rx/Tx : 0/0 Total Rx Pkts : 2 Tx Pkts : 0 Rx MBs : 0 Tx MBs : 0 : Pattern Type : abcd... Tx Count/% Rate : Forever /100% Pkt Size/Tx Burst : 64 / 64 Port Src/Dest : 1234 / 5678 Pkt Type:VLAN ID : IPv4 / UDP:0001 802.1p CoS/DSCP/IPP : 0/ 0/ 0 VxLAN Flg/Grp/vid : 0000/ 0/ 0 IP Destination : 192.168.X.X Source : 192.168.X.X/24 MAC Destination : 00:00:00:00:00:00 Source : 00:XX:XX:24:9b:a4 PCI Vendor/Addr : 1af4:1000/00:08.0 -- Pktgen Ver: 3.6.5 (DPDK 18.11.11) Powered by DPDK (pid:4873) ------------- Pktgen:/>Pktgen ターミナルで、送信側で次のコマンドを順に実行して、トラフィックストリームを設定します。
set 0 proto udp range 0 src mac start [$MAC] range 0 src mac min [$MAC] range 0 src mac inc 00:00:00:00:00:00 range 0 dst mac start ee:ff:ff:ff:ff:ff range 0 dst mac min ee:ff:ff:ff:ff:ff range 0 dst mac inc 00:00:00:00:00:00 range 0 src port start 10000 range 0 src port min 10000 range 0 src port max 10000 range 0 src port inc 0 range 0 dst port start 2000 range 0 dst port min 2000 range 0 dst port max 2255 range 0 dst port inc 1 range 0 proto udp range 0 src ip start [$Local_IP] range 0 src ip min [$Local_IP] range 0 src ip inc 0.0.0.0 range 0 size start 64 range 0 size min 64 range 0 size max 64 range 0 size inc 0 range 0 dst ip start [$Receive_IP] range 0 dst ip min [$Receive_IP] range 0 dst ip inc 0.0.0.0 enable all range説明[$MAC]を送信者の MAC アドレスに置き換えます。[$Local_IP]を送信者の IP アドレスに置き換えます。[$Receive_IP]を受信者の IP アドレスに置き換えます。
Pktgen ターミナルで、送信側で次のコマンドを実行してトラフィックの送信を開始します。
start 0トラフィックデータを確認します。
送信者
-iPorts 0-0 of 1 <Main Page> Copyright (c) <2010-2019>, Intel Corporation Flags:Port : P-----R--------:0 1/0 Link State : <UP-10000-FD> ----TotalRate---- Pkts/s Max/Rx : 1/0 1/0 Max/Tx : 14906304/14904704 14906304/14904704 MBits/s Rx/Tx : 0/10015 0/10015 Broadcast : 0 Multicast : 0 Sizes 64 : 0 65-127 : 0 128-255 : 0 256-511 : 0 512-1023 : 0 1024-1518 : 0 Runts/Jumbos : 16/0 ARP/ICMP Pkts : 16/0 Errors Rx/Tx : 0/0 Total Rx Pkts : 16 Tx Pkts : 1655962864受信者
- Ports 0-0 of 1 <Main Page> Copyright (c) <2010-2019>, Intel Corporation Flags:Port : P--------------:0 Link State : <UP-10000-FD> ----TotalRate---- Pkts/s Max/Rx : 14911585/14910795 14911585/14910795 Max/Tx : 0/0 0/0 MBits/s Rx/Tx : 10020/0 10020/0 Broadcast : 0 Multicast : 0 Sizes 64 : 1862740038 65-127 : 0 128-255 : 0 256-511 : 0 512-1023 : 0 1024-1518 : 0 Runts/Jumbos : 6/0 ARP/ICMP Pkts : 6/0 Errors Rx/Tx : 0/0 Total Rx Pkts : 2298743466 Tx Pkts : 0 Rx MBs : 1544755 Tx MBs : 0 : Pattern Type : abcd... Tx Count/% Rate : Forever /100% Pkt Size/Tx Burst : 64 / 64 Port Src/Dest : 1234 / 5678 Pkt Type:VLAN ID : IPv4 / TCP:0001 802.1p CoS/DSCP/IPP : 0/ 0/ 0 VxLAN Flg/Grp/vid : 0000/ 0/ 0 IP Destination : 192.168.X.1 Source : 192.168.X.X/24 MAC Destination : 00:00:00:00:00:00 Source : 00:XX:XX:24:2d:55 PCI Vendor/Addr : 1af4:1000/00:08.0 -- Pktgen Ver: 3.6.5 (DPDK 18.11.11) Powered by DPDK (pid:4072) -------------
送信側で次のコマンドを実行して、トラフィックを停止します。
stop 0