一、什么是 vhost

vhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通常,virtio 主机端的驱动是实现在用户空间的 qemu 中,而 vhost 是实现在内核中,是内核的一个模块 vhost-net.ko。为什么要实现在内核中,有什么好处呢,请接着往下看。

二、为什么要用 vhost

在 virtio 的机制中,guest 与 用户空间的 Hypervisor 通信,会造成多次的数据拷贝和 CPU 特权级的上下文切换。例如 guest 发包给外部网络,首先,guest 需要切换到 host kernel,然后 host kernel 会切换到 qemu 来处理 guest 的请求, Hypervisor 通过系统调用将数据包发送到外部网络后,会切换回 host kernel , 最后再切换回 guest。这样漫长的路径无疑会带来性能上的损失。

vhost 正是在这样的背景下提出的一种改善方案,它是位于 host kernel 的一个模块,用于和 guest 直接通信,数据交换直接在 guest 和 host kernel 之间通过 virtqueue 来进行,qemu 不参与通信,但也没有完全退出舞台,它还要负责一些控制层面的事情,比如和 KVM 之间的控制指令的下发等。

三、vhost 的数据流程

下图左半部分是 vhost 负责将数据发往外部网络的过程, 右半部分是 vhost 大概的数据交互流程图。其中,qemu 还是需要负责 virtio 设备的适配模拟,负责用户空间某些管理控制事件的处理,而 vhost 实现较为纯净,以一个独立的模块完成 guest 和 host kernel 的数据交换过程。

vhost 与 virtio 前端的通信主要采用一种事件驱动 eventfd 的机制来实现,guest 通知 vhost 的事件要借助 kvm.ko 模块来完成,vhost 初始化期间,会启动一个工作线程 work 来监听 eventfd,一旦 guest 发出对 vhost 的 kick event,kvm.ko 触发 ioeventfd 通知到 vhost,vhost 通过 virtqueue 的 avail ring 获取数据,并设置 used ring。同样,从 vhost 工作线程向 guest 通信时,也采用同样的机制,只不过这种情况发的是一个回调的 call event,kvm.ko 触发 irqfd 通知 guest。

四、总结

vhost 与 kvm 的事件通信通过 eventfd 机制来实现,主要包括两个方向的 event,一个是 guest 到 vhost 方向的 kick event,通过 ioeventfd 实现;另一个是 vhost 到 guest 方向的 call event,通过 irqfd 实现。

原文链接:https://cloud.tencent.com/developer/article/1075600

KVM中virtio实现(九)相关推荐

  1. KVM中virtio、vhost 和vhost-user比较(十一)

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

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

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

  3. KVM中virtio之vring(八)

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

  4. KVM中virtio之vring(十)

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

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

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

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

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

  7. rhel6.1 kvm安装virtio驱动

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

  8. 通过virt-v2v将VMware ESXi 5中的vm迁移至kvm中

    环境说明 Vmware Esxi 5.5 virt-v2v 1.28 kvm host:Centos 7.2 vm:Windows Server 2003 在很多文章中看见过通过virt-v2v连接e ...

  9. kvm中支持SCSI硬盘接口

    在KVM中安装ubuntu14(硬盘接口采用SCSI),可以正常安装,但是安装centos7却不行,原因是Centos7中没有SCSI驱动. 在ubuntu中用lsmod命令查看,可以发现ubuntu ...

最新文章

  1. Open3d 学习计划—12(Jupyter 可视化)
  2. 如何使用 CODING 实践 DevOps 全流程
  3. MDNS的漏洞报告——mdns的最大问题是允许广域网的mdns单播查询,这会暴露设备信息,或者被利用用于dns放大攻击...
  4. 长春成人计算机学校有哪些专业学校,长春成人高考学校有哪些
  5. C语言durand kerner算法求近似根roots(附完整源码)
  6. 【AI芯片格局最全分析】国内AI芯片百家争鸣,何以抗衡全球技术寡头
  7. SM37作业条目的存储表
  8. Lua-泛型for循环 pairs和ipairs的区别
  9. HTML、CSS、JS对unicode字符的不同处理
  10. python和c 的区别-C++/C/JAVA/Python之间的区别?
  11. 收下这10个终身学习的资源号,Max你的工作效率
  12. 几个月都没新增严重BUG,你测试组在干什么?
  13. 吴恩达机器学习视频笔记记录(第2、5、7、8章)
  14. 解决Linux环境下idea、webstorm等编辑器中文无效
  15. 图神经网络实战案例-新冠疫苗项目实战,助力疫情!
  16. 官宣:教父级讲师李明加入尚硅谷
  17. 关于国产化系统银河麒麟(Kylin)的问题记录--持续更新
  18. Telegram Bot 使用文档
  19. Failed to load ‘D:\note\笔记\javaweb\webpack\webpack.config.js‘ config
  20. ​鼠去仓实谷稻熟,牛来福地歌丰年

热门文章

  1. python语法大全-python基本语法
  2. python处理excel字典-使用Python代码处理Excel
  3. 从零开始学python数据分析-从零开始学Python数据分析(视频教学版)
  4. python操作系统-Python与操作系统有关的模块
  5. php和python哪个学起来简单一点-Php和python php和python哪个容易学
  6. python白名单验证-JWT黑名单和白名单
  7. 学python的基础-老司机学python篇:第一季(基础速过、机器学习入门)
  8. python没有英语基础的好学吗-Python好学吗难不难?0基础能学会吗?
  9. python真的这么厉害吗-Python为什么这么厉害?——Python ,能用来做什么
  10. python入门练习题-python入门练习题2