什么是Vhost/Virtio

Vhost/Virtio是一种半虚拟化的设备抽象接口规范, 在Qemu和KVM中的得到了广泛的应用,在客户机操作系统中实现的前端驱动程序一般直接叫Virtio, 在宿主机实现的后端驱动程序称为Vhost。与宿主机纯软件模拟I/O相比,virtio可以获得很好的性能,在数据中心中得到了广泛的应用。Linux kernel中已经提供了相应的设备驱动,分别是virtio-net,以及vhost-net,DPDK项目为了提高数据吞吐性能,相对应的,提供了Virtio的用户态驱动virtio-pmd 和vhost的用户态实现Vhost-user,下图是一张典型的Virtio使用场景图。

Vhost/Virtio 在DPDK中收发路径配置

在DPDK的vhost/virtio 中,提供不同的Rx、Tx路径供用户使用,根据场景的不同,用户可以根据自己的功能以及性能需求,来挑选合适的路径。DPDK中,提供3条Tx、Rx路径。

Mergeable 路径

选择 Mergeable接收路径的优势在于,vhost可以将available ring中独立的mbuf组成链表来接收体量更大的数据包 。在实际应用中,这是被采用最多的路径,也是DPDK开发团队在过去几个月中,性能优化的重点方向。该路径采用的收发函数配置如下:

 
1
2
eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
eth_dev->rx_pkt_burst = &virtio_recv_mergeable_pkts;

如想使用该路径, 需要在Vhost 和Qemu连接协商的过程中,通过VIRTIO_NET_F_MRG_RXBUF功能标志位来协商启动。Vhost-user默认支持该功能,Qemu中启用该功能的命令如下所示:

 
1
2
3
4
qemu-system-x86_64 -name vhost-vm1
…..
-device virtio-net-pci,mac=52:54:00:00:00:01,netdev=mynet1,mrg_rxbuf=on \
……

DPDK 会根据这个功能标志位,来选择相应的rx函数:

 
1
2
3
4
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;

不同于Vector和No-mergeable路径,rte_eth_txconf->txq_flags的值在Mergeable打开的情况下,并不会影响tx函数。

Vector

该路径利用处理器中的SIMD指令集,对数据的收发进行向量化处理,在纯IO数据包转发使用场景中,能够获得最高的性能。在DPDK中,该路径使用的收发函数如下:

 
1
2
eth_dev->tx_pkt_burst = virtio_xmit_pkts_simple;
eth_dev->rx_pkt_burst = virtio_recv_pkts_vec;

如想使用此收发路径,需要符合以下条件:
1) 平台处理器支持相应指令集, X86平台需要支持SSE3,DPDK中通过rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE3) 进行检查,ARM平台需要支持NEON,DPDK中通过rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON)检查。
2) RX方向的Mergeable需要关闭。DPDK会通过以下函数检查:

 
1
!vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)

Qemu中关闭该功能命令如下:

 
1
2
3
4
qemu-system-x86_64 -name vhost-vm1
…..
-device virtio-net-pci,mac=52:54:00:00:00:01,netdev=mynet1,mrg_rxbuf=off \
……

3) Offload 功能没有被启用。包括:VLAN offload, SCTP checksum offload, UDP checksum offload, TCP checksum offload。
4) rte_eth_txconf->txq_flags 需要设置为1。 例如,在DPDK提供的testpmd程序中,可以在虚拟机中通过类似如下命令进行配置Virtio设备:

 
1
#testpmd -c 0x3 -n 4 -- -i --txqflags=0xf01

从以上条件可以看出,Vector路径的功能相对有限,因而并没有成为DPDK 性能优化的重点方向。

No-mergeable 路径

No-mergeable路径在现实中较少使用,其收发路径如下:

 
1
2
eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
eth_dev->rx_pkt_burst = &virtio_recv_pkts

如想使用该路径,需要符合如下配置:
1) RX方向Mergeable关闭

 
1
!vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)

2) rte_eth_txconf->txq_flags需要设置为0,例如, 在DPDK提供的testpmd程序中,可以在虚拟机中通过类似如下命令进行配置Virtio 设备:

 
1
#testpmd -c 0x3 -n 4 -- -i --txqflags=0xf00

Vhost/Virtio 各路径PVP性能比较

在这部分,我们将比较一下DPDK 中vhost/virtio各收发路径 在PVP测试下的表现。PVP测试场景如下图所示,主要测试的是虚拟化环境中南北向的数据转发能力。Ixia发包器以10Gbps线速将64B数据包发送给网卡,物理机中的testpmd调用Vhost-User将数据转发进虚拟机中,虚拟机中的testpmd调用virtio-user将接收到数据转发回物理机,最终数据包回到IXIA, 数据路径为:

 
1
IXIA→NIC port1→Vhost-user0→Virtio-user0→NIC port1→IXIA

以DPDK 17.05 为例,在IO 转发配置下,不同路径的转发性能比较如下(以Mergeable为基准):

可以看到,在纯IO转发的情况下,Vector具有最好的吞吐量,比Mergeable高出了近15%。
在MAC转发配置下,不同路径的转发性能比较如下(以Mergeable为基准):

在MAC转发的情况下,3个收发路径的性能基本相同,因为Mergeable路径可以提供更多的功能,我们推荐在此情况下,使用Mergeable 路径。
下图,是在X86平台上,DPDK16.07以来的各个版本PVP MAC转发的性能趋势,可以看到,因为Mergeable路径具有更广泛的应用场景,自16.07以来,DPDK的工程师针对Mergeable 路径,进行了很多的优化工作,此路径的PVP性能已经提升了将近20%。

Note:* 在DPDK16.11的性能下降,主要是由于添加新功能带来的性能开销,例如Vhost Xstats,Indirect descriptor table等

原文:DPDK开源社区

探秘DPDK Virtio的不同路径的更多相关文章

  1. DPDK在OpenStack中的实现

    随着云计算与大数据的快速发展,其对数据中心网络的性能和管理提出了更高的要求,但传统云计算架构存在多个I/O瓶颈,由于云平台基本上是采用传统的X86服务器加上虚拟化方式组建,随着40G.100G高速网卡 ...

  2. 基于DPDK的高效包处理系统

    一.概念 Intel® DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用 ...

  3. virtio,vhost 和vhost-user

    随着qemu2.1的发布,可以看到,qemu支持了vhost-user.从介绍可以看出,这是把原来vhost-backend从kernel移到了userspace,这和原来virtio架构有什么区别呢 ...

  4. VNF网络性能提升解决方案及实践

    VNF网络性能提升解决方案及实践 2016年7月 作者:    王智民 贡献者:     创建时间:    2016-7-20 稳定程度:    初稿 修改历史 版本 日期 修订人 说明 1.0 20 ...

  5. JSP相对路径与绝对路径探秘

    浏览器端 带杠的 一开始浏览器的地址http://localhost:8080/example/index.jsp 如果写成 <a href="/servlet/TestDBSvl&q ...

  6. 探秘神奇的运动路径动画 Motion Path

    CSS 中有一个非常有意思的模块 -- CSS Motion Path Module Level 1,翻译过来也就是运动路径.本文将对 motion path 一探究竟,通过本文,你可以了解到: 什么 ...

  7. DPDK virtio-user

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. virtio-user 是 DPDK 针对特定场景提出的一种解决方案, ...

  8. DPDK之(八)——vhost库

    转:http://www.cnblogs.com/danxi/p/6652725.html vhost库实现了一个用户空间的virtio net server,允许用户直接处理virtio ring队 ...

  9. DPDK vhost库

    原创翻译,转载请注明出处. vhost库实现了一个用户空间的virtio net server,允许用户直接处理virtio ring队列.换句话说,它让用户可以从VM virtio网络设备读取或写入 ...

随机推荐

  1. Java版斯诺克开源分享

    Java版斯诺克开源分享 这个小程序是我平时无聊写着玩的,在网盘里躺了好久了,今天就把它拿出来跟大家分享一下,下面是游戏截图: 请不要吐槽这个界面,斯诺克的球台是我从qq游戏里面截取的... 下面是源 ...

  2. 《挑战程序设计竞赛》2.3 动态规划-基础 POJ3176 2229 2385 3616 3280

    POJ3176 Cow Bowling 题意 输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线. 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个 ...

  3. easyui的datagrid无数据时下方滚动条不显示的解决办法(标题栏显示不完全)

    easyui在写datagrid的时候标题栏有时候因为太多.太长所以无法显示所有的列,而且没数据的时候下方的滚动条是不显示的,这样就无法显示所有的列了.解决办法如下: onLoadSuccess: f ...

  4. flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array

    mkdir /data/UnifiedLog/; cd /data/UnifiedLog/; wget http://mirror.bit.edu.cn/apache/flume/1.8.0/apac ...

  5. java 集合类复习(未完结)

    JAVA常用数据结构及原理分析(面试总结) https://blog.csdn.net/qq_29631809/article/details/72599708 java 中几种常用数据结构   ht ...

  6. 4.Data Types in the mongo Shell-官方文档摘录

    总结: 1.MongoDB 的BSON格式支持额外的数据类型 2 Date 对象内部存储64位字节存整数,存储使用NumberLong()这个类来存,使用NumberInt()存32位整数,128位十 ...

  7. Linux学习笔记(5)磁盘分区(parted)

    Linux学习笔记(5)磁盘分区(parted) .演示: ()parted /dev/sdb :进入parted 分区命令(可以使用help来查看命令详细描述)(2)p :列出当前磁盘分区信息,可以 ...

  8. django Form表单的使用

    Form django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form ...

  9. React官网首页demo(单文件实现版)

    本博客实现React官网首页上展示的demo, 为了方便直接采用单文件的形式, 如果想完整集成 在自己的项目中, 可以参考React官网的安装指南, 安装Create React App. hello ...

  10. Java io流详解二

    原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...