Virtio 通过硬件 vDPA 加速
硬件 vDPA 需要 QEMU v2.12(或上游 6.1.0 版本)和 DPDK v20.11 或更高版本。
安装 QEMU
克隆源代码
git clone https://git.qemu.org/git/qemu.git cd qemu git checkout v2.12
构建 QEMU
mkdir bin cd bin ../configure --target-list=x86_64-softmmu --enable-kvm make -j24
安装 DPDK
克隆源代码
git clone git://dpdk.org/dpdk cd dpdk git checkout v20.11
安装依赖项(如果需要)
yum install cmake gcc libnl3-devel libudev-devel make pkgconfig valgrind-devel pandoc libibverbs libmlx5 libmnl-devel -y
配置 DPDK
export RTE_SDK=$PWD make config T=x86_64-
native-linuxapp-gcc cd build sed -i's/\(CONFIG_RTE_LIBRTE_MLX5_PMD=\)n/\1y/g'.config sed -i's/\(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD=\)n/\1y/g'.config构建 DPDK
make -j
构建 vDPA 应用程序
cd $RTE_SDK/examples/vdpa/ make -j
配置巨页
mkdir -p /hugepages
mount -t hugetlbfs hugetlbfs /hugepages
echo <more> > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
echo <more> > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages
在现有虚拟机的 xml 文件中配置 vDPA VirtIO 接口(使用 libvirt)
打开虚拟机的配置 XML 文件进行编辑
virsh edit <domain name>
执行以下操作
将顶行更改为
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
分配内存量并为巨页使用 1GB 页面大小(大小必须与 vDPA 应用程序使用的大小相同),以便内存配置如下所示。
<memory unit=
'KiB'>4194304</memory> <currentMemory unit='KiB'>4194304</currentMemory> <memoryBacking> <hugepages> <page size='1048576'unit='KiB'/> </hugepages> </memoryBacking>为 VM CPU 配置分配 CPU 数量,以便
vcpu和cputune配置如下所示<vcpu placement=
'static'>5</vcpu> <cputune> <vcpupin vcpu='0'cpuset='14'/> <vcpupin vcpu='1'cpuset='16'/> <vcpupin vcpu='2'cpuset='18'/> <vcpupin vcpu='3'cpuset='20'/> <vcpupin vcpu='4'cpuset='22'/> </cputune>将 CPU 的内存访问设置为共享,以便
cpu配置如下所示<cpu mode=
'custom'match='exact'check='partial'> <model fallback='allow'>Skylake-Server-IBRS</model> <numa> <cell id='0'cpus='0-4'memory='8388608'unit='KiB'memAccess='shared'/> </numa> </cpu>将使用的模拟器设置为在步骤 2中构建的模拟器,以便模拟器配置如下所示
<emulator><path to qemu executable></emulator>
添加使用 QEMU 命令行参数条目的 virtio 接口,以便新的接口代码段如下所示
<qemu:commandline> <qemu:arg value=
'-chardev'/> <qemu:arg value='socket,id=charnet1,path=/tmp/sock-virtio0'/> <qemu:arg value='-netdev'/> <qemu:arg value='vhost-user,chardev=charnet1,queues=16,id=hostnet1'/> <qemu:arg value='-device'/> <qemu:arg value='virtio-net-pci,mq=on,vectors=6,netdev=hostnet1,id=net1,mac=e4:11:c6:d3:45:f2,bus=pci.0,addr=0x6, page-per-vq=on,rx_queue_size=1024,tx_queue_size=1024'/> </qemu:commandline>注意在此代码段中,可以配置 vhostuser 套接字文件路径、队列数量、MAC 和 virtio 设备的 PCIe 插槽。
硬件 vDPA 仅支持 switchdev 模式。
创建 ASAP2 环境
创建 VF。
进入 switchdev 模式。
设置 OVS。
运行 vDPA 应用程序
cd $RTE_SDK/examples/vdpa/build ./vdpa -w <VF PCI BDF>,
class=vdpa --log-level=pmd,info -- -i通过 vDPA 应用程序 CLI 创建 vDPA 端口
create /tmp/sock-virtio0 <PCI DEVICE BDF>
注意vhostuser 套接字文件路径必须是配置 VM 时使用的路径。
启动 VM
virsh start <domain name>
有关 vDPA 应用程序的更多信息,请访问 Vdpa 示例应用程序 DPDK 文档。