本ブログでは、NICの調達方法やovs-dpdk以外の設定方法、課題となっている事などを記載していきます。
トピックが多岐に渡るため、順不同に読んで頂いて構いません。
前回記事からの続編となります。*1
以下は関連記事の一覧となります。
2.NICの調達方法
Linux KernelでvDPAに対応したドライバは3つあります。
linux/drivers/vdpa at master · torvalds/linux · GitHub
各ドライバに対応したNICは以下の通りです。
ifcvf | Intel製 SmartNIC N3000シリーズ, N5000シリーズ | 高額($4k)で、かつ個人購入は困難 |
mlx5 | Mellanox製 ConnectX-6 Dx, BlueField SmartNIC | ConnectX-6 Dxの場合、高額($1.2k)だが個人購入は可能 |
vdpa_sim | vdpaデバイスシミュレータですが、CentOS8.3標準Kernelに入っています。modinfo vdpa_sim コマンドで確認できます。 | シミュレータのため外部NWと通信できない。 |
このため、ConnectX-6 Dxの購入が現実的だと思います。
また、ConnectX-6 Dxの場合、正式サポートしている型番が以下のサイトに掲載されています。
5. MLX5 vDPA driver — Data Plane Development Kit 21.05.0 documentation
Mellanox® ConnectX®-6 200G MCX654106A-HCAT (2x200G) Mellanox® ConnectX®-6 Dx EN 25G MCX621102AN-ADAT (2x25G) Mellanox® ConnectX®-6 Dx EN 100G MCX623106AN-CDAT (2x100G) Mellanox® ConnectX®-6 Dx EN 200G MCX623105AN-VDAT (1x200G) Mellanox® BlueField SmartNIC 25G MBF1M332A-ASCAT (2x25G)
上記のうち、"MCX623106AN-CDAT"は、以下のサイトで購入可能です。*2
NVIDIA MCX623106AN-CDAT ConnectX-6 Dx 100GbE QSFP56 ネットワークアダプター, SmartNIC - FS 日本
なお、私がNICを調達したとき、上記のサイトではまだ取り扱っていなかったため、ebayを探していたところ、たまたまHPEブランドの"MCX623106AS-CDAT"が$650くらいで購入できました。*3
3.Linux Bridgeにおける設定方法
本編の記事では、ovs-dpdkを使用しましたが、それには以下3つの理由があります。
- ovs-dpdkの場合、bsf番号を含めた形でrepresentorを明示的に指定する必要があります。これにより、どことどこが接続されているのかを理解できると考えたため、ovs-dpdkを使用しました。
- ovs-dpdk, ovs, Linux Bridgeの3つを比較した場合、ovs-dpdkは最も手間の掛かる複雑な設定が要求されます。一方でovs-dpdkの設定が理解できれば、他のケースは容易に理解することができると考えたためです。
- 今後、仮想マシンでTRexを動作させた負荷試験を検討しており、ovs-dpdk, ovs, Linux Bridgeそれぞれの環境で負荷試験を実施したいと考えていたからです。
<補足>
例えば、vhost_vdpaの場合、以下の赤文字を辿ると、PF, VF, VF repの関連性が理解できると思います。
ovs-vsctl add-port br30-ovs ens2f0_0 -- set Interface ens2f0_0 type=dpdk options:dpdk-devargs=0000:07:00.0,representor=[0] [root@c83g155 ~]# lshw -businfo -c network Bus info Device Class Description ======================================================== pci@0000:07:00.0 ens2f0 network MT2892 Family [ConnectX-6 Dx] pci@0000:07:00.1 ens2f1 network MT2892 Family [ConnectX-6 Dx] pci@0000:07:00.2 ens2f0v0 network ConnectX Family mlx5Gen Virtual Function pci@0000:07:01.2 ens2f1v0 network ConnectX Family mlx5Gen Virtual Function pci@0000:07:00.0 ens2f0_0 network Ethernet interface pci@0000:07:00.1 ens2f1_0 network Ethernet interface [root@c83g155 ~]# ls -Fal /sys/bus/vdpa/drivers/vhost_vdpa total 0 drwxr-xr-x 2 root root 0 Apr 8 00:06 ./ drwxr-xr-x 3 root root 0 Apr 7 23:49 ../ --w------- 1 root root 4096 Apr 8 00:07 bind lrwxrwxrwx 1 root root 0 Apr 8 00:07 module -> ../../../../module/vhost_vdpa/ --w------- 1 root root 4096 Apr 8 00:06 uevent --w------- 1 root root 4096 Apr 8 00:07 unbind lrwxrwxrwx 1 root root 0 Apr 8 00:07 vdpa0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:07:00.2/vdpa0/ lrwxrwxrwx 1 root root 0 Apr 8 00:07 vdpa1 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:07:01.2/vdpa1/ qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -m 8G \ -hda /var/lib/libvirt/images/c77g1532.qcow2 \ -netdev type=vhost-vdpa,vhostdev=/dev/vhost-vdpa-0,id=vhost-vdpa0 \ -device virtio-net-pci,netdev=vhost-vdpa0,page-per-vq=on,iommu_platform=on,disable-legacy=on \ -nographic \ 2>&1 | tee vm153.log
前置きが長くなりましたが、上記を踏まえて、Linux Bridgeにおける設定方法を記載します。
事前に本編の"6.SR-IOV switchdev modeへ変更"を実施しておいてください。
3-1.Linux Bridgeの作成
nmcli connection add type bridge autoconnect yes con-name br30ens2f0 ifname br30ens2f0 nmcli connection modify br30ens2f0 bridge.stp no nmcli connection modify br30ens2f0 ipv4.method disabled ipv6.method ignore nmcli connection up br30ens2f0 nmcli connection add type bridge-slave ifname ens2f0 master br30ens2f0 nmcli connection add type bridge-slave ifname ens2f0_0 master br30ens2f0 nmcli connection add type bridge autoconnect yes con-name br31ens2f1 ifname br31ens2f1 nmcli connection modify br31ens2f1 bridge.stp no nmcli connection modify br31ens2f1 ipv4.method disabled ipv6.method ignore nmcli connection up br31ens2f1 nmcli connection add type bridge-slave ifname ens2f1 master br31ens2f1 nmcli connection add type bridge-slave ifname ens2f1_0 master br31ens2f1
3-2.Linux Bridgeの確認
nmcli con show [root@c83g155 ~]# nmcli con show NAME UUID TYPE DEVICE System eno1 c68c8589-0538-477f-8921-d1da3a50a7c1 ethernet eno1 br11eno2 15c513f2-8180-44e7-b5a5-af8a61574118 bridge br11eno2 br30ens2f0 c3d898f3-c3c4-4f84-ae94-4c0d663bd02c bridge br30ens2f0 br31ens2f1 0704f4ff-d502-4541-b2a9-b6bc7291ae47 bridge br31ens2f1 virbr0 28699aa1-57bf-4686-86f4-7625a2311628 bridge virbr0 bridge-slave-eno2 4e9db04a-0e3a-4099-8726-0c3fc5b09d78 ethernet eno2 bridge-slave-ens2f0 d612bf46-c387-4883-aef1-b37b5d29aca2 ethernet ens2f0 bridge-slave-ens2f0_0 173c7792-6df9-41af-b6ab-9a4f66567d95 ethernet ens2f0_0 bridge-slave-ens2f1 2a90162e-585a-4c5e-ac52-73ca935c80d0 ethernet ens2f1 bridge-slave-ens2f1_0 327e0276-f90c-4dd2-89fd-2aeeabd6c69f ethernet ens2f1_0 eno3 8bcc3718-cdd2-40f9-a484-d25ccc5b9a11 ethernet -- eno4 3e0a2034-acbb-49c6-a63f-6438213c51c3 ethernet -- ens1f0 fd0d2166-840e-4e1a-bfbd-55c0df2ad791 ethernet -- ens1f1 f9c8d336-f15b-4b8b-91c9-14d5094d7fd7 ethernet --
3-3.vhost_vdpaモジュールの有効化 : vhost_vdpaの場合
virtio_vdpaモジュールが有効化されている場合、rmmod virtio_vdpaコマンドで無効化してください。
rmmod virtio_vdpa modprobe vhost_vdpa
3-4.仮想マシンの起動 : vhost_vdpaの場合
c77g153 (8) qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -m 8G \ -hda /var/lib/libvirt/images/c77g1532.qcow2 \ -netdev type=vhost-vdpa,vhostdev=/dev/vhost-vdpa-0,id=vhost-vdpa0 \ -device virtio-net-pci,netdev=vhost-vdpa0,page-per-vq=on,iommu_platform=on,disable-legacy=on \ -nographic \ 2>&1 | tee vm153.log c77g159 (9) qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -m 8G \ -hda /var/lib/libvirt/images/c77g1592.qcow2 \ -netdev type=vhost-vdpa,vhostdev=/dev/vhost-vdpa-1,id=vhost-vdpa1 \ -device virtio-net-pci,netdev=vhost-vdpa1,page-per-vq=on,iommu_platform=on,disable-legacy=on \ -nographic \ 2>&1 | tee vm159.log
3-5.virtio_vdpaモジュールの有効化 : virtio_vdpaの場合
vhost_vdpaモジュールが有効化されている場合、rmmod vhost_vdpaコマンドで無効化してください。
rmmod vhost_vdpa modprobe virtio_vdpa
3-6.dpdk-vdpaの設定 : virtio_vdpaの場合
/usr/src/dpdk/build/examples/dpdk-vdpa \
--socket-mem 1024,1024 \
-a 0000:07:00.2,class=vdpa \
-a 0000:07:01.2,class=vdpa \
--log-level=pmd,debug -- -i
create /tmp/sock-virtio0 0000:07:00.2
create /tmp/sock-virtio1 0000:07:01.2
3-7.仮想マシンの起動 : virtio_vdpaの場合
c77g153 virsh start c77g153; virsh console c77g153 c77g159 virsh start c77g159; virsh console c77g159
4.ovsにおける設定方法(dpdk無し)
ovsの設定方法は、Linux Bridgeと同様に、とてもシンプルな設定です。
dpdkは使用しませんが、HW offloadは設定しておきます。
4-1.ovsの初期設定
systemctl start openvswitch ovs-vsctl set Open_vSwitch . other_config:hw-offload=true other_config:tc-policy=none systemctl restart openvswitch ovs-vsctl get Open_vSwitch . other_config
other_configの設定値は以下のようになっていればOKです。
他の設定値(dpdk-initなど)の削除方法は前回記事を参照してください。
ovs-vsctl get Open_vSwitch . other_config [root@c83g155 ~]# ovs-vsctl get Open_vSwitch . other_config {hw-offload="true", tc-policy=none}
4-2.ovsの設定
ovs-vsctl add-br br30-ovs ovs-vsctl add-port br30-ovs ens2f0 ovs-vsctl add-port br30-ovs ens2f0_0 ovs-vsctl add-br br31-ovs ovs-vsctl add-port br31-ovs ens2f1 ovs-vsctl add-port br31-ovs ens2f1_0 ovs-vsctl show
以下のように設定されていればOKです。
ovs-vsctl show [root@c83g155 ~]# ovs-vsctl show 59a34ea2-ca80-48b9-8b14-a656c79bc451 Bridge br31-ovs Port ens2f1 Interface ens2f1 Port ens2f1_0 Interface ens2f1_0 Port br31-ovs Interface br31-ovs type: internal Bridge br30-ovs Port br30-ovs Interface br30-ovs type: internal Port ens2f0 Interface ens2f0 Port ens2f0_0 Interface ens2f0_0 ovs_version: "2.14.1"
4-4.ステータス確認
<ConsoleA>
vhost_vdpaの場合
Apr 15 10:00:53 c83g155 kernel: mlx5_core 0000:07:00.2: mlx5_vdpa_set_status:1786:(pid 8284): performing device reset Apr 15 10:00:53 c83g155 kvm[8292]: 1 guest now active Apr 15 10:00:53 c83g155 dbus-daemon[2123]: [session uid=0 pid=2123] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=0 pid=2781 comm="/usr/libexec/tracker-miner-fs ") Apr 15 10:00:53 c83g155 systemd[1964]: Starting Tracker metadata extractor... Apr 15 10:00:53 c83g155 dbus-daemon[2123]: [session uid=0 pid=2123] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Apr 15 10:00:53 c83g155 systemd[1964]: Started Tracker metadata extractor. Apr 15 10:01:16 c83g155 kernel: mlx5_core 0000:07:00.2: mlx5_vdpa_handle_set_map:473:(pid 8291): memory map update Apr 15 10:01:18 c83g155 ovs-vswitchd[8061]: ovs|00001|odp_util(handler4)|ERR|internal error parsing flow key recirc_id(0),dp_hash(0),skb_priority(0),in_port(3),skb_mark(0),ct_state(0),ct_zone(0),ct_mark(0),ct_label(0),eth(src=00:11:22:33:44:00,dst=01:00:5e:00:00:16),eth_type(0x0800),ipv4(src=192.168.30.153,dst=224.0.0.22,proto=2,tos=0xc0,ttl=1,frag=no) Apr 15 10:01:18 c83g155 ovs-vswitchd[8061]: ovs|00002|odp_util(handler4)|ERR|internal error parsing flow key recirc_id(0),dp_hash(0),skb_priority(0),in_port(5),skb_mark(0),ct_state(0),ct_zone(0),ct_mark(0),ct_label(0),eth(src=00:11:22:33:44:00,dst=01:00:5e:00:00:16),eth_type(0x0800),ipv4(src=192.168.30.153,dst=224.0.0.22,proto=2,tos=0xc0,ttl=1,frag=no) Apr 15 10:01:18 c83g155 kernel: tc mirred to Houston: device br30-ovs is down Apr 15 10:01:18 c83g155 kernel: tc mirred to Houston: device br31-ovs is down =====================snip===================== Apr 15 10:01:36 c83g155 systemd[1964]: tracker-extract.service: Succeeded.
"tc mirred to Houston: device br30-ovs is down"のメッセージが出力されますが、特に問題ありません。
virtio_vdpaの場合
ovs-dpdkと同じメッセージが出力されます。
<ConsoleB>
[root@c83g155 ~]# ovs-ofctl -O OpenFlow14 dump-ports br30-ovs OFPST_PORT reply (OF1.4) (xid=0x2): 3 ports port LOCAL: rx pkts=0, bytes=0, drop=13, errs=0, frame=0, over=0, crc=0 tx pkts=0, bytes=0, drop=0, errs=0, coll=0 duration=302.134s port ens2f0: rx pkts=2557039, bytes=260820713, drop=0, errs=0, frame=0, over=0, crc=0 tx pkts=2557043, bytes=260821159, drop=0, errs=0, coll=0 duration=302.105s port "ens2f0_0": rx pkts=2557014, bytes=250589621, drop=0, errs=0, frame=0, over=0, crc=0 tx pkts=33992436, bytes=3162372357, drop=0, errs=0, coll=0 duration=302.085s
<ConsoleC>
[root@c83g155 ~]# ovs-ofctl -O OpenFlow14 dump-ports br31-ovs OFPST_PORT reply (OF1.4) (xid=0x2): 3 ports port LOCAL: rx pkts=0, bytes=0, drop=13, errs=0, frame=0, over=0, crc=0 tx pkts=0, bytes=0, drop=0, errs=0, coll=0 duration=308.302s port ens2f1: rx pkts=2557043, bytes=260821159, drop=0, errs=0, frame=0, over=0, crc=0 tx pkts=2557039, bytes=260820713, drop=0, errs=0, coll=0 duration=308.279s port "ens2f1_0": rx pkts=2557014, bytes=250589517, drop=0, errs=0, frame=0, over=0, crc=0 tx pkts=33999072, bytes=3162887345, drop=0, errs=0, coll=0 duration=308.258s
<ConsoleD>
ovs-dpdkと同じ出力となります。
5.課題1:仮想マシンの起動方法
2021/06/01 Update
libvirtdによるVM起動方法を以下の記事に追記しました。
vDPA の設定方法 vhost_vdpa + VM編 - Metonymical Deflection
ここからは、試してみたけど上手く行かなかったことを記載していきます。
仮想マシンの起動方法として、以下2つの方法を記載しています。
これは以下の組合せの場合、通信が出来なかったためです。
起動方法 | vhost_vdpa | virtio_vdpa |
qemu | OK | NG |
libvirt | OK |
ここでは、具体的にどのような設定をして通信不可となったのかを記載します。
5-1.qemuとvirtio_vdpaによる仮想マシンの起動
以下のコマンドで仮想マシンを起動することは可能ですが、通信できませんでした。
qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -m 8G \ -hda /var/lib/libvirt/images/c77g1532.qcow2 \ -mem-prealloc \ -chardev socket,id=char0,path=/tmp/sock-virtio0 \ -netdev type=vhost-user,id=vdpa,chardev=char0 \ -device virtio-net-pci,netdev=vdpa,mac=00:11:22:33:44:00,page-per-vq=on \ -nographic \ 2>&1 | tee vm153.log
ポイントは、以下のlibvirtの設定をqemuの設定に置換できれば、通信ができるようになると考えています。
<currentMemory unit='KiB'>4194304</currentMemory> <memoryBacking> <hugepages> <page size='1048576' unit='KiB'/> </hugepages> </memoryBacking> <cpu mode='custom' match='exact' check='partial'> <numa> <cell id='0' cpus='0-1' memory='4194304' unit='KiB' memAccess='shared'/> </numa> </cpu>
qemuのヘルプを確認したところ、numaの設定はできそうです。しかし、qemuにおけるhugepagesの設定方法がわからないため、引き続き調査をしていきたいと考えています。
5-2.libvirtとvhost_vdpaによる仮想マシンの起動
vhost_vdpaの場合、vDPAデバイスをXMLで設定することが可能となっています。*4
https://libvirt.org/formatdomain.html#vdpa-devices
具体的には以下のように設定します。
<devices> ...... <interface type='vdpa'> <source dev='/dev/vhost-vdpa-0'/> </interface> ...... </devices>
しかし、上記の設定に加え、以下の設定を実施してみましたが通信できませんでした。
virt-xml c77g153 --edit --qemu-commandline='-device' virt-xml c77g153 --edit --qemu-commandline='virtio-net-pci,netdev=vhost-vdpa0,page-per-vq=on,iommu_platform=on,disable-legacy=on'
こちらについても、引き続き調査をしていきたいと考えています。
仮想マシンの管理上、libvirtに統一した方が良いと考えているため、5-2の方法を優先的に調べようと思います。
6.課題2:VFリレー設定
以下のMellanoxサイトにVFリレーによるHardware vDPAの設定方法が記載されています。
VirtIO Acceleration through VF Relay (Software & Hardware vDPA)
https://docs.mellanox.com/pages/viewpage.action?pageId=43718786#OVSOffloadUsingASAP%C2%B2Direct-swvdpaVirtIOAccelerationthroughVFRelay(Software&HardwarevDPA)
サンプルコンフィグが記載されていますが、ポイントは"vdpa-socket-path=<sock path>"となります。
ovs-vsctl add-port br0 vdpa0 -- set Interface vdpa0 type=dpdkvdpa \ options:vdpa-socket-path=<sock path> \ options:vdpa-accelerator-devargs=\ options:dpdk-devargs= ,representor=[id] \ options: vdpa-max-queues = \ options: vdpa-sw=
具体的には以下のように設定します。
ovs-vsctl add-port br0-ovs vdpa0 -- set Interface vdpa0 type=dpdkvdpa options:vdpa-socket-path=/var/run/virtio-forwarder/sock0 options:vdpa-accelerator-devargs=0000:01:00.2 options:dpdk-devargs=0000:01:00.0,representor=[0] options: vdpa-max-queues=8
ここで、"<sock path>"は"/var/run/virtio-forwarder/sock0"となりますが、"virtio-forwarder"を利用して、事前にVFリレーの設定を実施しておく必要があるようです。
Virtio-forwarder Documentation — Virtio-forwarder 1.2.99.19 documentation
しかし、上記サイトの手順でvirtio-forwarderをインストールしたところ、以下のエラーでインストールできませんでした。
Error: Problem: package dpdk-19.11.3-1.el8.x86_64 requires libmlx4.so.1()(64bit), but none of the providers can be installed - package dpdk-19.11.3-1.el8.x86_64 requires libmlx4.so.1(MLX4_1.0)(64bit), but none of the providers can be installed ……
このため、今回利用している"dpdk21.02"の各ライブラリのリンクをした後、ソースからビルドしてみようと考えています。
なお、Mellanoxサイトにも記載のある通り、この方法はovs-dpdkのアップストリームでは承認されていない方法となるため、優先度を下げて調査しようと考えています。*5
以上です。
7.最後に
参考にさせて頂いたサイトは、本文中に記載しました。
vDPA自体も難しい点は多々ありましたが、特に難しかったのはSR-IOV switchdevモードのところで、switchdevモード時のトラフィックフローを理解するまでに多くの時間を要しました。
しかし、以下のブログの解説により突破口が開き、何とか先に進むことが出来ました。
yunazunoさんの解説には大変感謝致しております。
yunazuno.hatenablog.com
今後、vDPAが普及するのか、それとも消えてしまうのかはわかりませんが、ScalableIOVなどの技術と組合せて利用することにより、その真価が発揮されるのではないかと予想しています。
01.org
次回は、Kubernetes環境におけるvDPAの設定方法について、詳細を記載していきたいと考えています。
関連記事
No | vm(qemu)/k8s | k8s Pod/VMI | vDPA Framework | vDPA Type | SR-IOV mode | Related Articles |
1 | vm | - | kernel | vhost | lagacy | Not started |
2 | vm | - | kernel | vhost | switchdev | vDPA の設定方法 vhost_vdpa + VM編 - Metonymical Deflection |
3 | vm | - | kernel | virtio | lagacy | Not started |
4 | vm | - | kernel | virtio | switchdev | Not started |
5 | vm | - | dpdk | vhost | lagacy | Not started |
6 | vm | - | dpdk | vhost | switchdev | Not started |
7 | vm | - | dpdk | virtio | lagacy | Not started |
8 | vm | - | dpdk | virtio | switchdev | vDPA の設定方法 virtio_vdpa + VM編 - Metonymical Deflection |
9 | k8s | pod | kernel | vhost | lagacy | vDPA の設定方法 vhost_vdpa + kubernetes編 - Metonymical Deflection |
10 | k8s | pod | kernel | vhost | switchdev | vDPA の設定方法 vhost_vdpa + kubernetes + Accelerated Bridge CNI編 - Metonymical Deflection |
11 | k8s | pod | kernel | virtio | lagacy | Not started |
12 | k8s | pod | kernel | virtio | switchdev | Not started |
13 | k8s | pod | dpdk | client | lagacy | Not started |
14 | k8s | pod | dpdk | client | switchdev | Not started |
15 | k8s | pod | dpdk | server | lagacy | Not started |
16 | k8s | pod | dpdk | server | switchdev | Not started |
*1:既に前回記事を読まれている方に向けて記載していますので、詳細な説明などは省略しています。
*2:ちなみに、100GbpsのDACは、このサイトで購入しています。
*3:MCX623106AN-CDAT(正式サポートNIC)とMCX623106AS-CDAT(私が購入したNIC)では、型番が微妙に異なるため、vDPAのHW offloadができないかもしれない、という不安と戦いながら検証を進めていました。
*4:libvirt v6.9.0 QEMU only, requires QEMU 5.1.0 or newer
*5:もう一つ、気になる点として、"type=dpdkvdpa"があります。ovsのv2.15.0をソースからビルドして、このtypeを指定したらとエラーで弾かれました。このため、本編"2-3.Mellanoxドライバ(OFED)のインストール"で導入されるovsを使用しないとVFリレーによる設定はできないかもしれません。