随着qemu2.1的发布,可以看到,qemu支持了vhost-user。从介绍可以看出,这是把原来vhost-backend从kernel移到了userspace,这和原来virtio架构有什么区别呢?并且这个特性带来了怎样的改进?

virtio

在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的模拟网卡是非常一个不错的选择。

但是,e1000网卡上也包含了复杂的io端口,寄存器,缓存配置,虚拟机每次收发包都会引起更多的io和mmio操作,使得虚拟机频繁的陷出,最终导致网络性能不佳。

为了解决性能问题,IBM在2005年提出了virtio, 虚拟机中的半虚拟化前端驱动和主机上的后端服务简单的使用virtqueue共享队列交换数据,大幅的减少了e1000模拟时复杂的io操作,从而可以较大程度的提升虚拟网络性能。

virtio是qemu的半虚拟化驱动,guest使用virtio driver将请求发送给virtio-backend。

+---------+------+--------+----------+--+
| +------+ +----------+ |
| user | | | | |
| space | | | guest | |
| | | | | |
| +----+ qemu | | +-+------+ |
| | | | | | virtio | |
| | | | | | driver | |
| | +------+ +-+---++---+ |
| | | |
| | ^ | |
| v | v |
| | |
+-+-----+-----------------+--+-------+--+
| |tap | +------------+ kvm.ko | |
| +-----+ +--+-------+ |
| kernel |
+---------------------------------------+

图中描述了的io路径:guest发出中断信号退出kvm,从kvm退出到用户空间的qemu进程。然后由qemu开始对tap设备进行读写。 可以看到这里从用户态进入内核,再从内核切换到用户态,进行了2次切换。

vhost

vhost技术对virtio-net进行了优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以再内核态得到处理。

+---------+------+--------+----------+--+
| +------+ +----------+ |
| user | | | | |
| space | | | guest | |
| | | | | |
| | qemu | | +-+------+ |
| | | | | virtio | |
| | | | | driver | |
| +------+ +-+---++---+ |
| | |
| | |
| v |
| |
+-+-----+---+-+----+------+----+--+-----+
| |tap | | vhost-net.ko| | kvm.ko |
| +---^-+ +------+----^-+ +----+---+
| |-------| kernel |-----------| |
+---------------------------------------+

图中描述了的io路径:guest发出中断信号退出kvm,kvm直接和vhost-net.ko通信,然后由vhost-net.ko访问tap设备。 这样网络数据只需要经过从用户态到内核态的一次切换,就可以完成数据的传输。大大提高了虚拟网卡的性能。 由于这个技术中vhost-backend在内核中,所以也被叫做vhost-kernel。

virtio的io路径

  1. guest设置好tx;
  2. kick host;
  3. guest陷出到kvm;
  4. kvm从内核切换到用户态的qemu进程;
  5. qemu将tx数据投递到tap设备;。

vhost的io路径

  1. guest设置好tx;
  2. kick host;
  3. guest陷出到kvm;
  4. vhost-net将tx数据投递到tap设备;

vhost-user

随着技术的发展,将网络数据放入用户态处理将可以得到更灵活的形式。在原有的vhost架构中,进行了改动,增加了 一种新的vhost-backend,叫做vhost-user。

+---------------+------+--+----------+--+
| +------+ +----------+ |
| user | | | | |
| space | | | guest | |
| | | | | |
| +-+-------+ | qemu | | +-+------+ |
| | vhost | | | | | virtio | |
| | backend | | | | | driver | |
| +---------+ +------+ +-+---++---+ |
| | |
| ^ | |
| | v |
| | |
+------------------------------+--+-----+
| +-----------------------+ kvm.ko |
| +--+-----+
| kernel |
+---------------------------------------+

图中描述了的io路径:guest发出中断信号退出kvm,kvm直接和vhost-backend通信,然后网络数据将交由vhost-backend 进行处理。 从图中可以看出这个技术,依然是需要从用户态退出到内核,再由内核退出到用户态,这样的技术和virtio-backend有 什么区别呢?

vhost-user的io路径

  1. guest设置好tx;
  2. kick host;
  3. guest陷出到kvm;
  4. kvm将通知snabb;
  5. snabb将tx数据直接发送到nic设备。

vhost-user的提交者是Luke Gorrie,他也是snabbswitch的作者。从图上可以看到vhost-backend从原来咋kernel中的vhost-net 变成了用户空间的snabbswitch。 snabbswitch直接接管物理网卡的驱动,从而直接控制网络信息的输入输出。

snabbswitch主要使用了下面的技术来提高性能

  1. 采用了大页来作为host和vm之间通信的内存空间
  2. 用户态操作网卡,使用类似于netmap的zero copy技术来加速对物理设备的访问
  3. 使用numa技术,加快中断响应速率

值得一提的是使用snabbswitch后,不用再使用原来的tap设备模拟的网卡。

使用vhost-user技术,从虚拟机到host上实现了数据的zero copy(通过大页共享),host到nic的zero copy(snabbswitch实现的驱动),能进一步加快数据的传输。

版权属于: 云计算技术分享交流

原文地址: http://t.51gocloud.com/?p=402

virtio,vhost 和vhost-user的更多相关文章

  1. vhost:一种 virtio 高性能的后端驱动实现

    什么是 vhost vhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通常, ...

  2. virtIO之VHOST工作原理简析

    2017-07-19 一.前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据 ...

  3. RabbitMQ(2) vhost、用户和权限

    rabbitmq中,vhost提供了资源隔离机制.同时,通过为用户设置vhost粒度的权限,可以实现丰富的权限控制功能. vhost 在rabbitmq中,可以创建被称为虚拟主机(vhost)的虚拟消 ...

  4. vhost in nodejs

    关于vhost 个人理解为vhost是一种可以在一个ip下同时部署多个不同域名站点的的概念. 其好处就是对一些小型的网站不必每个网站都占用一个ip,或者说一个服务,举个例子,vhost的概念就相当于打 ...

  5. 阿里云centOS7.4 nginx: [emerg] "server" directive is not allowed here in /etc/nginx/vhost/xxxxxx.conf:2

    里云centOS7.4配置多个站点遇到的问题nginx: [emerg] "server" directive is not allowed here in /etc/nginx/ ...

  6. RabbitMQ入门教程(十三):虚拟主机vhost与权限管理

    原文:RabbitMQ入门教程(十三):虚拟主机vhost与权限管理 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  7. virtio,macvtap,sriov

    本文转自http://xiaoli110.blog.51cto.com/1724/1558984 一个完整的数据包从虚拟机到物理机的路径是: 虚拟机--QEMU虚拟网卡--虚拟化层--内核网桥--物理 ...

  8. [ovs][libvirt][virtio][qemu] vhost user client 排障

    ovs-dpdk + qemu 使用vhostuserclient通信,连路不通,libvirt报错如下: -- ::: starting up libvirt version: , package: ...

  9. [qemu][cloud][centos][ovs][sdn] centos7安装高版本的qemu 以及 virtio/vhost/vhost-user咋回事

    因为要搭建ovs-dpdk,所以需要vhost-user的qemu centos默认的qemu与qemu-kvm都不支持vhost-user,qemu最高版本是2.0.0, qemu-kvm最高版本是 ...

随机推荐

  1. Android 界面滑动卡顿分析与解决方案(入门)

    Android 界面滑动卡顿分析与解决方案(入门) 导致Android界面滑动卡顿主要有两个原因: 1.UI线程(main)有耗时操作 2.视图渲染时间过长,导致卡顿 目前只讲第1点,第二点相对比较复 ...

  2. Java基础系列(八)序列化与反序列化

    先来看两个例子 示例一:将对象保存成字节数组,再把对象的字节数组还原为对象 示例中用到的Bean package com.huawei.beans; import java.io.Serializab ...

  3. 百度 验证码识别API 使用

    先到百度云申请文字识别API ,会给你一个API KEY和一个SECRET KEY,免费,一天最多500次请求. try: temp_url = 'https://aip.baidubce.com/o ...

  4. 对比MySQL,你究竟在什么时候更需要MongoDB(转)

    译文:对比MySQL,你究竟在什么时候更需要MongoDB 原文链接: When Should I Use MongoDB rather than MySQL (or other RDBMS): Th ...

  5. Python知识点复习之__call__

    一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用.能不能直接在实例本身上调用呢?在Python中,答案是肯定的. 任何类,只需要定义一个__ca ...

  6. 小木虫emuch遭封禁,新域名muchong.com尚可用

    各位虫友: 因为小木虫站点个别虫子违反论坛规定,擅自上传了政治擦边的违规资源.导致小木虫域名 emuch.net 被通信局封禁! 我们第一时间对违规资源进行了删除处理,接下来.我们也将大批量的对站内的 ...

  7. Java线程安全和非线程安全

    ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,StringBuffer是线程安全的 ...

  8. 安装SQL2012

    1. 优先安装软件 1. net framework3.5. 2. 在安装SQL SERVER 2012前需要3.5的支持.在WIN 2012系统可以在系统管理的添加角色和功能中安装,如下将[.NET ...

  9. Linux查看系统信息及系统性能检测命令

    查看系统信息: ~# uname -a (Linux查看版本当前操作系统内核信息)Linux iZ23onhpqvwZ 3.13.0-30-generic #54-Ubuntu SMP Mon Jun ...

  10. beego——原生SQL查询

    使用Raw SQL查询,无需使用ORM表定义. 多数据库,都可直接使用占位符号?,自动转换. 查询时的参数,支持使用Model Struct和Slice,Array ids := []int{1, 2 ...