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 文档。