本ブログでは、virtio_vdpaモジュールを使用したVM(仮想マシン)間通信の設定方法について記載していきます。
以下は関連記事の一覧となります。
1.構成
1-1.環境
IA server : ProLiant DL360p Gen8 or DL360 Gen9 System ROM : P71 01/22/2018 NIC : Mellanox ConnectX-6 Dx (MCX623106AS-CDAT) OS : CentOS8.3(2011) Kernel : 5.11.11-1.el8.elrepo.x86_64 Installed Environment Groups : @^graphical-server-environment @container-management @development @virtualization-client @virtualization-hypervisor @virtualization-tools Mellanox OFED : v5.2-2.2.0.0 qemu-kvm : v6.0.0-rc1 DPDK : v21.02 ovs : v2.14.1
1-2.全体の流れ
事前準備
Kernelアップデート
qemuのビルド
dpdkのビルド
SR-IOV switchdev modeへ変更
ovs-dpdkとVMの設定:前回記事と異なる
動作確認:前回記事と異なる
<補足>
多くの項目が前回記事と同一なため、異なる項目は青太文字で記載してます。
また、前回記事で既に環境が整っている方は、ホストOSを再起動後、"SR-IOV switchdev modeへ変更"から読み始めてください。
1-3.全体構成
以下の点が前回記事と異なっています。
今回 | (1) | /tmp/sock-virtio0 |
前回 | (1) | /dev/vhost-vdpa-0 |
fig.1
fig.1は簡易的に記載しており、内部アーキテクチャは省略しています。このため、実際は以下の構成をイメージして頂ければと思います。
fig.2
Red HatのBlogより引用
vDPA kernel framework part 3: usage for VMs and containers
オレンジ色点線の(A)(B)が、それぞれfig.1とfig.2に対応しています。
さらに、fig.2においては、実際のトラフィックフローを青文字と赤文字で記載しています。*1
fig.2において、SR-IOVのPFとVFをそれぞれ記載していますが、これに加えて「VF rep」を記載しています。PFとVF repのbsf(Bus, Slot, Function)番号が同一である点も注意が必要です。
PF | VF0 | VF0 rep |
ens2f0 | ens2f0v0 | ens2f0_0 |
07:00.0 | 07:00.2 | 07:00.0 |
rep=representorは、SR-IOVにおけるswtichdevモード特有のインターフェースで、swtichdevモードを有効化することにより作成されます。
また、swtichdevモードに対して、従来のSR-IOV VFをlegacyモードと呼び、明示的に別けて使用する必要があります。加えて、ConnectX-6 Dxでは、vDPA HW offloadを有効化するために、swtichdevモードが必須要件となっています。
2.事前準備
特に記載しませんが、SELinux無効化、FW無効化、NTP時刻同期設定は事前に行っています。
2-1.HugePageとIOMMUの有効化
sed -i -e "/GRUB_CMDLINE_LINUX=/s/\"$/ default_hugepagesz=1G hugepagesz=1G hugepages=16\"/g" /etc/default/grub sed -i -e "/GRUB_CMDLINE_LINUX=/s/\"$/ intel_iommu=on iommu=pt pci=realloc\"/g" /etc/default/grub grub2-mkconfig -o /etc/grub2.cfg
次にHugePageのマウント設定を実施しておきます。次回OS起動時に自動マウントされます。
vi /etc/fstab nodev /dev/hugepages hugetlbfs pagesize=1GB 0 0
2-2.SR-IOV VFの設定
SR-IOV VFの設定を実施します。VF数を増やしても問題ありませんが、ここでは説明をシンプルにするため、VF数「1」としています。加えて、MACアドレスの設定は必須です。*2
vi /etc/rc.local echo 1 > /sys/class/net/ens2f0/device/sriov_numvfs echo 1 > /sys/class/net/ens2f1/device/sriov_numvfs sleep 1 ip link set ens2f0 vf 0 mac 00:11:22:33:44:00 ip link set ens2f1 vf 0 mac 00:11:22:33:44:10 sleep 1 exit 0 chmod +x /etc/rc.d/rc.local
2-3.Mellanoxドライバ(OFED)のインストール
isoファイルはMellanoxのサイトからDLしてください。Mellanox Download Site
DLしたisoファイルは、/root/tmp/に保存してください。
以下のコマンドにて、Mellanoxドライバをインストールしますが、ovs v2.14.1も同時にインストールされます。
dnf -y install tcl tk unbound && \ mount -t iso9660 -o loop /root/tmp/MLNX_OFED_LINUX-5.2-2.2.0.0-rhel8.3-x86_64.iso /mnt && \ /mnt/mlnxofedinstall --upstream-libs --dpdk --ovs-dpdk --with-mft --with-mstflint
インストールが完了したら、再起動してください。
reboot
再起動が完了したら、HugePageを確認します。
cat /proc/meminfo | grep Huge grep hugetlbfs /proc/mounts [root@c83g155 ~]# cat /proc/meminfo | grep Huge AnonHugePages: 452608 kB ShmemHugePages: 0 kB FileHugePages: 0 kB HugePages_Total: 16 HugePages_Free: 16 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 1048576 kB Hugetlb: 16777216 kB [root@c83g155 ~]# grep hugetlbfs /proc/mounts nodev /dev/hugepages hugetlbfs rw,relatime,pagesize=1024M 0 0
3.Kernelアップデート
2021年4月8日現在、vDPA関連モジュールは高い頻度で更新されていますので、最新のKernelをインストールします。
3-1.elrepoのインストール
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org dnf -y install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
3-2.Kernelのインストール
dnf list installed | grep kernel dnf -y --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel dnf list installed | grep kernel reboot
現在インストール済みのKernelを確認
kernel-ml, kernel-ml-develをインストール*3
インストール済みKernelの確認
再起動
3-3.Kernel headersなどのインストール
uname -r dnf -y swap --enablerepo=elrepo-kernel kernel-headers -- kernel-ml-headers && \ dnf -y remove kernel-tools kernel-tools-libs && \ dnf -y --enablerepo=elrepo-kernel install kernel-ml-tools kernel-ml-tools-libs dnf list installed | grep kernel
現在起動中のKernel Version確認
kernel-headersのインストール
既存のkernel-tools kernel-tools-libsの削除
kernel-tools kernel-tools-libsのインストール
インストール済みKernelの確認
以下の出力になっていればOKです。
[root@c83g155 ~]# dnf list installed | grep kernel kernel.x86_64 4.18.0-240.el8 @anaconda kernel-core.x86_64 4.18.0-240.el8 @anaconda kernel-devel.x86_64 4.18.0-240.el8 @anaconda kernel-ml.x86_64 5.11.11-1.el8.elrepo @elrepo-kernel kernel-ml-core.x86_64 5.11.11-1.el8.elrepo @elrepo-kernel kernel-ml-devel.x86_64 5.11.11-1.el8.elrepo @elrepo-kernel kernel-ml-headers.x86_64 5.11.11-1.el8.elrepo @elrepo-kernel kernel-ml-modules.x86_64 5.11.11-1.el8.elrepo @elrepo-kernel kernel-ml-tools.x86_64 5.11.11-1.el8.elrepo @elrepo-kernel kernel-ml-tools-libs.x86_64 5.11.11-1.el8.elrepo @elrepo-kernel kernel-modules.x86_64 4.18.0-240.el8 @anaconda kmod-kernel-mft-mlnx.x86_64 4.16.1-1.rhel8u3 @System kmod-mlnx-ofa_kernel.x86_64 5.2-OFED.5.2.2.2.0.1.rhel8u3 @System mlnx-ofa_kernel.x86_64 5.2-OFED.5.2.2.2.0.1.rhel8u3 @System mlnx-ofa_kernel-devel.x86_64 5.2-OFED.5.2.2.2.0.1.rhel8u3 @System
4.qemuのビルド
4-2.必要なパッケージのインストール
qemuに加えて、dpdkのビルドで必要とされるパッケージも合わせてインストールしています。
dnf -y install cmake gcc libnl3-devel libudev-devel make numactl numactl-devel \ pkgconfig valgrind-devel pandoc libibverbs libmlx5 libmnl-devel meson ninja-build \ glibc-utils glib2 glib2-devel pixman pixman-devel zlib zlib-devel \ usbredir-devel spice-server-devel && \ wget https://cbs.centos.org/kojifiles/packages/pyelftools/0.26/1.el8/noarch/python3-pyelftools-0.26-1.el8.noarch.rpm && \ dnf -y localinstall python3-pyelftools-0.26-1.el8.noarch.rpm
4-3.qemuのビルド
cd /usr/src && \ git clone https://github.com/qemu/qemu.git && \ cd qemu/ && \ git checkout v6.0.0-rc1 && \ mkdir build && \ cd build/ && \ ../configure --enable-vhost-vdpa --target-list=x86_64-softmmu && \ make -j && \ make install
インストール後のVersion確認
/usr/local/bin/qemu-system-x86_64 --version [root@c83g155 ~]# /usr/local/bin/qemu-system-x86_64 --version QEMU emulator version 5.2.91 (v6.0.0-rc1) Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
5.dpdkのビルド
5-1.dpdkのビルド
cd /usr/src/ && \ git clone git://dpdk.org/dpdk && \ cd dpdk && \ git checkout v21.02 && \ meson -Dexamples=all build && \ ninja -C build && \ ninja -C build install
5-2.dpdk関連ライブラリのリンク
viで新規ファイルを作成し、libのPathを記載してください。
vi /etc/ld.so.conf.d/libdpdk.conf /usr/src/dpdk/build/lib
ldconfigを実行後、libがリンクされたことを確認してください。
ldconfig ldconfig -p |grep dpdk
以下のようにポイントされていればOKです。
[root@c83g155 dpdk]# ldconfig -p |grep dpdk librte_vhost.so.21 (libc6,x86-64) => /usr/src/dpdk/build/lib/librte_vhost.so.21 librte_vhost.so (libc6,x86-64) => /usr/src/dpdk/build/lib/librte_vhost.so librte_timer.so.21 (libc6,x86-64) => /usr/src/dpdk/build/lib/librte_timer.so.21
ここで、一旦再起動しておきます。
reboot
6.SR-IOV switchdev modeへ変更
6-1.現在の動作モードを確認
lshw -businfo -c network devlink dev eswitch show pci/0000:07:00.0 devlink dev eswitch show pci/0000:07:00.1
PCIデバイスのbsf(bus, slot, function)番号を確認
07:00.0(ens2f0)のステータス確認
07:00.1(ens2f1)のステータス確認
以下のように出力されます。
[root@c83g155 ~]# lshw -businfo -c network Bus info Device Class Description ======================================================== pci@0000:04:00.0 ens1f0 network 82599ES 10-Gigabit SFI/SFP+ Network Connection pci@0000:04:00.1 ens1f1 network 82599ES 10-Gigabit SFI/SFP+ Network Connection pci@0000:03:00.0 eno1 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:03:00.1 eno2 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:03:00.2 eno3 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:03:00.3 eno4 network NetXtreme BCM5719 Gigabit Ethernet PCIe 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 [root@c83g155 ~]# devlink dev eswitch show pci/0000:07:00.0 pci/0000:07:00.0: mode legacy inline-mode none encap disable [root@c83g155 ~]# devlink dev eswitch show pci/0000:07:00.1 pci/0000:07:00.1: mode legacy inline-mode none encap disable
6-2.動作モードの変更
bsf番号が微妙に異なっている点に注意してください。*4
echo 0000:07:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind && \ echo 0000:07:01.2 > /sys/bus/pci/drivers/mlx5_core/unbind && \ devlink dev eswitch set pci/0000:07:00.0 mode switchdev && \ devlink dev eswitch set pci/0000:07:00.1 mode switchdev && \ echo 0000:07:00.2 > /sys/bus/pci/drivers/mlx5_core/bind && \ echo 0000:07:01.2 > /sys/bus/pci/drivers/mlx5_core/bind
VFのmlx5_coreドライバをアンバインドします。
07:00.2 | ens2f0v0 |
07:01.2 | ens2f1v0 |
PFの動作モードをswitchdevに変更します。
07:00.0 | ens2f0 |
07:00.1 | ens2f1 |
VFのmlx5_coreドライバを再バインドします。
07:00.2 | ens2f0v0 |
07:01.2 | ens2f1v0 |
6-3.変更後の動作モードを確認
devlink dev eswitch show pci/0000:07:00.0 devlink dev eswitch show pci/0000:07:00.1
switchdev モードに変更されました。
[root@c83g155 ~]# devlink dev eswitch show pci/0000:07:00.0 pci/0000:07:00.0: mode switchdev inline-mode none encap enable [root@c83g155 ~]# devlink dev eswitch show pci/0000:07:00.1 pci/0000:07:00.1: mode switchdev inline-mode none encap enable
VF Representerが追加されています。
[root@c83g155 ~]# lshw -businfo -c network Bus info Device Class Description ======================================================== pci@0000:04:00.0 ens1f0 network 82599ES 10-Gigabit SFI/SFP+ Network Connection pci@0000:04:00.1 ens1f1 network 82599ES 10-Gigabit SFI/SFP+ Network Connection pci@0000:03:00.0 eno1 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:03:00.1 eno2 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:03:00.2 eno3 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:03:00.3 eno4 network NetXtreme BCM5719 Gigabit Ethernet PCIe 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
さらに、NICのHW offload機能が有効化されていることも確認します。
ethtool -k ens2f0 |grep tc ethtool -k ens2f1 |grep tc [root@c83g155 ~]# ethtool -k ens2f0 |grep tc tcp-segmentation-offload: on tx-tcp-segmentation: on tx-tcp-ecn-segmentation: off [fixed] tx-tcp-mangleid-segmentation: off tx-tcp6-segmentation: on hw-tc-offload: on [root@c83g155 ~]# ethtool -k ens2f1 |grep tc tcp-segmentation-offload: on tx-tcp-segmentation: on tx-tcp-ecn-segmentation: off [fixed] tx-tcp-mangleid-segmentation: off tx-tcp6-segmentation: on hw-tc-offload: on
7.ovs-dpdkとVMの設定:前回記事と異なる
7-1.全体の流れ ~概要~
以下のfig.1に記載されている(1)-(9)の順に設定していきます。
fig.1
7-2.全体の流れ ~コマンドのみ~
以下のコマンドを投入していきます。
詳細な解説は後述しますが、解説が不要な方はコマンドだけを実行してください。
1.virtio_vdpaモジュールの有効化とdpdk-vdpaの設定
(1)
modprobe 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
2.ovsの初期設定
systemctl start openvswitch
ovs-vsctl set Open_vSwitch . other_config:dpdk-init=true
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true other_config:tc-policy=none
ovs-vsctl set Open_vSwitch . other_config:dpdk-socket-mem=1024,1024
ovs-vsctl set Open_vSwitch . other_config:vhost-iommu-support=true
ovs-vsctl set Open_vSwitch . other_config:dpdk-extra=" \
-w 0000:07:00.0,representor=[0],dv_flow_en=1,dv_esw_en=1,dv_xmeta_en=0 \
-w 0000:07:00.1,representor=[0],dv_flow_en=1,dv_esw_en=1,dv_xmeta_en=0"
systemctl restart openvswitch
3.br30-ovsの設定
(2)
ovs-vsctl add-br br30-ovs -- set bridge br30-ovs datapath_type=netdev
(3)
ovs-vsctl add-port br30-ovs ens2f0 -- set Interface ens2f0 type=dpdk options:dpdk-devargs=0000:07:00.0
(4)
ovs-vsctl add-port br30-ovs ens2f0_0 -- set Interface ens2f0_0 type=dpdk options:dpdk-devargs=0000:07:00.0,representor=[0]
4.br31-ovsの設定
(5)
ovs-vsctl add-br br31-ovs -- set bridge br31-ovs datapath_type=netdev
(6)
ovs-vsctl add-port br31-ovs ens2f1 -- set Interface ens2f1 type=dpdk options:dpdk-devargs=0000:07:00.1
(7)
ovs-vsctl add-port br31-ovs ens2f1_0 -- set Interface ens2f1_0 type=dpdk options:dpdk-devargs=0000:07:00.1,representor=[0]
5.仮想マシンc77g153の設定と起動
(8)
virsh edit c77g153
<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>
virt-xml c77g153 --edit --qemu-commandline='-mem-prealloc'
virt-xml c77g153 --edit --qemu-commandline='-chardev'
virt-xml c77g153 --edit --qemu-commandline='socket,id=charnet1,path=/tmp/sock-virtio0'
virt-xml c77g153 --edit --qemu-commandline='-netdev'
virt-xml c77g153 --edit --qemu-commandline='vhost-user,chardev=charnet1,queues=16,id=hostnet1'
virt-xml c77g153 --edit --qemu-commandline='-device'
virt-xml c77g153 --edit --qemu-commandline='virtio-net-pci,mq=on,vectors=6,netdev=hostnet1,id=net1,mac=00:11:22:33:44:00,addr=0x6,page-per-vq=on,rx_queue_size=1024,tx_queue_size=1024'
6.仮想マシンc77g159の設定と起動
(9)
virsh edit c77g159
<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>
virt-xml c77g159 --edit --qemu-commandline='-mem-prealloc'
virt-xml c77g159 --edit --qemu-commandline='-chardev'
virt-xml c77g159 --edit --qemu-commandline='socket,id=charnet2,path=/tmp/sock-virtio1'
virt-xml c77g159 --edit --qemu-commandline='-netdev'
virt-xml c77g159 --edit --qemu-commandline='vhost-user,chardev=charnet2,queues=16,id=hostnet2'
virt-xml c77g159 --edit --qemu-commandline='-device'
virt-xml c77g159 --edit --qemu-commandline='virtio-net-pci,mq=on,vectors=6,netdev=hostnet2,id=net1,mac=00:11:22:33:44:10,addr=0x7,page-per-vq=on,rx_queue_size=1024,tx_queue_size=1024'
7-3.virtio_vdpaモジュールの有効化とdpdk-vdpaの設定:(1):前回記事と異なる
virtio_vdpaモジュールの有効化
modprobe virtio_vdpa コマンドの実行前と実行後の変化を確認していきます。
modprobe virtio_vdpa実行前
lsmod |grep vd ls -Fal /sys/bus/vdpa/drivers/virtio_vdpa [root@c83g155 ~]# lsmod |grep vd mlx5_vdpa 45056 0 vhost_iotlb 16384 2 vhost,mlx5_vdpa vdpa 16384 1 mlx5_vdpa mlx5_core 1216512 2 mlx5_vdpa,mlx5_ib [root@c83g155 ~]# ls -Fal /sys/bus/vdpa/drivers/virtio_vdpa ls: cannot access '/sys/bus/vdpa/drivers/virtio_vdpa': No such file or directory
modprobe virtio_vdpa実行後
modprobe virtio_vdpa lsmod |grep vd ls -Fal /sys/bus/vdpa/drivers/virtio_vdpa [root@c83g155 ~]# lsmod |grep vd virtio_vdpa 16384 0 mlx5_vdpa 45056 0 vhost_iotlb 16384 1 mlx5_vdpa vdpa 16384 2 virtio_vdpa,mlx5_vdpa mlx5_core 1216512 2 mlx5_vdpa,mlx5_ib [root@c83g155 ~]# ls -Fal /sys/bus/vdpa/drivers/virtio_vdpa total 0 drwxr-xr-x 2 root root 0 Apr 12 21:00 ./ drwxr-xr-x 3 root root 0 Apr 12 21:00 ../ --w------- 1 root root 4096 Apr 12 21:00 bind lrwxrwxrwx 1 root root 0 Apr 12 21:00 module -> ../../../../module/virtio_vdpa/ --w------- 1 root root 4096 Apr 12 21:00 uevent --w------- 1 root root 4096 Apr 12 21:00 unbind lrwxrwxrwx 1 root root 0 Apr 12 21:00 vdpa0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:07:00.2/vdpa0/ lrwxrwxrwx 1 root root 0 Apr 12 21:00 vdpa1 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:07:01.2/vdpa1/
上記の出力結果より、以下のことが確認できます。
- 0000:07:00.2/vdpa0と0000:07:01.2/vdpa1がvirtio_vdpaドライバで制御されている
dpdk-vdpaの設定
次にdpdk-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
プロンプトが vdpa> に変わりますので、以下のコマンドを実行します。
create /tmp/sock-virtio0 0000:07:00.2 create /tmp/sock-virtio1 0000:07:01.2
別なターミナルでホストOSにssh接続し、以下のコマンドでsockファイルが生成されたことを確認します。
[root@c83g155 ~]# ls -Fal /tmp total 36 drwxrwxrwt. 17 root root 4096 Apr 12 21:08 ./ dr-xr-xr-x. 17 root root 244 Apr 7 20:30 ../ -rw-r--r-- 1 root root 1874 Apr 7 20:30 anaconda.log ===================== s n i p ===================== srwxr-xr-x 1 root root 0 Apr 12 21:08 sock-virtio0= srwxr-xr-x 1 root root 0 Apr 12 21:08 sock-virtio1= drwx------ 3 root root 17 Apr 12 19:56 systemd-private-f5b122148a7c4019be8cf0116bd9f2cc-chronyd.service-IEe7hb/ ===================== s n i p =====================
<補足>
以下にdpdk-vdpaコマンドの出力例を記載します。
[root@c83g155 ~]# /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 EAL: Detected 16 lcore(s) EAL: Detected 2 NUMA nodes EAL: Detected static linkage of DPDK EAL: Multi-process socket /var/run/dpdk/rte/mp_socket EAL: Selected IOVA mode 'VA' EAL: No available 2048 kB hugepages reported EAL: Probing VFIO support... EAL: Probe PCI driver: mlx5_pci (15b3:101e) device: 0000:07:00.2 (socket 0) mlx5_vdpa: Checking device "mlx5_3".. mlx5_vdpa: Checking device "mlx5_2".. mlx5_vdpa: PCI information matches for device "mlx5_2". common_mlx5: Netlink "devlink" family ID is 20. common_mlx5: ROCE is enabled for device "0000:07:00.2". common_mlx5: Device 0000:07:00.2 ROCE was disabled by Netlink successfully. common_mlx5: Device "0000:07:00.2" was reloaded by Netlink successfully. mlx5_vdpa: ROCE is disabled by Netlink successfully. mlx5_vdpa: Checking device "mlx5_3".. mlx5_vdpa: Checking device "mlx5_1".. mlx5_vdpa: Checking device "mlx5_0".. mlx5_vdpa: Checking device "mlx5_2".. mlx5_vdpa: event mode is 1. mlx5_vdpa: event_us is 0 us. mlx5_vdpa: no traffic time is 2 s. EAL: Probe PCI driver: mlx5_pci (15b3:101e) device: 0000:07:01.2 (socket 0) mlx5_vdpa: Checking device "mlx5_3".. mlx5_vdpa: PCI information matches for device "mlx5_3". common_mlx5: Netlink "devlink" family ID is 20. common_mlx5: ROCE is enabled for device "0000:07:01.2". common_mlx5: Device 0000:07:01.2 ROCE was disabled by Netlink successfully. common_mlx5: Device "0000:07:01.2" was reloaded by Netlink successfully. mlx5_vdpa: ROCE is disabled by Netlink successfully. mlx5_vdpa: Checking device "mlx5_1".. mlx5_vdpa: Checking device "mlx5_0".. mlx5_vdpa: Checking device "mlx5_2".. mlx5_vdpa: Checking device "mlx5_3".. mlx5_vdpa: event mode is 1. mlx5_vdpa: event_us is 0 us. mlx5_vdpa: no traffic time is 2 s. EAL: No legacy callbacks, legacy socket not created Interactive-mode selected vdpa> < < < < コマンド実行後、プロンプトが "vdpa>" になる vdpa> create /tmp/sock-virtio0 0000:07:00.2 VHOST_CONFIG: vhost-user server: socket created, fd: 83 VHOST_CONFIG: bind to /tmp/sock-virtio0 vdpa> create /tmp/sock-virtio1 0000:07:01.2 VHOST_CONFIG: vhost-user server: socket created, fd: 86 VHOST_CONFIG: bind to /tmp/sock-virtio1 vdpa>
この後の動作確認でも使用しますので、このターミナルはこのままの状態にしておいてください。
7-4.ovsの初期設定
ovsは、既にインストール済みなので*5、systemctlからサービスをスタートします。
systemctl start openvswitch
ovs-vsctl set Open_vSwitch . other_config:dpdk-init=true
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true other_config:tc-policy=none
ovs-vsctl set Open_vSwitch . other_config:dpdk-socket-mem=1024,1024
ovs-vsctl set Open_vSwitch . other_config:vhost-iommu-support=true
ovs-vsctl set Open_vSwitch . other_config:dpdk-extra=" \
-w 0000:07:00.0,representor=[0],dv_flow_en=1,dv_esw_en=1,dv_xmeta_en=0 \
-w 0000:07:00.1,representor=[0],dv_flow_en=1,dv_esw_en=1,dv_xmeta_en=0"
systemctl restart openvswitch
ovsサービスの起動
dpdkの初期化
HW offloadとtc-policyの設定
メモリ割当て
vhostのIOMMU設定
representerの設定
ovsサービスの再起動(上記設定を反映させるため)
以下のコマンドで設定内容を確認します。
ovs-vsctl get Open_vSwitch . other_config [root@c83g155 ~]# ovs-vsctl get Open_vSwitch . other_config {dpdk-extra=" -w 0000:07:00.0,representor=[0],dv_flow_en=1,dv_esw_en=1,dv_xmeta_en=0 -w 0000:07:00.1,representor=[0],dv_flow_en=1,dv_esw_en=1,dv_xmeta_en=0", dpdk-init="true", dpdk-socket-mem="1024,1024", hw-offload="true", tc-policy=none, vhost-iommu-support="true"}
<補足1>
other_config:dpdk-extraについて、補足します。
lshw -businfo -c network の出力結果とother_config:dpdk-extra で設定したコマンドには、以下の対応関係があります。
0000:07:00.0 ens2f0_0 | -w 0000:07:00.0,representor=[0] |
0000:07:00.1 ens2f1_0 | -w 0000:07:00.1,representor=[0] |
<補足2>
other_config:tc-policyについて、補足します。
tc-policyは、以下のオプションが設定可能です。
none | adds a TC rule to both the software and the hardware (default) |
skip_sw | adds a TC rule only to the hardware |
skip_hw | adds a TC rule only to the software |
<補足3>
設定を削除したい場合は、以下のようにコマンドを実行してください。
dpdk-extra がキーとなっていますので、dpdk-initやhw-offloadなど、削除したい任意のキーを指定してください。
ovs-vsctl remove Open_vSwitch . other_config dpdk-extra
7-5.br30-ovsの設定:(2)(3)(4)
1つ目のブリッジを作成します。
(2) ovs-vsctl add-br br30-ovs -- set bridge br30-ovs datapath_type=netdev (3) ovs-vsctl add-port br30-ovs ens2f0 -- set Interface ens2f0 type=dpdk options:dpdk-devargs=0000:07:00.0 (4) ovs-vsctl add-port br30-ovs ens2f0_0 -- set Interface ens2f0_0 type=dpdk options:dpdk-devargs=0000:07:00.0,representor=[0]
(2)ブリッジの作成
(3)アップリンクの作成(PFを指定し、外部NW向けのインターフェースを設定)
(4)ダウンリンクの作成(VF Representerを指定し、VM向けのインターフェースを設定)
以下のコマンドで設定を確認します。
[root@c83g155 ~]# ovs-vsctl show 59a34ea2-ca80-48b9-8b14-a656c79bc451 Bridge br30-ovs datapath_type: netdev Port br30-ovs Interface br30-ovs type: internal Port ens2f0_0 Interface ens2f0_0 type: dpdk options: {dpdk-devargs="0000:07:00.0,representor=[0]"} Port ens2f0 Interface ens2f0 type: dpdk options: {dpdk-devargs="0000:07:00.0"} ovs_version: "2.14.1"
7-6.br31-ovsの設定:(5)(6)(7)
2つ目のブリッジを作成します。
(5) ovs-vsctl add-br br31-ovs -- set bridge br31-ovs datapath_type=netdev (6) ovs-vsctl add-port br31-ovs ens2f1 -- set Interface ens2f1 type=dpdk options:dpdk-devargs=0000:07:00.1 (7) ovs-vsctl add-port br31-ovs ens2f1_0 -- set Interface ens2f1_0 type=dpdk options:dpdk-devargs=0000:07:00.1,representor=[0]
(2)(3)(4)と同様です。
以下のコマンドで設定を確認します。青文字が追加された部分です。
[root@c83g155 ~]# ovs-vsctl show
59a34ea2-ca80-48b9-8b14-a656c79bc451
Bridge br31-ovs
datapath_type: netdev
Port ens2f1_0
Interface ens2f1_0
type: dpdk
options: {dpdk-devargs="0000:07:00.1,representor=[0]"}
Port ens2f1
Interface ens2f1
type: dpdk
options: {dpdk-devargs="0000:07:00.1"}
Port br31-ovs
Interface br31-ovs
type: internal
Bridge br30-ovs
datapath_type: netdev
Port br30-ovs
Interface br30-ovs
type: internal
Port ens2f0_0
Interface ens2f0_0
type: dpdk
options: {dpdk-devargs="0000:07:00.0,representor=[0]"}
Port ens2f0
Interface ens2f0
type: dpdk
options: {dpdk-devargs="0000:07:00.0"}
ovs_version: "2.14.1"
7-7.仮想マシンc77g153の設定と起動:(8):前回記事と異なる
/var/lib/libvirt/images/にqcow2ファイルをアップロードしておいてください。
本ブログでは、CentOS7.7をインストールしたqcow2ファイルを予め準備していました。
加えて、一度virt-managerで仮想マシンを作成後、"virsh edit" と "virt-xml" コマンドで編集していきます。*6
VNCなどでホストOSにログインし、virt-managerを起動してください。
新規仮想マシンを作成する際、以下の[1]-[5]のデバイスを削除してください。*7
VM起動後、一旦shutdownします。
shutdown後、以下のようなデバイス構成になっていればOKです。
ここに記載されているNICはvDPAでは使用しませんが、sshできるようになるため、必要であれば管理用IPをアサインしてください。
shutdown後、virsh editコマンドで以下の設定を実施します。
(8) virsh edit c77g153 <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>
bashに戻った後、さらにvirt-xmlコマンドで以下の設定を実施します。
(8) virt-xml c77g153 --edit --qemu-commandline='-mem-prealloc' virt-xml c77g153 --edit --qemu-commandline='-chardev' virt-xml c77g153 --edit --qemu-commandline='socket,id=charnet1,path=/tmp/sock-virtio0' virt-xml c77g153 --edit --qemu-commandline='-netdev' virt-xml c77g153 --edit --qemu-commandline='vhost-user,chardev=charnet1,queues=16,id=hostnet1' virt-xml c77g153 --edit --qemu-commandline='-device' virt-xml c77g153 --edit --qemu-commandline='virtio-net-pci,mq=on,vectors=6,netdev=hostnet1,id=net1,mac=00:11:22:33:44:00,addr=0x6,page-per-vq=on,rx_queue_size=1024,tx_queue_size=1024'
-mem-prealloc | 詳細は確認できていませんが、fig.2よりPlatformIOMMUとvirtqueueのやり取りで使用するため必須の設定と思われます。 |
path=/tmp/sock-virtio0 | dpdk-vdpaのsockファイルを明示的に指定しています。 |
mq=on | multi-queueを使用するための設定です。 |
page-per-vq=on | virtqueueを使用するため必須の設定です |
<補足>
virt-xmlコマンドを実行すると、以下のWARNINGメッセージが表示されますが、無視してください。
WARNING XML did not change after domain define. You may have changed a value that libvirt is setting by default.
7-8.仮想マシンc77g159の設定と起動:(9):前回記事と異なる
/tmp/sock-virtio1以外は、7-7と同様です。
(9) virsh edit c77g159 <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>
bashに戻った後、virt-xmlコマンドで以下の設定を実施します。
(9) virt-xml c77g159 --edit --qemu-commandline='-mem-prealloc' virt-xml c77g159 --edit --qemu-commandline='-chardev' virt-xml c77g159 --edit --qemu-commandline='socket,id=charnet2,path=/tmp/sock-virtio1' virt-xml c77g159 --edit --qemu-commandline='-netdev' virt-xml c77g159 --edit --qemu-commandline='vhost-user,chardev=charnet2,queues=16,id=hostnet2' virt-xml c77g159 --edit --qemu-commandline='-device' virt-xml c77g159 --edit --qemu-commandline='virtio-net-pci,mq=on,vectors=6,netdev=hostnet2,id=net1,mac=00:11:22:33:44:10,addr=0x7,page-per-vq=on,rx_queue_size=1024,tx_queue_size=1024'
8.動作確認:前回記事と異なる
8-1.事前準備
ホストOS c83g155で5つのコンソールを準備してください。
ConsoleA | 7-3で起動済み | dpdk-vdpaのログを参照するため。 |
ConsoleB | watch ovs-ofctl -O OpenFlow14 dump-ports br30-ovs | c77g153のパケットカウントを確認するため |
ConsoleC | watch ovs-ofctl -O OpenFlow14 dump-ports br31-ovs | c77g159のパケットカウントを確認するため |
ConsoleD | virsh start c77g153; virsh console c77g153 | 仮想マシンc77g153のコンソール用。 |
ConsoleE | virsh start c77g159; virsh console c77g159 | 仮想マシンc77g159のコンソール用。 |
8-2.VMの起動
ConsoleAは、7-3でdpdk-vdpaコマンドを実行した際、debugモードで起動しています。
ConsoleB, Cは、VMを起動する前に、上記のコマンドを実行しておいてください。
その後、ConsoleDでは上記のコマンドでc77g153を起動します。
数秒待ってから、ConsoleEでは上記のコマンドでc77g159を起動します。
c77g153 or c77g159からPingを飛ばしてください。
例として、fig.1に従い、c77g153から ping 192.168.30.159 -f を実行します。
fig.1
以下、出力結果です。注目する箇所は赤文字にしています。
ConsoleA
ConsoleAのログは一部抜粋となります。
全出力はこのリンクに保存しました。
vdpa> VHOST_CONFIG: new vhost user connection is 87 VHOST_CONFIG: new device, handle is 0 VHOST_CONFIG: read message VHOST_USER_GET_FEATURES VHOST_CONFIG: read message VHOST_USER_GET_PROTOCOL_FEATURES VHOST_CONFIG: read message VHOST_USER_SET_PROTOCOL_FEATURES ===================== s n i p ===================== VHOST_CONFIG: read message VHOST_USER_SET_FEATURES VHOST_CONFIG: negotiated Virtio features: 0x140601803 VHOST_CONFIG: read message VHOST_USER_SET_MEM_TABLE VHOST_CONFIG: guest memory region size: 0x80000000 guest physical addr: 0x0 guest virtual addr: 0x7faa40000000 host virtual addr: 0x7f8080000000 mmap addr : 0x7f8080000000 mmap size : 0x80000000 mmap align: 0x40000000 mmap off : 0x0 VHOST_CONFIG: guest memory region size: 0x80000000 guest physical addr: 0x100000000 guest virtual addr: 0x7faac0000000 host virtual addr: 0x7f8000000000 mmap addr : 0x7f7f80000000 mmap size : 0x100000000 mmap align: 0x40000000 mmap off : 0x80000000 VHOST_CONFIG: read message VHOST_USER_SET_VRING_NUM VHOST_CONFIG: read message VHOST_USER_SET_VRING_BASE ===================== s n i p ===================== new port /tmp/sock-virtio0, device : 0000:07:00.2 mlx5_vdpa: Cannot get vhost MTU - -95. mlx5_vdpa: MTU cannot be set on device 0000:07:00.2. mlx5_vdpa: Region 0: HVA 0x7f8080000000, GPA 0x0, size 0x80000000. mlx5_vdpa: Region 1: HVA 0x7f8000000000, GPA 0x100000000, size 0x80000000. mlx5_vdpa: Indirect mkey mode is KLM Fixed Buffer Size. mlx5_vdpa: Memory registration information: nregions = 2, mem_size = 0x180000000, GCD = 0x80000000, klm_fbs_entries_num = 0x3, klm_entries_num = 0x3. mlx5_vdpa: Dump fill Mkey = 1792. mlx5_vdpa: Registered error interrupt for device0. mlx5_vdpa: VAR address of doorbell mapping is 0x7f8157669000. mlx5_vdpa: vid 0: Init last_avail_idx=0, last_used_idx=0 for virtq 0. mlx5_vdpa: Register fd 123 interrupt for virtq 0. mlx5_vdpa: vid 0 virtq 0 was created successfully. mlx5_vdpa: Virtq 0 notifier state is enabled. mlx5_vdpa: Ring virtq 0 doorbell. mlx5_vdpa: vid 0: Init last_avail_idx=0, last_used_idx=0 for virtq 1. mlx5_vdpa: Register fd 89 interrupt for virtq 1. mlx5_vdpa: vid 0 virtq 1 was created successfully. mlx5_vdpa: Virtq 1 notifier state is enabled. mlx5_vdpa: Ring virtq 1 doorbell. mlx5_vdpa: vDPA device 0 was configured. VHOST_CONFIG: read message VHOST_USER_SET_VRING_CALL VHOST_CONFIG: vring call idx:1 file:127 mlx5_vdpa: Update virtq 1 status enable -> disable. mlx5_vdpa: vid 0 virtq 1 was stopped. mlx5_vdpa: Query vid 0 vring 1: hw_available_idx=0, hw_used_index=0 mlx5_vdpa: Update virtq 1 status disable -> enable. mlx5_vdpa: vid 0: Init last_avail_idx=0, last_used_idx=0 for virtq 1. mlx5_vdpa: Register fd 89 interrupt for virtq 1. mlx5_vdpa: vid 0 virtq 1 was created successfully. VHOST_CONFIG: read message VHOST_USER_SET_VRING_ENABLE VHOST_CONFIG: set queue enable: 1 to qp idx: 0 ===================== s n i p ===================== mlx5_vdpa: Update virtq 2 status disable -> enable. mlx5_vdpa: vid 0: Init last_avail_idx=0, last_used_idx=0 for virtq 2. mlx5_vdpa: Register fd 90 interrupt for virtq 2. mlx5_vdpa: vid 0 virtq 2 was created successfully. mlx5_vdpa: Virtq 2 notifier state is enabled. mlx5_vdpa: Ring virtq 2 doorbell. VHOST_CONFIG: read message VHOST_USER_SET_VRING_ENABLE VHOST_CONFIG: set queue enable: 1 to qp idx: 3 mlx5_vdpa: Update virtq 3 status disable -> enable. mlx5_vdpa: vid 0: Init last_avail_idx=0, last_used_idx=0 for virtq 3. mlx5_vdpa: Register fd 91 interrupt for virtq 3. mlx5_vdpa: vid 0 virtq 3 was created successfully. ===================== s n i p ===================== VHOST_CONFIG: read message VHOST_USER_SET_VRING_ENABLE VHOST_CONFIG: set queue enable: 0 to qp idx: 31 mlx5_vdpa: Virtq 3 notifier state is enabled. mlx5_vdpa: Ring virtq 3 doorbell. mlx5_vdpa: Device 0000:07:00.2 virtq 3 cq 2277 event was captured. Timer is off, cq ci is 1. mlx5_vdpa: Device 0000:07:00.2 virtq 1 cq 2270 event was captured. Timer is on, cq ci is 1. mlx5_vdpa: Device 0000:07:00.2 traffic was stopped. mlx5_vdpa: Device 0000:07:00.2 virtq 3 cq 2277 event was captured. Timer is off, cq ci is 18. mlx5_vdpa: Device 0000:07:00.2 traffic was stopped.
ConsoleB
[root@c83g155 ~]# ovs-ofctl -O OpenFlow14 dump-ports br30-ovs OFPST_PORT reply (OF1.4) (xid=0x2): 3 ports port ens2f0: rx pkts=159317, bytes=15614385, drop=0, errs=0, frame=?, over=?, crc=? tx pkts=159318, bytes=15614457, drop=0, errs=0, coll=? duration=173.964s rx rfc2819 broadcast_packets=2, tx rfc2819 multicast_packets=53, broadcast_packets=1, CUSTOM Statistics ovs_tx_failure_drops=0, ovs_tx_mtu_exceeded_drops=0, ovs_tx_qos_drops=0, ovs_rx_qos_drops=0, ovs_tx_invalid_hwol_drops=0, rx_missed_errors=0, rx_errors=0, tx_errors=0, rx_mbuf_allocation_errors=0, rx_q0_errors=0, rx_wqe_errors=0, rx_phy_crc_errors=0, rx_phy_in_range_len_errors=0, rx_phy_symbol_errors=0, tx_phy_errors=0, tx_pp_missed_interrupt_errors=0, tx_pp_rearm_queue_errors=0, tx_pp_clock_queue_errors=0, tx_pp_timestamp_past_errors=0, tx_pp_timestamp_future_errors=0, port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0 tx pkts=0, bytes=0, drop=54, errs=0, coll=0 duration=173.957s port "ens2f0_0": rx pkts=159318, bytes=15614457, drop=0, errs=0, frame=?, over=?, crc=? tx pkts=159317, bytes=15614385, drop=0, errs=0, coll=? duration=173.729s CUSTOM Statistics ovs_tx_failure_drops=0, ovs_tx_mtu_exceeded_drops=0, ovs_tx_qos_drops=0, ovs_rx_qos_drops=0, ovs_tx_invalid_hwol_drops=0, rx_missed_errors=0, rx_errors=0, tx_errors=0, rx_mbuf_allocation_errors=0, rx_q0_errors=0, tx_pp_missed_interrupt_errors=0, tx_pp_rearm_queue_errors=0, tx_pp_clock_queue_errors=0, tx_pp_timestamp_past_errors=0, tx_pp_timestamp_future_errors=0,
ConsoleC
[root@c83g155 ~]# ovs-ofctl -O OpenFlow14 dump-ports br31-ovs OFPST_PORT reply (OF1.4) (xid=0x2): 3 ports port ens2f1: rx pkts=159318, bytes=15614493, drop=0, errs=0, frame=?, over=?, crc=? tx pkts=159317, bytes=15614349, drop=0, errs=0, coll=? duration=180.549s rx rfc2819 broadcast_packets=2, tx rfc2819 multicast_packets=53, broadcast_packets=1, CUSTOM Statistics ovs_tx_failure_drops=0, ovs_tx_mtu_exceeded_drops=0, ovs_tx_qos_drops=0, ovs_rx_qos_drops=0, ovs_tx_invalid_hwol_drops=0, rx_missed_errors=0, rx_errors=0, tx_errors=0, rx_mbuf_allocation_errors=0, rx_q0_errors=0, rx_wqe_errors=0, rx_phy_crc_errors=0, rx_phy_in_range_len_errors=0, rx_phy_symbol_errors=0, tx_phy_errors=0, tx_pp_missed_interrupt_errors=0, tx_pp_rearm_queue_errors=0, tx_pp_clock_queue_errors=0, tx_pp_timestamp_past_errors=0, tx_pp_timestamp_future_errors=0, port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0 tx pkts=0, bytes=0, drop=54, errs=0, coll=0 duration=181.910s port "ens2f1_0": rx pkts=159317, bytes=15614349, drop=0, errs=0, frame=?, over=?, crc=? tx pkts=159318, bytes=15614493, drop=0, errs=0, coll=? duration=180.861s CUSTOM Statistics ovs_tx_failure_drops=0, ovs_tx_mtu_exceeded_drops=0, ovs_tx_qos_drops=0, ovs_rx_qos_drops=0, ovs_tx_invalid_hwol_drops=0, rx_missed_errors=0, rx_errors=0, tx_errors=0, rx_mbuf_allocation_errors=0, rx_q0_errors=0, tx_pp_missed_interrupt_errors=0, tx_pp_rearm_queue_errors=0, tx_pp_clock_queue_errors=0, tx_pp_timestamp_past_errors=0, tx_pp_timestamp_future_errors=0,
ConsoleD
[root@c77g153 ~]# ping 192.168.30.159 -f PING 192.168.30.159 (192.168.30.159) 56(84) bytes of data. . --- 192.168.30.159 ping statistics --- 159288 packets transmitted, 159288 received, 0% packet loss, time 24357ms rtt min/avg/max/mdev = 0.069/0.086/60.812/0.202 ms, pipe 5, ipg/ewma 0.152/0.101 ms
<補足>
mlx5_vdpa: Cannot get vhost MTU - -95. | MTUのメッセージが出力されますが、特に問題ありません。 |
mlx5_vdpa: vid 0 virtq 0 was created successfully. | virtqの作成が成功したことを示しています。 |
mlx5_vdpa: Device 0000:07:00.2 traffic was stopped. | 仮想マシン起動後、しばらくするとこのメッセージが表示されますが、トラフィックの送受信が停止されたという意味ではないため、特に問題ありません。 |
ens2f0 "ens2f0_0" | 各ポートのtx/rxのパケットカウントとバイトカウントが上昇していることが確認できます。 |
以上です。
9.最後に
以下のサイトを参考にさせて頂きました。
https://www.redhat.com/en/blog?search=vdpa
https://docs.mellanox.com/pages/viewpage.action?pageId=43718786
https://community.mellanox.com/s/article/Basic-Debug-utilities-with-OVS-DPDK-offload-ASAP-Direct
https://static.sched.com/hosted_files/dpdkuserspace2020/ab/vDPA%20-%20DPDK%20Userspace%202020.pdf
https://netdevconf.info/1.2/slides/oct6/04_gerlitz_efraim_introduction_to_switchdev_sriov_offloads.pdf
https://www.mail-archive.com/dev@dpdk.org/msg175938.html
https://www.spinics.net/lists/netdev/msg693858.html
http://yunazuno.hatenablog.com/entry/2018/07/08/215118
https://ameblo.jp/makototgc/entry-12579674054.html
https://www.jianshu.com/p/091b60ea72dc
https://doc.dpdk.org/guides/sample_app_ug/vdpa.html#build <-追記
次回は、番外編として、NICの調達方法やovs-dpdk以外の設定方法、課題となっている事などを記載する予定です。
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 DeflectionThis article |
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:MACアドレスの設定を実施しておかないと、VM起動後にVMがVFを認識しない事象を確認しました。
*3:coreやmodulesも同時にインストールされます
*4:蛇足ですが、bsf番号の前の「0000」は、Domain番号と呼ばれています。私が知る限りでは「0000」以外の値を見たことが無いため、あまり気にしなくてよいと思います。
*5:2-3.Mellanoxドライバ(OFED)のインストールで、インストール済みです。
*6:詳細は番外編で記載しますが、前回記事のvhost_vdpaの場合、virt-managerで仮想マシンを起動できましたが、通信ができませんでした。このため、vhost_vdpaではqemu-kvmから直接起動しています。
*7:これはqemuのビルド時にspiceなどの関連パッケージをインストールしていないため、これらのデバイスを削除しないと仮想マシンが起動できませんでした。なお、vDPAとは直接関係がないため、これらの対処方法については割愛します。