目录
Vhost / Virtio简介
Vhost / virtio是一种半虚拟化的设备抽象接口规范,已广泛应用于QEMU *和基于内核的虚拟机(KVM)。当它在来宾操作系统中用作前端驱动程序时,通常称为virtio;当在主机中用作后端驱动程序时,则称为vhost。与在主机上进行纯软件输入/输出(I / O)仿真相比,virtio可以实现更好的性能,并广泛用于数据中心。Linux *内核提供了相应的设备驱动程序,分别是virtio-net和vhost-net。

为了帮助提高数据吞吐性能,数据平面开发套件(DPDK)提供了用户状态轮询模式驱动程序(PMD)virtio-pmd和用户状态实现vhost-user。

本文将介绍如何使用DPDK代码示例配置和使用vhost / virtio,testpmd。列出了每个虚拟主机/虚拟Rx / Tx路径的性能编号。


接收和发送路径
在DPDK的vhost / virtio中,为不同的用户场景提供了三个Rx(接收)和Tx(发送)路径。可合并路径是为大数据包Rx / Tx设计的,是纯I / O转发的向量路径,如果没有给出参数,则不可合并路径是默认路径。
可合并路径
使用此接收路径的优势在于,虚拟主机可以将可用环中的独立mbuf组织到一个链表中,以接收较大大小的数据包。这是最广泛采用的路径,也是最近几个月DPDK开发团队的性能优化重点。该路径使用的接收和发送功能配置如下:
eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
eth_dev->rx_pkt_burst = &virtio_recv_mergeable_pkts;
在虚拟主机和QEMU之间的连接协商期间,可以通过设置标志VIRTIO_NET_F_MRG_RXBUF来启动路径。虚拟主机用户默认情况下支持此功能,并且在QEMU中启用此功能的命令如下:
qemu-system-x86_64 -name vhost-vm1
…..-device virtio-net-pci,mac=52:54:00:00:00:01,netdev=mynet1,mrg_rxbuf=on \
……
DPDK将根据VIRTIO_NET_F_MRG_RXBUF标志选择相应的Rx功能 :
if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF))
eth_dev->rx_pkt_burst = &virtio_recv_mergeable_pkts;
else
eth_dev->rx_pkt_burst = &virtio_recv_pkts;
可合并路径与其他两个路径之间的区别在于,只要启用可合并,rte_eth_txconf-> txq_flags的值就不会受到影响。
向量路径
该路径利用处理器中的单个指令,多个数据(SIMD)指令来矢量化数据Rx / Tx动作。在纯I / O数据包转发方案中,它具有更好的性能。该路径的接收和发送功能如下:
eth_dev->tx_pkt_burst = virtio_xmit_pkts_simple;
eth_dev->rx_pkt_burst = virtio_recv_pkts_vec;
使用此路径的要求包括:
- 平台处理器应支持相应的指令集。x86平台应支持Streaming SIMD Extensions 3(SSE3),可以通过DPDK中的rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE3)进行检查。ARM *平台应支持NEON *,可以通过DPDK中的rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON)进行检查。
- Rx端的可合并路径应关闭,这可以通过DPDK中的功能进行检查。关闭此功能的命令如下:
qemu-system-x86_64 -name vhost-vm1 ….. -device virtio-net-pci,mac=52:54:00:00:00:01,netdev=mynet1,mrg_rxbuf=off \ ……
- 未启用“卸载”功能,包括VLAN卸载,SCTP校验和卸载,UDP校验和卸载以及TCP校验和卸载。
- rte_eth_txconf-> txq_flags需要设置为1。例如,在DPDK提供的testpmd示例中,我们可以使用以下命令在虚拟机中配置virtio设备:
testpmd -c 0x3 -n 4 -- -i --txqflags=0xf01
可以看出向量路径的功能是相对有限的,这就是为什么它没有成为DPDK性能优化的重点的原因。
不可合并的路径
不可合并的路径很少使用。这是它的接收和发送路径:
eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
eth_dev->rx_pkt_burst = &virtio_recv_pkts;
应用此路径需要以下配置:
- 沿Rx方向可合并关闭。
- rte_eth_txconf-> txq_flags需要设置为0。例如,在testpmd中,我们可以使用以下命令在虚拟机中配置virtio设备:
#testpmd -c 0x3 -n 4 -- -i --txqflags=0xf00
PVP路径性能比较
使用Physical-VM-Physical(PVP)测试比较了不同DPDK vhost / virtio接收和传输路径的性能。在此测试中,使用testpmd生成vhost-user端口,如下所示:
testpmd -c 0xc00 -n 4 --socket-mem 2048,2048 --vdev'eth_vhost0,iface = vhost-net,queues = 1'--i --nb-cores = 1
在VM中,testpmd用于控制virtio设备。测试方案如下图所示。主要目的是在虚拟化环境中测试南北数据转发功能。Ixia公司*流量发生器发送64字节的数据包发送到以太网卡以每秒10个千兆比特的线速度,testpmd在物理机调用虚拟主机用户来转发数据包到虚拟机,并且testpmd在虚拟机调用virtio-user将数据包发送回物理计算机,最后发送回Ixia。其发送路径如下:
IXIA→NIC port1→Vhost-user0→Virtio-user0→NIC port1→IXIA

I / O转发吞吐量
将DPDK 17.05与I / O转发配置一起使用,不同路径的性能如下:

在纯I / O转发的情况下,矢量路径具有最佳吞吐量,比可合并的吞吐量高出近15%。
Mac转发吞吐量
在MAC转发配置下,不同路径的转发性能如下:

在这种情况下,这三个路径的性能几乎相同。我们建议使用可合并路径,因为它提供了更多功能。
PVP MAC转发吞吐量
下图显示了从DPDK 16.07开始在x86平台上PVP MAC的转发性能趋势。由于可合并路径的应用场景更广,DPDK工程师从那时开始对其进行了优化,并且PVP的性能在此路径上提高了近20%。

注意:DPDK 16.11的性能下降主要是由于添加的新功能(例如vhost xstats和间接描述符表)带来的开销。
测试台信息
CPU:英特尔®至强®CPU E5-2680 v2 @ 2.80GHz
操作系统:Ubuntu 16.04
关于作者
姚雷是英特尔的软件工程师。他主要负责与DPDK虚拟化测试相关的工作。
告示
性能测试中使用的软件和工作负载可能仅针对英特尔微处理器的性能进行了优化。性能测试(例如SYSmark *和MobileMark *)是使用特定的计算机系统,组件,软件,操作和功能进行测量的。任何这些因素的任何变化都可能导致结果变化。您应该查阅其他信息和性能测试,以帮助您全面评估您的预期购买,包括该产品与其他产品组合时的性能。
欲了解更多信息,请访问HTTP :// www.intel.com/performance。
英特尔技术的功能和优势取决于系统配置,并且可能需要启用硬件,软件或服务才能激活。性能因系统配置而异。请与您的系统制造商或零售商联系,或在intel.com上了解更多信息。
相关阅读
《Linux虚拟化KVM-Qemu分析(八)之virtio初探》
《Linux虚拟化KVM-Qemu分析(九)之virtio设备》
《使用DPDK打开Open vSwitch(OvS) *概述》
《《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)》
《virtio 网络的演化:原始virtio > vhost-net(内核态) > vhost-user(DPDK) > vDPA》