SRIOVの導入、VFパススルー構成、パケット転送速度性能テスト 目次
1. SRIOVの紹介 ▷ 従来の方法のボトルネック: Qemu のネットワーク カードの従来の方法は、タップ ネットワーク カードを使用してホストのブリッジにブリッジすることですが、パフォーマンスが非常に低く、特にパケット転送速度が非常に低いため、高いパフォーマンス要件を持つシナリオを満たすことが困難です。パフォーマンスが低下する主な理由は、パスが長すぎて、通過するカーネルデバイスが多すぎることです。根本的な理由は、Linux/Unix カーネル自体が高性能向けに設計されていないことです。Linux/Unix は、転送プレーンよりも制御プレーンに適しています。 まず、パフォーマンス テストの結論を示します。従来のタップ + ブリッジ ソリューションと比較して、SRIOV VF パススルーのパフォーマンスが向上しました。 ▷ パケット転送率の向上: 677% 2. 環境の説明 モデル: Dell PowerEdge R620 3. SRIOVを有効にする 図に示すように、BIOSでSRIOVを有効にします。 注意: BIOSでグローバルSRIOVが有効になっている場合でも、ネットワークカードは通常のネットワークカードとして使用できます。 BIOSでVT-dを有効にする必要があります grub 構成 iommu iommu=pt intel_iommu=オン 4. VFを生成する # ネットワークカードを起動します ip link set p1p1 up # pf lshw -c network -businfo の PCI 番号を表示します # ネットワークカードでサポートされている vfs の数を表示します cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs # vf を生成します。スタートアップ echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs を追加することをお勧めします。 注意: ホストの VF ドライバーがブロックされていない場合は、vf を生成した後、ホスト上のすべての名前付きネットワーク カードが表示されるまでしばらく待つ必要があります (そうでない場合は、多数の ethX ネットワーク カードが表示されます)。vfs の数が多いほど、待機時間は長くなります。63 個の vfs の場合、約 10 秒かかります。 5. VFパススルー qemu が libvirt によって管理されている場合、設定方法は 3 つあります。 ▷ 方法1(インターフェース):デバイスセクションに追加 <インターフェースタイプ='hostdev' 管理対象='yes'> <mac アドレス = '52:54:00:ad:ef:8d' /> <ソース> <アドレス タイプ = 'pci' ドメイン = '0x0000' バス = '0x41' スロット = '0x10' 機能 = '0x0'/> </ソース> <VLAN> <タグid='4010'/> </VLAN> </インターフェース> 上記の<source>のアドレスは、たとえば「lshw -c network -businfo」に従って設定できます。 pci@0000:41:10.0 p1p1_0 ▷ 方法2 (hostdev): デバイスセクションに追加 <hostdev モード = 'サブシステム' タイプ = 'pci' 管理対象 = 'はい'> <ソース> <アドレスドメイン='0x0000' バス='0x41' スロット='0x10' 関数='0x0'/> </ソース> </ホストデバイス> 上記の <source> のアドレスも "lshw -c network -businfo" に従って設定されます。 ▷ 方法3(ネットプール) 各 PF ネットワーク カードのネット プールを定義します。つまり、それぞれ xml ファイルを編集します。ここではPFが1つだけ表示されています。sriov-int.xmlを編集してください。 <ネットワーク> <name>sriov-int</name> <転送モード='hostdev' 管理対象='はい'> <pf dev='p1p1'/> </進む> </ネットワーク> libvirt ネットプールに追加し、有効化して起動時に開始するように設定する virsh ネット定義 sriov-int.xml virsh ネットスタート sriov-int virsh ネット自動起動 sriov-int net-autostart が設定されていますが、物理マシンの起動時に libvirt が vf の生成前に起動されることが多く (vf が rc.local に生成されると仮定)、net-pool (sriov-int) は vf の生成後に起動する必要があるため、動作しません。そのため、起動を確実にするために rc.local に次の内容を追加することを推奨します。 IPリンク設定P1P2アップ エコー 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs virsh ネットスタート sriov-int 次に、vmのxmlに追加します <インターフェースタイプ='ネットワーク'> <mac アドレス = '52:54:00:ad:ef:8d' /> <ソースネットワーク='sriov-int'/> <VLAN> <タグid='4010'/> </VLAN> </インターフェース> 3つの方法から選ぶ方法 ▷ 方法1: 複数の機能、MACとVLANを構成できます バグがあります。このホスト上のすべての VM が使用する VF の合計数が VF 上限を超えた場合、エラーは報告されず、VM は起動できますが、例外が発生する可能性があります。VM が destroy によってシャットダウンされると、対応する VF に問題が発生します。たとえば、ip link set p1p1 vf 0 mac 00:00:00:00:00:00 を使用してリセットすると、「RTNETLINK 回答: メモリを割り当てられません」というメッセージが表示されます。修復は困難であり、修復されたとしても、目に見えない例外があるかどうかはわかりません。 特定の VM がどの vf を使用しているかを知る方法はありません。したがって、vf の速度制限を設定したり、spoofchk をオンまたはオフにしたりする場合は、速度制限やその他の操作を設定する前に、「ip link show dev p1p1 | grep MAC address」でホスト上の vf 番号を取得することしかできません。 まとめると、方法 3 は最も便利ですが、バグがあるため、VM が使用する vfs の合計数が上限を超えないようにするための適切なロジックが必要です。 6. irqbalanceを有効にする x520 には 2 つのキューがあり、x710 には 4 つのキューがあり、割り込み分散サービス (irqbalance) を VM で起動する必要があります。そうしないと、1 つの CPU のみがデータ パケットを処理します。 また、これはホスト上の vf の query_rss とは関係ありません。 7. VMの移行 パススルー ネットワーク カードは PCI デバイスですが、libvirt と qemu は、コールド移行やホット移行など、USB 以外の PCI デバイスを搭載した VM の移行をサポートしていません。したがって、ホットマイグレーションは実現できません。 コールド移行には 2 つのソリューションがあります。 ▷ vf ネットワーク カードを取り外し、libvirt を使用して移行し、移行後に新しいホストに vf ネットワーク カードを接続します。 注意: VM がシャットダウンされているときは libvirt の移行機能を使用できないため、元のホストと新しいホストを含む仮想マシンが消えてしまう可能性があります。 8. 帯域幅の制限 制限できるのは送信帯域幅のみで、受信帯域幅は制限できない IPリンクセットp1p1vf0max_tx_rate100 送信帯域幅が 100 Mbps に制限されていることを示します。これはネットワーク カードによって異なります。 ▷ x520 ネットワーク カードの最小速度制限は 11Mbps、最大速度制限は 10000Mbps です。0 に設定すると速度制限なしになります。 11 未満または 10000 を超える場合は、エラーが報告されます。 注: vm をシャットダウンしても、vf の帯域幅制限はリセットされません。 9. セキュリティ ソース MAC フィルタリングとネットワーク カード MAC 改ざん防止のみがサポートされており、その他のセキュリティ保護はサポートされていません (ARP スプーフィング防止は実現できません) ソースMACフィルタリング ip リンク セット p1p1 vf 0 spoofchk オン VM から送信されたパケットの送信元 MAC が指定された MAC でない場合、データ パケットは通過できないことを示します。注意: vm がシャットダウンされた後、vf の spoofchk はリセットされません。 ネットワークカード Mac 改ざん防止 ▷ ホスト上のMacを変更しても、VM内のMacは変更されません。VM内のMacを変更すると、その変更はホスト上で確認できます。 ホスト上の mac メソッドを手動で変更します (VM がオフまたはオンのときに変更できます)。 IPリンクセットp1p1vf0macaa:bb:cc:dd:ee:ff 提案: ▷ vm を起動する前に vf をリセットする 10. その他の利用制限 ▷ VMのvfネットワークカードはVMのLinuxブリッジにブリッジできないため、ebtablesも使用できませんが、iptablesは使用できます。 11. パフォーマンステスト 試験方法: ▷ 複数の VM が同時にパケットを送信し、1 つの VM がパケットを受信します。パケットの送信と受信のパフォーマンスをそれぞれ観察します。 構成: ▷ VM構成は4コア8G テスト結果: テストの結論: SR-IOV+VF パススルーを使用すると、パケット転送速度が大幅に向上します。1:1 テストの結果では、カーネル状態パケットの送信速度が 3.5Mpps に達し、パケットの受信速度が 1.9Mpps に達することが示されています。 ▷ パケット送信速度は、vxlan よりも 1196% 高く、vlan よりも 677% 高くなります。この結果は 1 対 1 (送信 VM 1 台、受信 VM 1 台) を指します。 例: ▷ カーネル状態のシングルコアデータパケット(64B)処理能力は2Mpps その他のテスト結果: 次のテストで使用されるパケットサイズは64Bです ▷ カーネル状態、レイヤー3転送パフォーマンス:パケット送信者は異なる送信元IPを使用する ▪ BCM57800: 2Mpps ▷ カーネル状態、レイヤー2転送パフォーマンス:パケット送信者は異なる送信元MACアドレスを使用する ▪ BCM57800: 2Mpps ▷ カーネル状態でのVXLANカプセル化機能 ▪ vxlanの内部レイヤーは、異なる送信元IPを使用してパケットを送信します ▷ DPDKユーザーモード、レイヤー2転送パフォーマンス:パケット送信者は異なる送信元IPを使用する ▪ BCM57800: サポートされていません SR-IOV モード ▪ X520 合計 11.2Mpps、各 VM は 11.2Mpps/合計 VM (つまり VF 数) 要約: ▷ カーネル状態における割り込みバランシングは、以下の要素に基づいています。レイヤー2は送信元MACアドレスに基づき、レイヤー3は送信元IPアドレスに基づきます。 知らせ: ▷ カーネル状態では、スループットを向上させるためにマルチキューRSS割り込みバランシングを使用すると、CPU使用率が非常に高くなります。 12. Windows仮想マシンでのVFの使用 ネットワーク カードの公式サイトにアクセスし、対応するドライバーをダウンロードしてインストールします。テストの結果、win2012 にはデフォルトで 82599 (x520) ドライバーが搭載されていますが、バージョンが古いです。 13. 操作および保守コマンド # ネットワークカードでサポートされている vfs の数を表示します cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs # ホストが VF ドライバーをブロックした後、vf と pf の対応を確認します https://github.com/intel/SDN-NFV-Hands-on-Samples/blob/master/SR-IOV_Network_Virtual_Functions_in_KVM/listvfs_by_pf.sh ダウンロード後、./listvfs_by_pf.sh# を実行します。ホストが VF をブロックしたら、使用されている VF を確認します。yum install dpdk-tools dpdk-devbind --ステータス # ネットワークカードがどのソケットに対応しているか確認する lstopo-no-graphics # lspci でネットワークカード情報を表示 lspci -Dvmm|grep -B 1 -A 4 Ethernet # ホスト上の特定の VF トラフィックを表示します (x520 のみサポート、x710 は見つかりません) ethtool -S p1p1 | grep VF 14. ホストがVFドライバをブロックする echo "ブラックリスト ixgbevf" >> /etc/modprobe.d/blacklist.conf つまり、物理マシンを起動すると、デフォルトでは ixgbevf ドライバーはロードされませんが、手動で modprobe ixgbevf を実行すると、ドライバーがロードされます。 ixgbevf が現在ロードされていて、それをアンインストールする場合は、次の手順を実行する必要があります。 エコー 0 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs rmmod ixgbevf エコー 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs 付録 パケット転送速度のテスト方法 modprobe pktgen: パケットは pktgen を介して送信され、受信パケットは sar -n DEV を介してチェックされます。送信されるパケットは udp パケットです。 #!/bin/bash NIC = "eth1" DST_IP="192.168.1.2" DST_MAC = "52:54:00:43:99:65" modprobe パッケージ pg() { エコー注入 > $PGDEV 猫 $PGDEV } pgset() { ローカル結果 エコー $1 > $PGDEV 結果 = `cat $PGDEV | fgrep "結果: OK:"` [ "$result" = "" ]の場合; cat $PGDEV | fgrep 結果: フィ } # ここから設定開始 --------------------------------------------------------- # スレッド設定 # 各 CPU には独自のスレッドがあります。2 つの CPU がテストされます。それぞれ ens7、eth2 を追加します。 PGDEV = /proc/net/pktgen/kpktgend_0 echo "すべてのデバイスを削除しています" pgset "rem_device_all" echo "${NIC} を追加しています" pgset "add_device ${NIC}" # デバイス設定 # 遅延 0 は最大速度を意味します。 CLONE_SKB="clone_skb 1000000" # NICは4バイトのCRCを追加します PKT_SIZE="pkt_size 64" # COUNT 0は永遠を意味します COUNT="カウント 0" DELAY="遅延 0" PGDEV=/proc/net/pktgen/${NIC} echo "$PGDEV を設定しています" pgset "$COUNT" pgset "$CLONE_SKB" pgset "$PKT_SIZE" pgset "$DELAY" pgset "dst ${DST_IP}" pgset "dst_mac ${DST_MAC}" # 走る時間だ PGDEV = /proc/net/pktgen/pgctrl echo "実行中... 停止するには ctrl^C" pgset "開始" 「完了」をエコーします # 結果は/proc/net/pktgen/eth[3,4]で確認できます ▷ スクリプトの先頭のeth1をパケットに対応するネットワークカードに変更します pktgen-dpdk # 固定IP 固定MAC 0 dst ip 192.168.10.240 を設定します 0 送信元 IP 192.168.10.245/24 を設定 0 dst mac c8:1f:66:d7:58:ba を設定 0 src mac a0:36:9f:ec:4a:28 を設定 # 可変ソース IP、可変ソース MAC ストップ0 範囲 0 送信元 IP 192.168.0.1 192.168.0.1 192.168.200.200 0.0.0.1 範囲 0 宛先 IP 10.1.1.241 10.1.1.241 10.1.1.241 0.0.0.0 範囲 0 送信先 MAC c8:1f:66:d7:58:ba c8:1f:66:d7:58:ba c8:1f:66:d7:58:ba 00:00:00:00:00:00 範囲 0 送信元 MAC a0:36:9f:ec:4a:28 a0:36:9f:ec:4a:28 a0:36:9f:ec:ff:ff 00:00:00:00:01:01 範囲 0 送信元ポート 100 100 65530 1 範囲 0 送信ポート 100 100 65530 1 範囲 0 サイズ 64 64 64 0 0範囲を有効にする 0レイテンシを有効にする 開始 0 # 50% のレートでパケットを送信します。set 0 rate 50 付録 参考資料 OpenStack の sriov に対する制限 移住する sriov 構成 回線速度 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 |
<<: MySql のクラッシュとサービスの起動失敗の解決策
>>: MySQL 5.6 ルートパスワード変更チュートリアル
この記事では、参考までにタイマーを実装するためのVueの具体的なコードを紹介します。具体的な内容は次...
この記事では、参考までにMySQL 8.0.17のインストールグラフィックチュートリアルを紹介します...
年末なので仕事も少なくなっています。私が何もせずにいるのを見ると、上司はきっと不快に思うでしょう。そ...
目次DockerにRedisをインストールする1. Redisイメージを見つける2. Redisイメ...
ソースコード(一部のクラスは削除されています):コードをコピーコードは次のとおりです。 <テー...
方法 1: 設定ファイルを変更する (docker サービスを停止する必要があります) 1. doc...
IPSec の概要IPSec (インターネット プロトコル セキュリティ): ネットワーク層と適用さ...
要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...
この記事の例では、スライディングブロック効果を実現するための小さなプログラムの具体的なコードを参考ま...
ほとんどの人は、サーバーサイド レンダリング (SSR と呼んでいます) の概念について聞いたことが...
さまざまな理由で、誰もが MySQL を再インストールする必要があると思います。 MySQL と Q...
準備のメリットPrepare SQL が生成される理由。まず、MySQL サーバー上で SQL を実...
目次Node.js の公式紹介Node.jsのコア開発言語ウェブ上の JavaScript と No...
目次1. 応答原理の基盤2. コアオブジェクト: Dep と Watcher 3. 依存関係を収集し...
前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...