目录

Virtio:针对Linux的I/O的虚拟化框架

Vhost

Vhost-user

Vhost-user与vhost的区别

相关阅读


Virtio:针对Linux的I/O的虚拟化框架


Linux内核支持多种虚拟化模式,并且支持的数量随着虚拟化的进步和新模式的出现(例如 lguest)而增加。但是,让这些虚拟化模式能够在 Linux 之上运行之后,又如何让它们能够在 I/O 虚拟化方面利用底层内核呢?

答案是使用virtio,它为 hypervisor 和一组通用的I/O虚拟化驱动程序提供高效的抽象。探索virtio并了解为什么 Linux将成为最佳的 hypervisor。

完全虚拟化中,guest OS运行于物理机器上的hypevisor上,guest  OS并不知道它已被虚拟化,并且不需要任何更改就可以在该配置下工作。半虚拟化中,guest OS不仅知道它运行在hypervisor之上,还包含让guest OS更高效地过渡到hypervisor的代码。

在完全虚拟化模式中,hypervisor必须模拟设备硬件,它是在会话的最低级别进行模拟的。尽管在该抽象中模拟很干净,但它同时也是最低效、最复杂的。在半虚拟化的模式中,guest OS和hypervisor能够共同合作,让模拟更加高效。

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

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

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

作为对比,从下面简单的iperf测试中,我们就能看出两者的性能差距:

Vhost


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

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将部分virio驱动的操作从用户态移到内核态,减少了用户态/内核态切换时间和包的拷贝次数,从而更进一步的提升了性能,下面的网络延时测试可以看出vhost的优势:

Vhost-user


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

vhost的io路径

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

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实现的驱动),能进一步加快数据的传输。

Vhost-user与vhost的区别


Vhost是client与kernel(server)的交互,client与内核共享内存,局限性是如果client要发送消息到用户进程,很不方便;

Vhost-user使用unix domain来进行通信,两个用户进程共享内存,达到和vhost一样的效果。

相关阅读


《Linux虚拟化KVM-Qemu分析(八)之virtio初探》

《Linux虚拟化KVM-Qemu分析(九)之virtio设备》

《virtio 网络的演化》

《使用DPDK打开Open vSwitch(OvS) *概述》

《Open vSwitch(OVS)文档》

《《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)》

《virtio 网络的演化:原始virtio > vhost-net(内核态) > vhost-user(DPDK) > vDPA》

《Virtio原理简介》

《Virtio、Vhost、Vhost-user介绍》

站外参考文章


《SR-IOV:网卡直通技术》

《关于英特尔® 以太网服务器适配器中 SR-IOV 的常见问题解答》

《Vhost-user详解》

Virtio、Vhost、Vhost-user介绍相关推荐

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

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

  2. virtio、vhost和vhost-user比较

    1. virtio:针对Linux的I/O的虚拟化框架 在虚机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的 ...

  3. 2021年二月下旬文章导读与开源项目仓库 | scatter-gather DMA,SR-IOV,ARP欺骗,中断,Lockdep,virtio,vhost

    目录 文章目录 开源项目仓库 [转]浅谈scatter-gather DMA SR-IOV:网卡直通技术 [黑客入门] 连接公共WIFI有多危险(ARP欺骗) DPDK ACL算法介绍 文章目录 Li ...

  4. 高通Q+A Virtio hypervisor touch框架介绍(share-device)

    背景 大家都知道现在高通芯片在汽车行业的座舱域运用比较热门,但是这种现象不是突然冒出来的,高通最早在2015年左右就开始推广他们的第一代座舱芯片820A.而在2018年左右开始推广他们的第二代产品(6 ...

  5. 数据平面开发套件(DPDK)中的Vhost / Virtio的配置和性能

    目录 Vhost / Virtio简介 接收和发送路径 可合并路径 向量路径 不可合并的路径 PVP路径性能比较 I / O转发吞吐量 Mac转发吞吐量 PVP MAC转发吞吐量 测试台信息 关于作者 ...

  6. 异步模式下的 Vhost Packed Ring 设计介绍

    引言 随着计算机硬件资源整合的发展,虚拟化的研究与应用日新月异.Virtio/Vhost作为一种设备虚拟化的典型应用,在业界受到了广泛的关注.Virtio 最开始由Rusty Russell在其200 ...

  7. VIRTIO VHOST

    背景 在虚拟化领域,virtio 随处可见.当前,virtio 可以加速 IO.network子系统. 在 IO 子系统,主要有 virtio-blk, virtio-scsi.同时,有 vhost ...

  8. virtio,vhost 和vhost-user

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

  9. l298n电机驱动模块使用方法_SPDK virtio 驱动模块介绍及使用

    作者简介闫亮 Intel高级软件工程师专注于开源存储SPDK的测试和优化 简介 CONTENTS SPDK  virtio模块介绍 SPDK  virtio 用户模式使用示例 SPDK  virtio ...

最新文章

  1. Python 参考手册
  2. android 二次点击退出,android返回二次退出
  3. java并发编程之美-阅读记录11
  4. python清空列表_Python之列表
  5. mysql 数据库文件导入和导出、远程上传和下载数据库
  6. 【2017年第3期】大数据服务三农的初步分析与探索
  7. 个人git指令成长史
  8. c语言变量起别名,typedef可以与此同时为一个类型起两个别名
  9. AVS2/AVS3测试视频和VLC播放器
  10. MPush开源实时消息推送系统
  11. 树莓派安装中文拼音输入法和五笔输入法
  12. 通过Python计算经纬度点任意角度任意距离的经纬度点
  13. 选课通知 | 北交大《数据分析方法及应用实战》秋季全校选修课简介!
  14. xge_mac学习(4)--TX_DeQ
  15. 郝斌c语言视频错误的在哪里,根据郝斌C语言视频学的解简单一元二次方程的代码总是敲错,求大神帮忙看看...
  16. 设计模式简单RPG游戏设计
  17. 好朋友结婚了,祝福你们!
  18. 从键盘输入两个数作为除数和被除数。要求程序中捕获NumberFormatException 异常和ArithmeticException 异常, 而且无论在哪种情况下,“程序执行结束”这句话都会在控制
  19. 用Java打印菱形(奇数个)
  20. mysql启动错误1.69_开启伪静态出错iPHP Error: iCMS 运行出错!找不到文章: ID:404(10001)...

热门文章

  1. 微课录制用什么工具好?发现好工具,往往都在不经意间
  2. 各大芯片设计生产与架构的厂商
  3. 本地启动前端项目,如何让外部通过ip去访问
  4. **用户画像是什么?用户画像如何分析?**
  5. minio安装与使用
  6. ULN2003芯片控制直流电机学习
  7. 2020程序员面试必备!58道精选面试题
  8. ORACLE如何删除重复数据
  9. element-UI el-table表格树形在指定列展开显示
  10. kaggle图像分割实战要点和技巧总结