ProxmoxでIntel NICをSR-IOV
はじめに
前の記事の続きです。
前回はProxmoxでNICをPCIパススルーしましたが、今回はSR-IOVをしてみました。
前の記事
NICにおけるSR-IOVとは
前の記事で実施したPCIパススルーは、物理NICにVMの仮想NICを直接アタッチさせることで、トラフィック負荷発生時にVMのCPU使用率を下げるものでした。ただ、PCIパススルーでは物理NICと仮想NICが1対1になってしまいます。
そこで、1つの物理NICに対して複数の仮想NICを割り当てられるようにする機能がSR-IOVです。具体的には、物理NIC内に1つのPF(Physical Function)と複数のVF(Virtual Function)を作成します。VFに仮想NICをアタッチさせつつ、PF経由でLANケーブル越しで外と通信します。
【以下余談】
PFやVFがイメージしにくい方は、物理NICがL2SWのようになり、外に出ていく通信を通す仮想NICがPF、VMへ通信する仮想NICがVFと考えればイメージがつかみやすいです。
もう少し書くと、物理NIC内にあるVEB (Virtual Ethernet Bridge)という機能を基に、宛先MACアドレスやVLANタグなどを見てフレームを振り分けるようです。VEBはハードウェア処理されるため、遅延やCPU負荷を軽減できるようです。
また、VEBモードの他、VEPA(Virtual Ethernet Port Aggregator)モードというものもあり、物理スイッチ側でポリシー制御や監視を一元管理したい場合などに、SR-IOVを有効にした物理NICが受信したトラフィックをいったん外部の物理スイッチに送ってから再度戻す仕組みもあるようです。
※x710のデータシート参照
https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/xl710-10-40-controller-datasheet.pdf
SR-IOVを使うために必要なこと
SR-IOVを動かすためにはCPU、NIC等の対応が必要です。昔調べたものは下記です。
ProxmoxでSR-IOVを有効化
※Proxmox上のVMではなく、pve上で操作をします。
インターフェース名を確認
ip aで確認すると今回の対象は「enp2s0f0np0」と「enp2s0f1np1」となることが分かります。
※物理PCにNICが複数ある場合、どの物理ポートがどのインターフェース名か分かりにくいです。そういった場合は、LANケーブルを1本だけさしてリンク状態がUPになったものを見ていくことで、物理ポートとインターフェース名の紐づけを追えます。
# ip a
(略)
4: enp2s0f0np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr2 state UP group default qlen 1000
link/ether 58:47:ca:79:67:68 brd ff:ff:ff:ff:ff:ff
5: enp2s0f1np1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr3 state UP group default qlen 1000
link/ether 58:47:ca:79:67:69 brd ff:ff:ff:ff:ff:ff
(略)
PCIの状態(設定変更前)を確認
lspciを実施するとX710が2個あることが分かります。
今回は物理ポートも2つあるPCのため想定通りです。
# lspci | grep Ethernet
02:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
02:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
57:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-V (rev 04)
5a:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-LM (rev 04)
設定変更
NWインターフェースの設定等が格納されたディレクトリのファイルを修正します。catで現在の設定を確認しつつ、echoで変更します。
下記のプロンプトでは0から2に変更しています。
# cat /sys/class/net/enp2s0f0np0/device/sriov_numvfs
0
# echo 2 > /sys/class/net/enp2s0f0np0/device/sriov_numvfs
# cat /sys/class/net/enp2s0f0np0/device/sriov_numvfs
2
PCIの状態(設定変更後)を確認
上記実施後、VF(Virtual Function)が増えている
# lspci | grep Ethernet
02:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
02:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
02:02.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:02.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
57:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-V (rev 04)
5a:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-LM (rev 04)
VMへVFの紐づけ
ここまで行けばPCIパススルーと同じ設定方法でVMの仮想NICにPFを割り当てることができる。(全機能にチェックは無し)
※全機能にチェックを入れた場合、指定したVFが属する物理NICが持つ、すべてのVFがVMから認識されます。下記の例だとVFを8こ作ったのですが、全機能にチェックを入れたらVMは8個のインターフェースを認識していました。
【余談】VFの最大数確認
128個まで増やそうとしたらダメでした。
# echo 128 > /sys/class/net/enp2s0f1np1/device/sriov_numvfs
-bash: echo: write error: Numerical result out of range
64が最大の模様。
# echo 65 > /sys/class/net/enp2s0f1np1/device/sriov_numvfs
-bash: echo: write error: Numerical result out of range
# echo 64 > /sys/class/net/enp2s0f1np1/device/sriov_numvfs
#
64個でlspciをした結果が下記。
# lspci | grep Ethernet
02:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
02:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
02:02.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:02.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0a.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0b.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0c.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0d.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0e.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:0f.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:10.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.3 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.4 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.5 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.6 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
02:11.7 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)
57:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-V (rev 04)
5a:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-LM (rev 04)
0に戻したら元に戻ります。
# echo 0 > /sys/class/net/enp2s0f0np0/device/sriov_numvfs
# echo 0 > /sys/class/net/enp2s0f1np1/device/sriov_numvfs
# lspci | grep Ethernet
02:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
02:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
57:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-V (rev 04)
5a:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-LM (rev 04)