virtio,vhost 和vhost-user
随着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路径
- guest设置好tx;
- kick host;
- guest陷出到kvm;
- kvm从内核切换到用户态的qemu进程;
- qemu将tx数据投递到tap设备;。
vhost的io路径
- guest设置好tx;
- kick host;
- guest陷出到kvm;
- 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路径
- guest设置好tx;
- kick host;
- guest陷出到kvm;
- kvm将通知snabb;
- snabb将tx数据直接发送到nic设备。
vhost-user的提交者是Luke Gorrie,他也是snabbswitch的作者。从图上可以看到vhost-backend从原来咋kernel中的vhost-net 变成了用户空间的snabbswitch。 snabbswitch直接接管物理网卡的驱动,从而直接控制网络信息的输入输出。
snabbswitch主要使用了下面的技术来提高性能
- 采用了大页来作为host和vm之间通信的内存空间
- 用户态操作网卡,使用类似于netmap的zero copy技术来加速对物理设备的访问
- 使用numa技术,加快中断响应速率
值得一提的是使用snabbswitch后,不用再使用原来的tap设备模拟的网卡。
使用vhost-user技术,从虚拟机到host上实现了数据的zero copy(通过大页共享),host到nic的zero copy(snabbswitch实现的驱动),能进一步加快数据的传输。
版权属于: 云计算技术分享交流
原文地址: http://t.51gocloud.com/?p=402
virtio,vhost 和vhost-user的更多相关文章
- vhost:一种 virtio 高性能的后端驱动实现
什么是 vhost vhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通常, ...
- virtIO之VHOST工作原理简析
2017-07-19 一.前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据 ...
- RabbitMQ(2) vhost、用户和权限
rabbitmq中,vhost提供了资源隔离机制.同时,通过为用户设置vhost粒度的权限,可以实现丰富的权限控制功能. vhost 在rabbitmq中,可以创建被称为虚拟主机(vhost)的虚拟消 ...
- vhost in nodejs
关于vhost 个人理解为vhost是一种可以在一个ip下同时部署多个不同域名站点的的概念. 其好处就是对一些小型的网站不必每个网站都占用一个ip,或者说一个服务,举个例子,vhost的概念就相当于打 ...
- 阿里云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/ ...
- RabbitMQ入门教程(十三):虚拟主机vhost与权限管理
原文:RabbitMQ入门教程(十三):虚拟主机vhost与权限管理 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- virtio,macvtap,sriov
本文转自http://xiaoli110.blog.51cto.com/1724/1558984 一个完整的数据包从虚拟机到物理机的路径是: 虚拟机--QEMU虚拟网卡--虚拟化层--内核网桥--物理 ...
- [ovs][libvirt][virtio][qemu] vhost user client 排障
ovs-dpdk + qemu 使用vhostuserclient通信,连路不通,libvirt报错如下: -- ::: starting up libvirt version: , package: ...
- [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最高版本是 ...
随机推荐
- Java 8 Lambda 表达式详解
一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...
- js对象转成用&拼接的请求参数(转)
var parseParam=function(param, key){ var paramStr=""; if(param instanceof String||param in ...
- 模块 - json/pickle/shelve/xml/configparser
序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化: 有种办法可以直接把内存数据(eg:10个列表,3 ...
- python imageio 图片生成gif
#!/bin/python3 import matplotlib.pyplot as plt import imageio,os TIME_GAP=0.075 #两帧之间的时间间隔,秒为单位 FILE ...
- 洛谷 P4451 [国家集训队]整数的lqp拆分
洛谷 这个题目是黑题,本来想打表的,但是表调不出来(我逊毙了)! 然后随便打了一个递推,凑出了样例, 竟然. 竟然.. 竟然... A了!!!!!!! 直接:\(f[i]=f[i-1]*2+f[i-2 ...
- 前端html/css/script基础
1. 基础模板 <!DOCTYPE html> <html> <head> <meta charert="utf-8" /> < ...
- python内存泄露查找
1 前言: 1.1 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题 1.2 在Python程序里,内存泄漏是由于一个长期持有的对象不断的往一个dict或者l ...
- DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
- hibernate set的3个属性
inverse 属性 在hibernate中通过对 inverse 属性的来决定是由双向关联的哪一方来维护表和表之间的关系. inverse = false 的为主动方.inverse = true ...
- Android--Apache HttpClient(2种实现)
前言 上一篇文章介绍了使用HttpURLConnection来完成对于HTTP协议的支持,现在介绍一个新的方式来访问Web站点,那就是HttpClient. HttpClient是Apache开源组织 ...