virtio

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

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

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


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

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

virtio的io路径:

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

vhost

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

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

vhost的io路径:

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

vhost将部分virio驱动的操作从用户态移到内核态,减少了用户态/内核态切换时间和包的拷贝次数,从而更进一步的提升了性能。

vhost-user

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

图中描述了的io路径:guest发出中断信号退出kvm,kvm直接和vhost-backend通信,然后网络数据将交由vhost-backend 进行处理。

vhost-user的io路径

  1. guest设置好tx;
  2. kick host;
  3. guest陷出到kvm;
  4. kvm将通知vhost-backend;
  5. vhost-backend将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实现的驱动),能进一步加快数据的传输。

DPDK便是一个在用户态可以直接操作物理网卡的库函数,它和vhost-user结合便可以实现类似于snabb switch一样性能强劲的用户态交换机了。

原文链接:https://blog.csdn.net/qq_15437629/article/details/77899905?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase

KVM中virtio、vhost 和vhost-user比较(十一)相关推荐

  1. KVM中virtio实现(九)

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

  2. KVM中Virtio网络的演化之路

    作为一个开放的标准接口,virtio一直在云计算与虚拟化中扮演着重要的角色.而virtio网络接口,作为virtio标准支持下最复杂的接口之一,在虚拟机/容器网络加速.混合云加速中一直扮演着重要角色. ...

  3. KVM中virtio之vring(十)

    1.数据结构图的左半部分描述了virtio-blk设备与virtio设备的关系,virtqueue与vring_virtqueue的关系,如下: virtio-blk是一个virtio设备,它看到的队 ...

  4. KVM中virtio之vring(八)

    1 virtio原理 拿网络驱动部分做案例,网络驱动virtio-net有两个队列:接收队列和发送队列:每个队列都对应一个virtqueue,两个队列之间是互不影响的. 前后端利用virtqueue的 ...

  5. KVM中vhost-user简介(十三)

    什么是 vhost-user 在 vhost 的方案中,由于 vhost 实现在内核中,guest 与 vhost 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到 ...

  6. KVM中I/O虚拟化介绍(五)

    I/O虚拟化包括管理虚拟设备和共享的物理硬件之间I/O请求的路由选择.目前,实现I/O虚拟化有三种方式:I/O全虚拟化.I/O半虚拟化和I/O透传. 全虚拟化:宿主机截获客户机对I/O设备的访问请求, ...

  7. KVM中ioeventfd创建与触发的大致流程(十四)

    在使用virtio-blk的情况时,virtio notify使用的ioeventfd机制,原因是为了提高性能,能够较快速的回到guest中运行.具体是如何建立这个ioeventfd的呢?流程理出来了 ...

  8. 计算机io工作方式,QEMU/KVM和VirtIO工作模式

    https://blog.csdn.net/shengxia1999/article/details/52244119 KVM:Kernel-Based Virtual Machine 基于内核的虚拟 ...

  9. rhel6.1 kvm安装virtio驱动

    KVM: 安装Windows virtio半虚拟化驱动 Install KVM Windows virtio para-virtualized dirver 测试环境: 物理机: RHEL 6.1. ...

最新文章

  1. 关于 Head First SQL 中文版
  2. 微软云创益大赛获奖团队风采:做一个中国特色的.Net源代码社区
  3. Python 字符串方法详解
  4. php做游戏登录服务器,游戏登陆服务器php简单实现
  5. (王道408考研操作系统)第三章内存管理-第一节6-2:非连续分配管理方式之基本分页存储管理之基本地址变换机构
  6. 收藏 | 机器学习中常用的5种回归损失函数
  7. 腾讯:向今日头条开炮,只为1块钱和一声道歉!
  8. 今日头条下拉词框怎么做的呢?怎么优化推广呢?
  9. java 处理unicode_java处理unicode字符
  10. mongodb java 不等于_mongoDB在java上面的应用
  11. 程序员必备的10个B站优质UP主!
  12. 计算机飞行模式无法关闭,Win10开启飞行模式之后无法关闭退出怎么解决
  13. linux用gzip文件,Linux中的Gzip命令
  14. pytorch detach用法
  15. 是时候展示真正的云存储黑科技了!
  16. Eigen的LLT分解
  17. 全国计算机技术与软件专业技术资格(水平)考试2019年上半年考试公告(湖北省)
  18. windows系统:Xshell下载安装+连接服务器
  19. 前端vs图片 3 jpg、png、gif 图片老三样系统总结
  20. YOLOv4论文解读

热门文章

  1. python学费多少-python培训学费是多少?
  2. python面向对象编程的优点-Python入门之面向对象编程(一)面向对象概念及优点
  3. python3.5怎么安装pip-python3.5版本安装pip3
  4. python解释器是什么-python-解释器在这里做什么
  5. python基础语法手册format-Python基础语法-格式化输出
  6. python免费试听-哪家培训可以免费试听Python课程?专注16年IT培训
  7. python入门需要多久-目前Python学习需要多长时间?老男孩Python入门培训
  8. winston日志框架
  9. LeetCode Remove Duplicates from Sorted List II
  10. 时间与字符串之间的转换