官方文档查看地址:
http://doc.dpdk.org/guides/sample_app_ug/vhost.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-sample-applications-user-guide.html
本篇难度系数:
翻译:☆☆☆☆☆
理解:★★☆☆☆
35.Vhost示例应用程序
vhost示例应用程序通过实现vhost-net offload
API演示了数据平面开发工具包(DPDK)与Linux* KVM管理程序的集成。示例应用程序基于媒体访问控制(MAC)地址或虚拟局域网(VLAN)标记在虚拟机之间执行简单的分组交换。通过Intel®82599 10千兆以太网控制器的虚拟机设备队列(VMDQ)和数据中心桥接(DCB)功能,可以在硬件中实现以太网流量与外部交换机的分离。
35.1测试步骤
本节展示了如何使用这个vhost-switch示例测试典型的PVP情况,而数据包首先从物理NIC端口接收,然后排队到VM的Rx队列。通过guest testpmd的默认转发模式(io forward),这些包将被放入Tx队列。然后,vhost-switch示例获取数据包并将其放回相同的物理NIC端口。
35.1.1。构建
要编译示例应用程序,请参见 Compiling the Sample Applications http://doc.dpdk.org/guides/sample_app_ug/compiling.html。
应用程序位于vhost子目录中。
请注意
在本例中,您需要在主机和内部guest上构建DPDK。
35.1.2启动vswitch示例
./vhost-switch -l 0-3 -n 4 --socket-mem 1024 \
-- --socket-file /tmp/sock0 --client \
...
检查Parameters部分,了解这些参数的含义。
35.1.3启动虚拟机
qemu-system-x86_64 -machine accel=kvm -cpu host \
-m $mem -object memory-backend-file,id=mem,size=$mem,mem-path=/dev/hugepages,share=on \
-mem-prealloc -numa node,memdev=mem \
\
-chardev socket,id=char1,path=/tmp/sock0,server \
-netdev type=vhost-user,id=hostnet1,chardev=char1 \
-device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:00:00:14 \
...
请注意
对于基本的vhost-user支持,需要QEMU 2.2(或更高)。对于某些特定功能,可能需要更高的版本。例如QEMU 2.7(或以上)用于重新连接功能。
35.1.4在guest内部运行testpmd
确保在客户端内部构建了DPDK。还要确保相应的virtio-net PCI设备与uio驱动程序绑定,可以通过:
modprobe uio_pci_generic
$RTE_SDK/usertools/dpdk-devbind.py -b uio_pci_generic 0000:00:04.0
然后启动testpmd进行包转发测试。
./x86_64-native-gcc/app/testpmd -l 0-1 -- -i
> start tx_first
35.2注射包
当一个virtio-net连接到vhost-switch时,一个从1000开始的VLAN标记被分配给它。因此,请确保使用正确的MAC和VLAN标记配置包生成器,您应该能够从vhost-switch控制台看到以下日志。这意味着你得到了工作:
VHOST_DATA: (0) mac 52:54:00:00:00:14 and vlan 1000 registered
35.3参数
–socket-file path
指定vhost-user套接字文件路径。
-client
DPDK vhost-user将在提供该选项时作为client模式。在客户端模式下,QEMU将创建套接字文件。否则,DPDK将创建它。简单地说,它是创建套接字文件的服务器。
–vm2vm mode
vm2vm参数设置主机中客户机之间数据包交换的模式。
- 0禁用vm2vm,这意味着VM的包总是去NIC端口。
- 1表示正常的mac查找包路由。
- 2是指硬件模式的数据包在客户端之间转发,它允许数据包到达NIC端口,硬件L2交换机根据数据包的目的MAC地址和VLAN标签来决定数据包应该转发给哪个客户端或者需要发送给外部客户端。
–mergeable 0|1
0/1禁用/启用可合并Rx功能。默认情况下是禁用的。
–stats interval
stats参数控制virtio-net设备统计信息的打印。参数指定一个间隔(以秒为单位)来打印统计信息,间隔为0秒禁用统计信息。
–rx-retry 0|1
当guest Rx队列已满时,Rx重试选项启用/禁用排队重试。该特性允许数据包延迟并在接收路径中重试,从而解决了在高数据速率下观察到的数据包丢失问题。默认情况下启用此选项。
–rx-retry-num num
Rx -retry-num选项指定Rx突发事件上的重试次数,仅当启用Rx重试时才生效。默认值是4。
–rx-retry-delay msec
RX -retry-delay选项指定RX突发事件重试之间的超时(以微秒为单位),只有在启用RX重试时才会生效。默认值是15。
–dequeue-zero-copy
当提供此选项时,将启用Dequeue zero copy。值得注意的是,如果将NIC绑定到启用了iommu的驱动程序,dequeue zero copy将不能在VM2NIC模式下工作(vm2vm=0),因为目前我们没有为客户内存设置iommu dma映射。
–vlan-strip 0|1
移除VLAN strip选项,因为不同的nic在禁用VLAN strip时具有不同的行为。这种严重依赖于硬件的特性应该从本例中删除,以减少混淆。现在,VLAN条带已启用,不能禁用。
–builtin-net-driver
当提供此选项时,将使用一个非常简单的vhost-user网络驱动程序,它演示了如何使用通用的vhost api。默认情况下是禁用的。
35.4常见问题
- QEMU无法在hugetlbfs上分配内存,错误如下:
file_ram_alloc: can't mmap RAM pages: Cannot allocate memory
运行QEMU时,上面的错误表明它未能在hugetlbfs上为虚拟机分配内存。这通常是由于没有足够的大页可用来支持分配请求。免费hugepages的数量可以检查如下:
cat /sys/kernel/mm/hugepages/hugepages-<pagesize>/nr_hugepages
上面的命令指示有多少hugepage可以自由地支持QEMU的分配请求。
-
在VM中构建DPDK失败
确保提供了“-cpu host”QEMU选项。 -
如果NIC的最大队列>是默认的128,则设备启动失败
mbuf池大小取决于MAX_QUEUES配置,如果NIC的最大队列号大于128,设备启动将由于mbuf不足而失败。
更改默认数字使其工作如下,只需根据NIC的属性设置该数字。
make EXTRA_CFLAGS="-DMAX_QUEUES=320"
- 选项“
builtin-net-driver
”与QEMU不兼容
如果不协商协议特性,QEMU vhost网络设备启动将失败。DPDK virtio-user pmd可以替代QEMU。