1. virtio:针对Linux的I/O的虚拟化框架

在虚机中,可以通过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路径:

  • guest设置好tx
  • kick host
  • guest陷出到kvm
  • kvm从内核切换到用户态的qemu进程
  • qemu将tx数据投递到tap设备

2. 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路径:

  • guest设置好tx
  • kick host
  • guest陷出到kvm
  • vhost-net将tx数据投递到tap设备

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

3. vhost-user

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

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

vhost-user的io路径:

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

  • DPDK
    DPDK便是一个在用户态可以直接操作物理网卡的库函数,它和vhost-user结合便可以实现类似于snabb switch一样性能强劲的用户态交换机了。
  • Vapp
    开源社区中实现了一个项目 Vapp,主要是用来测试 vhost-user 的 C/S 模式的,github 地址如下:https://github.com/virtualopensystems/vapp.git
    使用方法:

    $ git clone https://github.com/virtualopensystems/vapp.git
    $ cd vapp
    $ make
    // 运行 server 端
    $ ./vhost -s ./vhost.sock
    // 运行 client 端
    $ ./vhost -q ./vhost.sock
    

参考:
https://forum.huawei.com/enterprise/zh/thread-465473.html
https://blog.csdn.net/qq_15437629/article/details/77899905
https://dpdk.readthedocs.io/en/v16.04/sample_app_ug/vhost.html

virtio、vhost和vhost-user比较相关推荐

  1. 《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)

    Table of Contents 加速包处理的vhost优化方案 142.vhost的演进和原理 143.Qemu与virtio-net 144.Linux内核态vhost-net 145.用户态v ...

  2. 英特尔DSA-加速DPDK Vhost

    1. 介绍 VirtIO是一个虚拟接口标准,用于虚拟机(Virtual Machine, VM)访问其他设备,如网络设备和块设备.一个VirtIO设备由一个运行在主机上的后端和一个存在于虚拟机中的前端 ...

  3. vhost dpdk 共享内存

    struct kvm_memory_slot http://tinylab.org/kvm-intro-part1 https://www.cnblogs.com/LoyenWang/p/139430 ...

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

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

  5. SPDK Vhost在线恢复:让I/O飞一会儿

    背景 在All in Cloud的趋势下,各大CSPs(Cloud Service Providers)在宣传自家的服务时都会向客户声称提供高可靠,高稳定的服务例如5个9的可用性(99.999%).但 ...

  6. qemu 线程 vhost

    [root@localhost cloud_images]# lsmod | grep vhost_net vhost_net 262144 0 vhost 262144 1 vhost_net ta ...

  7. dpdk Vhost 库

    1. 怎么实现vhost_dev的VhostOps的vhost_set_vring_kick和vhost_set_vring_call: vhost_net  kernel方式的vhost_set_v ...

  8. OVS DPDK与QEMU之间如何通过vhost user协议通信 vhost user协议的控制和数据通道

    netdev_dpdk_vhost_construct定义在文件openvswitch-2.9.2/lib/netdev-dpdk.c1058 static int 1059 netdev_dpdk_ ...

  9. VHOST KICKCALL 原理

    1. vhost vring设置 VHOST_SET_VRING_KICK: 建立virtio前端到vhost后端的通知机制: VHOST_SET_VRING_CALL: 建立vhost后端到virt ...

最新文章

  1. iftop 流量监控
  2. 2013年大数据全球技术峰会观后感
  3. 《微软云计算Microsoft Azure部署与管理指南》即将上市!!!
  4. [html] iframe可以使用父页面中的资源吗(如:css、js等)?
  5. Java实现Excel导入数据库,数据库中的数据导入到Excel
  6. 【ElasticSearch】Es 源码之 SettingsModule 源码解读
  7. assembly : maven assembly打包报错:maven to create assembly : unable to obtain archiver for extension
  8. Python编程及应用--数据分析与科学计算可视化培训班
  9. 华为暂停一般性社招;嘀嗒出行系统崩溃;美团和摩拜账号互通 | 极客头条
  10. 【BZOJ1116】[POI2008]CLO 并查集
  11. windows 2008 配置php_Windows 2008 R2 下IIS7.5+PHP5.2环境配置(FastCgi设置)
  12. python小学生入门教程-python 小学生教程|怎么让一个小学生学会Python?
  13. ArcGIS操作系列(一)之地理配准
  14. control reaches end of non-void function
  15. QT QMessageBox 按钮文字更改为中文
  16. 小白积累本:stata矩阵计算初级操作的汇总(更新ing)
  17. Linux监控服务之zabbix
  18. 运放电路中何时加入偏置电流补偿电阻-运算放大器
  19. 节能降耗 | AIRIOT智慧电力综合管理解决方案
  20. winform工具1-图片去除水印

热门文章

  1. shell 相关知识(1)
  2. SUPERSET使用笔记
  3. 老百姓需要这样的智慧城市
  4. 关于Oracle表及字段的注释 转
  5. 走近伏羲,谈5000节点集群调度与性能优化
  6. 与时间相关NSCalendar、NSDate类的基本使用
  7. ./wls1036_linux32.bin: /lib/ld-linux.so.2: bad ELF interpreter
  8. C++ string 大小写转换
  9. 【linux学习笔记八】常用命令
  10. 自媒体公约:良性发展大于利益本能