KVM ベースの SRIOV パススルー構成とパフォーマンス テストの詳細な説明

KVM ベースの SRIOV パススルー構成とパフォーマンス テストの詳細な説明

SRIOVの導入、VFパススルー構成、パケット転送速度性能テスト

目次

  • 1. SRIOVの紹介
  • 2. 環境の説明
  • 3. SRIOVを有効にする
  • 4. VFを生成する
  • 5. VFパススルー
  • 6. irqbalanceを有効にする
  • 7. VMの移行
  • 8. 帯域幅の制限
  • 9. セキュリティ
  • 10. その他の利用制限
  • 11. パフォーマンステスト
  • 12. Windows仮想マシンでのVFの使用
  • 13. 操作および保守コマンド
  • 14. ホストがVFドライバをブロックする
  • 付録 パケット転送速度のテスト方法
  • 付録 参考資料

1. SRIOVの紹介

▷ 従来の方法のボトルネック: Qemu のネットワーク カードの従来の方法は、タップ ネットワーク カードを使用してホストのブリッジにブリッジすることですが、パフォーマンスが非常に低く、特にパケット転送速度が非常に低いため、高いパフォーマンス要件を持つシナリオを満たすことが困難です。パフォーマンスが低下する主な理由は、パスが長すぎて、通過するカーネルデバイスが多すぎることです。根本的な理由は、Linux/Unix カーネル自体が高性能向けに設計されていないことです。Linux/Unix は、転送プレーンよりも制御プレーンに適しています。
▷ 解決策: 中間パスを減らします。最も簡単で効果的な方法はカーネルをバイパスすることです。 SRIOV の役割は、ホストカーネルをバイパスすることです。
▷ PF と VF: 各物理ネットワーク カード (p1p1 など) は PF です。SRIOV を有効にすると、各 PF は固定数の VF を生成できます。各 VF は、ホスト上のネットワーク カードとして直接使用することも、仮想マシン内のネットワーク カードとして QEMU 仮想マシンに直接接続して、ホスト カーネルをバイパスすることもできます。

まず、パフォーマンス テストの結論を示します。従来のタップ + ブリッジ ソリューションと比較して、SRIOV VF パススルーのパフォーマンスが向上しました。

▷ パケット転送率の向上: 677%
▷ パケット転送率の向上: 171%

2. 環境の説明

モデル: Dell PowerEdge R620
ネットワークカード: Intel X520 (82599ES)
ホストOS: CentOS 7
VMOS: CentOS 7

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を構成できます
▷ 方法2: ホストでipコマンドを入力してmacとvlanを設定する必要があります
▷ 方法3: 問題点は2つある

バグがあります。このホスト上のすべての 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 を未定義にし、新しいホストで VM を再レンダリングして定義する

注意: VM がシャットダウンされているときは libvirt の移行機能を使用できないため、元のホストと新しいホストを含​​む仮想マシンが消えてしまう可能性があります。

8. 帯域幅の制限

制限できるのは送信帯域幅のみで、受信帯域幅は制限できない

IPリンクセットp1p1vf0max_tx_rate100

送信帯域幅が 100 Mbps に制限されていることを示します。これはネットワーク カードによって異なります。

▷ x520 ネットワーク カードの最小速度制限は 11Mbps、最大速度制限は 10000Mbps です。0 に設定すると速度制限なしになります。 11 未満または 10000 を超える場合は、エラーが報告されます。
▷ x710 ネットワーク カードの最小速度制限は 50Mbps、最大速度制限は 10000Mbps です。0 に設定すると速度制限なしになります。 50 未満の場合は自動的に 50 に設定されます。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を変更すると、その変更はホスト上で確認できます。
▷ VM のシャットダウン時に MAC アドレスが変更された場合、VM の電源投入時に VM の MAC アドレスに変更されます。VM を再度シャットダウンすると、元の MAC アドレスに戻ります。
▷ vf の spoofchk がオフであっても、ホスト上で確認されている現在の vf の MAC がすべて 0 の場合にのみ、VM で MAC アドレスを変更できます。しかし、例外があります。上記の方法2を使用してxmlを構成すると、ホスト上で表示されるvfのmacは0ではありませんが、vmで変更できます。
▷ ホストにMacをセットアップすると、仮想マシン内のMacは改ざんできなくなります
▪ XMLを構成する方法1(インターフェース)は、VMが起動すると、ホスト上のMacの設定が自動的に行われるため、改ざん防止機能が直接実装されると考えられます。
▪ XMLを構成する方法2(hostdev)では、改ざん防止を実現するためにホスト上でMACアドレスを手動で再度設定する必要があります。

ホスト上の mac メソッドを手動で変更します (VM がオフまたはオンのときに変更できます)。

IPリンクセットp1p1vf0macaa:bb:cc:dd:ee:ff

提案:

▷ vm を起動する前に vf をリセットする
▷ vm undefine 後に vf をリセットする

10. その他の利用制限

▷ VMのvfネットワークカードはVMのLinuxブリッジにブリッジできないため、ebtablesも使用できませんが、iptablesは使用できます。
▷ VMに直接接続されたVFネットワークカードをOVSブリッジに追加できます
▷ VM は最大 32 個の VF のみをサポートできます。数が制限を超えると、エラーが報告されます。

11. パフォーマンステスト

試験方法:

▷ 複数の VM が同時にパケットを送信し、1 つの VM がパケットを受信します。パケットの送信と受信のパフォーマンスをそれぞれ観察します。
▷ 送信VMは同じホスト上にあり、受信VMは別のホスト上にある
▷ テストツール: modprobe pktgen
▷ テストパケットサイズ: UDPパケット、サイズは64バイト

構成:

▷ VM構成は4コア8G
▷ すべての物理ネットワーク カードは x520 です (vf キューのデフォルトは 2)
▷ ホストとVMの両方でirqbalanceがオンになっており、numadがオフになっている
▷ CPUバインディングまたはNUMAバインディングを設定しないでください
▷ 大きなページを開く

テスト結果:

テストの結論:

SR-IOV+VF パススルーを使用すると、パケット転送速度が大幅に向上します。1:1 テストの結果では、カーネル状態パケットの送信速度が 3.5Mpps に達し、パケットの受信速度が 1.9Mpps に達することが示されています。

▷ パケット送信速度は、vxlan よりも 1196% 高く、vlan よりも 677% 高くなります。この結果は 1 対 1 (送信 VM 1 台、受信 VM 1 台) を指します。
▷ パケット受信率はvxlanより363%高く、vlanより171%高くなります。この結果は 3 対 1 (送信 VM 3 台、受信 VM 1 台) を指します。

例:

▷ カーネル状態のシングルコアデータパケット(64B)処理能力は2Mpps
▷ 2Mpps なのは、カーネルのボトルネックが 2Mpps だからです。dpdk をユーザーモードで使用すると、2M を超えることがあります。その理由は、パケット受信側でパケット割り込みを異なる CPU に分散する必要があるためです。方法は、複数のキューを使用して、各キューを別の CPU に割り当てます (irqbalance が自動的に分散します)。すると、異なるソース IP が異なるキュー、つまり異なる割り込みに対応するようになります。つまり、1 つの VF、2 つのキュー、および VM に少なくとも 2 つのコアがあるということです。負荷分散条件が満たされている場合 (MAC と IP が異なる場合)、理論上可能な最大速度は 4Mpps です。

その他のテスト結果:

次のテストで使用されるパケットサイズは64Bです

▷ カーネル状態、レイヤー3転送パフォーマンス:パケット送信者は異なる送信元IPを使用する

▪ BCM57800: 2Mpps
▪ インテル X520: 10Mpps
▪ インテル X710: 12Mpps

▷ カーネル状態、レイヤー2転送パフォーマンス:パケット送信者は異なる送信元MACアドレスを使用する

▪ BCM57800: 2Mpps
▪ インテル X520: 7.3Mpps
▪ インテル X710: 7.8Mpps

▷ カーネル状態でのVXLANカプセル化機能

▪ vxlanの内部レイヤーは、異なる送信元IPを使用してパケットを送信します
▪ パケット受信速度: 1.1-1.2Mpps

▷ DPDKユーザーモード、レイヤー2転送パフォーマンス:パケット送信者は異なる送信元IPを使用する

▪ BCM57800: サポートされていません
▪ インテル X520: 14.8Mpps
▪ インテル X710: 14.8Mpps

SR-IOV モード

▪ X520 合計 11.2Mpps、各 VM は 11.2Mpps/合計 VM (つまり VF 数)

要約:

▷ カーネル状態における割り込みバランシングは、以下の要素に基づいています。レイヤー2は送信元MACアドレスに基づき、レイヤー3は送信元IPアドレスに基づきます。
▷ カーネル状態で従来の割り込みモードを使用する場合の単一コア転送容量の制限は2Mppsです。

知らせ:

▷ カーネル状態では、スループットを向上させるためにマルチキューRSS割り込みバランシングを使用すると、CPU使用率が非常に高くなります。
▷ ユーザーモードでは、送信元MACまたは送信元IPが固定されていても、スループットは基本的に14.8Mppsの速度制限に近くなります。
▷ VXLANは、主に外部ソースIPが不足しているため、複数のコアを使用してスループットを向上させることができません。

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 を追加します。

PGD​​EV = /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"

PGD​​EV=/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}"

# 走る時間だ
PGD​​EV = /proc/net/pktgen/pgctrl

echo "実行中... 停止するには ctrl^C"
pgset "開始"
「完了」をエコーし​​ます

# 結果は/proc/net/pktgen/eth[3,4]で確認できます

▷ スクリプトの先頭のeth1をパケットに対応するネットワークカードに変更します
▷ スクリプトの先頭の192.168.1.2をターゲットIPに変更します
▷ スクリプトの先頭の52:54:00:43:99:65をターゲットのMacに変更します

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 に対する制限
詳細は、こちらを参照してください。

移住する
https://wenku.baidu.com/view/d949db67998fcc22bcd10dfd.html
https://www.chenyudong.com/archives/live-migrate-with-pci-pass-through-fail-with-libvirt-and-qemu.html

sriov 構成
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/仮想化ホスト構成とゲストインストールガイド/sect-仮想化ホスト構成とゲストインストールガイド-sr_iov-how_sr_iov_libvirt_works

回線速度
http://netoptimizer.blogspot.tw/2014/05/the-calculations-10gbits-wirespeed.html

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  MySql のクラッシュとサービスの起動失敗の解決策

>>:  MySQL 5.6 ルートパスワード変更チュートリアル

推薦する

Vue で親コンポーネントから子コンポーネントにデータを渡すいくつかの方法

最近、Vue のソースコードを勉強していて、Vue で親コンポーネントと子コンポーネント間でデータを...

Mysql接続数の設定と取得方法

接続数を取得する --- 最大接続数を取得します。SHOW VARIABLES LIKE '...

MySQLリモート接続失敗の解決策

以前、MySQLがローカルでは接続できるのにリモートでは接続できないという問題に遭遇したことがありま...

MySQL の一般的な SQL ステートメントの概要

1. mysqlエクスポートファイル: SELECT `pe2e_user_to_company`....

VueはAmapを使用して都市の位置特定を実現

この記事では、Amapを使用して都市の位置特定を実現するVueの具体的なコードを参考までに共有します...

mysql5.7でbinlogを使用してデータを復元する方法

ステップ1: MySQLでbinlogが有効になっていることを確認する '%log_bin%...

CSS3 のカラー値 RGBA とグラデーションカラーの使用方法の紹介

CSS3以前は、グラデーション画像は背景画像としてのみ使用できました。 CSS3 のグラデーション構...

よく使われるCSSスタイル(レイアウト)の詳しい説明

新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...

H5 WeChatパブリックアカウント認証を実装するための簡単な手順

序文昨日、h5 WeChat認証の実装が必要なプロジェクトがありました。したがって、この機能を完了す...

docker --privileged=true パラメータの役割についての簡単な説明

バージョン 0.6 あたりで、Docker に privileged が導入されました。このパラメー...

JavaScriptは行削除機能を備えたテーブルを動的に生成します

この記事の例では、テーブルを動的に生成したり行を削除したりするためのJavaScriptの具体的なコ...

echartsマップカルーセルハイライトを解決するための記事

目次序文やることリストやるだけ地図を準備するインスタンスをバックアップ用に保存するタイマーカルーセル...

Vueカスタムディレクティブを使用してドラッグアンドドロッププラグインを構築する方法

HTML5 のドラッグ アンド ドロップ機能は誰もが知っていますが、これを使用するとドラッグ アンド...

WebページでjQueryを参照する方法

CDN(コンテンツ配信ネットワーク)を通じて参照できます。 jQuery は Google と Mi...

Reactの仮想DOMとdiffアルゴリズムの詳細な説明

仮想DOMの役割まず、仮想 DOM の出現によってどのような問題が解決されるのかを知る必要があります...