[[403216]] この記事はWeChatの公開アカウント「zartbot」から転載したもので、著者はZartbotのネットワークケーブルプライヤーです。この記事を転載する場合はzartbot公式アカウントまでご連絡ください。 クラウド上の数人の友人が VPC ネットワークのパフォーマンスをテストしたかったので、dpdk コードをいくつか記述し、Alibaba Cloud で実験を行いました。これは他のクラウドにも適用できます。 関連ライブラリをインストールするルートとしてログインし、ソースを更新します - #元の設定ファイルをバックアップする
- /etc/yum.repos.d/bak ディレクトリに移動します。
- mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
- #Alibaba Cloudのソースカバレッジを活用する
- wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
- yum インストール -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
- sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' yum リポジトリのリポジトリ
- sed -i 's|^metalink|#metalink|' yum リポジトリの
- sudo dnf config-manager
-
- yum メイクキャッシュ
- yumアップデート
-
- yum groupinstall 「開発ツール」
- yum install gcc-gfortran kernel-modules-extra tcl tk tcsh terminator tmux kernel-rpm-macros elfutils-libelf-devel libnl3-devel meson createrepo numactl-devel
- pip3 pyelftools をインストールする
iommuを有効にする- sudo vi /etc/デフォルト/grub
-
- // 「intel_iommu=on iommu=pt」を GRUB_CMDLINE_LINUX 行に追加します
- //保存して終了
次にgrubを更新し、システムを再起動します - sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
- sudo 再起動
DPDKのインストールCentOSでは、/usr/localパス、主にLD_LIBRARY_PATH PATHとPKG_CONFIG_PATH、sudoパスを追加する必要があります。 - sudo vi /etc/ld.so.conf.d/dpdk.conf
-
- >>次のパスを追加
- /usr/ローカル/lib64
- >>終了
-
- sudo ldconfig
-
- vim ~/.bashrc
- >>次のパスを追加
-
- エクスポート PATH=/usr/ローカル/bin:$PATH
- エクスポート PKG_CONFIG_PATH=/usr/ローカル/lib64/pkgconfig:${PKG_CONFIG_PATH}
-
-
- ソースを保存した後
- ソース ~/.bashrc
- sudo vim /etc/sudoers
-
- >>/usr/ local /binをsecure_pathに追加します
- デフォルト secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/ local /bin
次にdpdkを解凍し、コンパイルしてインストールします - http://fast.dpdk.org/rel/dpdk-21.05.tar.xz を取得します。
- tar xf dpdk-21.05.tar.xz
-
- cd dpdk-21.05
- メソンビルド -D 例 =すべて
-
- CDビルド
- 忍者
- sudo 忍者インストール
- sudo ldconfig
Hugepage を設定し、インターフェースをバインドする - dpdk-hugepages.py
- modprobe vfio-pci
- dpdk-devbind.py -s
-
- カーネルドライバーを使用するネットワークデバイス
- ==================================
- 0000:00:05.0 'Virtio ネットワーク デバイス 1000' if=eth0 drv=virtio-pci unused=vfio-pci *アクティブ*
- 0000:00:06.0 'Virtio ネットワーク デバイス 1000' if=eth1 drv=virtio-pci unused=vfio-pci *アクティブ*
仮想マシン環境ではnoniommu_modeが必要であることに注意してください。 - ifconfig eth1 ダウン
- エコー 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
- dpdk-devbind.py -b vfio-pci 0000:00:06.0
確認する - dpdk-devbind.py -s
-
- DPDK互換ドライバーを使用するネットワークデバイス
- ===========================================
- 0000:00:06.0 'Virtio ネットワーク デバイス 1000' drv=vfio-pci unused=
-
- カーネルドライバーを使用するネットワークデバイス
- ==================================
- 0000:00:05.0 'Virtio ネットワーク デバイス 1000' if=eth0 drv=virtio-pci unused=vfio-pci *アクティブ*
インターフェースのサポートを確認コードをダウンロードする - cd ~
- https://github.com/zartbot/learn_dpdk/archive/refs/heads/main.zip をダウンロードします
- main.zip を解凍します。
- cd learn_dpdk-main/
コンパイル - cd 01_port_init/devinfo/
- きれいにする;作る
インターフェースのサポートを確認 - ./ビルド/devinfo
-
- EAL: 24 個の lcore が検出されました
- EAL: 1 つの NUMA ノードが検出されました
- EAL: DPDKの共有リンクを検出しました
- EAL: マルチプロセスソケット /var/run/dpdk/rte/mp_socket
- EAL: 選択されたIOVAモード「PA」
- EAL:利用可能な 1048576 kB の hugepages が報告されていません
- EAL: VFIO サポートが初期化されました
- EAL: 無効な NUMA ソケット、デフォルト 0に
- EAL: プローブ PCI ドライバー: net_virtio (1af4:1000) デバイス: 0000:00:05.0 (ソケット 0)
- eth_virtio_pci_init(): PCI デバイスの初期化に失敗しました
-
- EAL: 要求されたデバイス 0000:00:05.0 は使用できません
- EAL: 無効な NUMA ソケット、デフォルト 0に
- EAL: プローブ PCI ドライバー: net_virtio (1af4:1000) デバイス: 0000:00:06.0 (ソケット 0)
- EAL: IOMMU タイプ 8 の使用 (-IOMMUなし)
- テレメトリ: レガシー コールバックなし、レガシー ソケットは作成されません
-
-
-
- ****************************************
- 利用可能なポート数: 1
- =========================================
- ポート: 0 ドライバー:net_virtio
- リンクダウン
- MACアドレス: 00:16:3E:25:3F:0A
- PCIe:0000:00:06.0
- 最大RX キュー: 12説明: 65535
- 最大TX キュー: 12説明: 65535
- オフロード機能:
- DEV_RX_OFFLOAD_VLAN_STRIP
- DEV_RX_OFFLOAD_UDP_CKSUM
- DEV_RX_OFFLOAD_TCP_CKSUM
- DEV_RX_OFFLOAD_TCP_LRO
- DEV_RX_OFFLOAD_ジャンボフレーム
-
- DEV_TX_OFFLOAD_VLAN_INSERT
- DEV_TX_OFFLOAD_UDP_CKSUM
- DEV_TX_OFFLOAD_TCP_CKSUM
- DEV_TX_OFFLOAD_TCP_TSO
- DEV_TX_オフロード_マルチセグメント
- =========================================
スピードテスト- cd ~/learn_dpdk-main/02_send_recv/traffic_gen/
send_pkt.c の送信元アドレスと宛先アドレスを変更します。 Alibaba Cloudの宛先MACはeeff.ffff.ffffでなければならないことに注意してください。 - //Mac を初期化する
- 構造体 rte_ether_addr s_addr = {{0x00, 0x16, 0x3e, 0x25, 0x0b, 0xe3}};
- 構造体 rte_ether_addr d_addr = {{0xee, 0xff, 0xff, 0xff, 0xff, 0xff}};
-
- //IPヘッダーを初期化する
- rte_be32_t s_ip_addr = string_to_ip( "10.66.1.220" );
- rte_be32_t d_ip_addr = string_to_ip( "10.66.1.219" );
インターフェースのサポートが限られているため、common.h を変更します。 - #NUM_RX_QUEUE 1 を定義します
- #NUM_TX_QUEUE 1 を定義します
-
- 静的定数構造体rte_eth_conf port_conf_default = {
- .rxmode = {
- .max_rx_pkt_len = RTE_ETHER_MAX_LEN、
- .mq_mode = ETH_MQ_RX_NONE、
- },
- .txmode = {
- .mq_mode = ETH_MQ_TX_NONE、
- }
- };
portinit.c を変更して RX-CHECKSUM OFFLOAD をオフにし、次の段落をコメント アウトします。 - (dev_info.rx_offload_capa と DEV_RX_OFFLOAD_CHECKSUM の場合)
- {
- printf( "ポート[%u]はRXチェックサムオフロードをサポートします。\n" , port);
- port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_CHECKSUM;
- }
最終的な測定速度は約3.3Mppsで、公式販売時の4Mppsに近い。 - [root@iZuf64vmgrtj12kczyslhdZ トラフィック_gen]# ./build/run
- EAL: 24 個の lcore が検出されました
- EAL: 1 つの NUMA ノードが検出されました
- EAL: DPDKの共有リンクを検出しました
- EAL: マルチプロセスソケット /var/run/dpdk/rte/mp_socket
- EAL: 選択されたIOVAモード「PA」
- EAL:利用可能な 1048576 kB の hugepages が報告されていません
- EAL: VFIO サポートが初期化されました
- EAL: 無効な NUMA ソケット、デフォルト 0に
- EAL: プローブ PCI ドライバー: net_virtio (1af4:1000) デバイス: 0000:00:05.0 (ソケット 0)
- eth_virtio_pci_init(): PCI デバイスの初期化に失敗しました
-
- EAL: 要求されたデバイス 0000:00:05.0 は使用できません
- EAL: 無効な NUMA ソケット、デフォルト 0に
- EAL: プローブ PCI ドライバー: net_virtio (1af4:1000) デバイス: 0000:00:06.0 (ソケット 0)
- EAL: IOMMU タイプ 8 の使用 (-IOMMUなし)
- テレメトリ: レガシー コールバックなし、レガシー ソケットは作成されません
-
-
- ポート 0 を初期化しています...
- ポート[0]はTX UDPチェックサムオフロードをサポートします。
- ポート[0]はTX TCPチェックサムオフロードをサポートします。
- ポート[0] MAC: 00:16:3e:25:0b:e3
- コア 1 が RX デキューを実行しています。
- Core 2 がパケットのエンキューを実行しています。
-
- RXキュー[0] PPS: 3280464
- RXキュー[0] PPS: 3277792
- RXキュー[0] PPS: 3303116
- RXキュー[0] PPS: 3307443
- RXキュー[0] PPS: 3296451
- RXキュー[0] PPS: 3294396
- RXキュー[0] PPS: 3297737
- RXキュー[0] PPS: 3290069
- RXキュー[0] PPS: 3279720
- RXキュー[0] PPS: 3285987
- RXキュー[0] PPS: 3279424
次に、common.hの送信と受信を4つのスレッドに変更します。 - #NUM_RX_QUEUE 1 を定義します
- #NUM_TX_QUEUE 1 を定義します
テスト結果は公式の 4Mpps と一致しています。 - RXキュー[0] PPS: 578918
- RXキュー[1] PPS: 866823
- RXキュー[2] PPS: 2288950
- RXキュー[3] PPS: 865335
CPU情報 - [root@iZuf64vmgrtj12kczyslhdZ traffic_gen]# cat /proc/cpuinfo | grep Xeon
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- モデル名: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
|