热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

【重识云原生】第四章云网络4.7.3节——Vhostnet方案

 《重识云原生系列》专题索引: 第一章——不谋全局不足以谋一域第二章计算第1节——计算虚拟化技术总述第三章云存储第1节——分布式云

 《重识云原生系列》专题索引: 



  1. 第一章——不谋全局不足以谋一域

  2. 第二章计算第1节——计算虚拟化技术总述

  3. 第三章云存储第1节——分布式云存储总述

  4. 第四章云网络第一节——云网络技术发展简述

  5. 第四章云网络4.2节——相关基础知识准备

  6. 第四章云网络4.3节——重要网络协议

  7. 第四章云网络4.3.1节——路由技术简述

  8. 第四章云网络4.3.2节——VLAN技术

  9. 第四章云网络4.3.3节——RIP协议

  10. 第四章云网络4.3.4节——OSPF协议

  11. 第四章云网络4.3.5节——EIGRP协议

  12. 第四章云网络4.3.6节——IS-IS协议

  13. 第四章云网络4.3.7节——BGP协议

  14. 第四章云网络4.3.7.2节——BGP协议概述

  15. 第四章云网络4.3.7.3节——BGP协议实现原理

  16. 第四章云网络4.3.7.4节——高级特性

  17. 第四章云网络4.3.7.5节——实操

  18. 第四章云网络4.3.7.6节——MP-BGP协议

  19. 第四章云网络4.3.8节——策略路由

  20. 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术

  21. 第四章云网络4.3.10节——VXLAN技术

  22. 第四章云网络4.3.10.2节——VXLAN Overlay网络方案设计

  23. 第四章云网络4.3.10.3节——VXLAN隧道机制

  24. 第四章云网络4.3.10.4节——VXLAN报文转发过程

  25. 第四章云网络4.3.10.5节——VXlan组网架构

  26. 第四章云网络4.3.10.6节——VXLAN应用部署方案

  27. 第四章云网络4.4节——Spine-Leaf网络架构

  28. 第四章云网络4.5节——大二层网络

  29. 第四章云网络4.6节——Underlay 和 Overlay概念

  30. 第四章云网络4.7.1节——网络虚拟化与卸载加速技术的演进简述

  31. 第四章云网络4.7.2节——virtio网络半虚拟化简介

  32. 第四章云网络4.7.3节——Vhost-net方案

  33. 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案

  34. 第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现

  35. 第四章云网络4.7.6节——virtio-blk存储虚拟化方案

  36. 第四章云网络4.7.8节——SR-IOV方案

  37. 第四章云网络4.7.9节——NFV

  38. 第四章云网络4.8.1节——SDN总述

  39. 第四章云网络4.8.2.1节——OpenFlow概述

  40. 第四章云网络4.8.2.2节——OpenFlow协议详解

  41. 第四章云网络4.8.2.3节——OpenFlow运行机制

  42. 第四章云网络4.8.3.1节——Open vSwitch简介

  43. 第四章云网络4.8.3.2节——Open vSwitch工作原理详解

  44. 第四章云网络4.8.4节——OpenStack与SDN的集成

  45. 第四章云网络4.8.5节——OpenDayLight

  46. 第四章云网络4.8.6节——Dragonflow



1 前言

        virtio是一种I/O半虚拟化解决方案,是一套通用I/O设备虚拟化的程序,是对半虚拟化Hypervisior中的一组通用I/O设备的抽象。virtio分为前端和后端,一个backend组件和一个frontend组件。backend组件是virtio接口的host端,frontend组件是virtio的guest端。

        Linux中的vhost驱动程序提供了内核态virtio设备仿真解决思路。 通常,QEMU在用户态进程模拟guest的I / O访问,而Vhost将virtio仿真代码放到了内核态中, 这就允许设备仿真代码直接调用内核子系统,而不是从用户态执行系统调用。

        故在vhost-net/virtio-net体系中,vhost-net是在host kernel space中运行的backend,virtio-net是在guest kernel space中运行的frontend。

        在Linux 3.0中,vhost代码存放在drivers / vhost /中。 所有设备使用的通用代码在drivers / vhost / vhost.c中。 这包括virtio vring访问功能,所有virtio设备需要为了与客户进行通信。 vhost-net代码存放在drivers / vhost / net.c中。


2 virtio-net驱动基本原理

        Virtio网络设备是一种虚拟的以太网卡,支持多队列的网络包收发。在virtio的架构中,有前后端驱动之分,所谓的前端驱动即是虚拟机中的virtio-net网卡驱动,而后端驱动的实现则多种多样,后端驱动的演化往往也标志着virtio网络的演化。

        上图中的后端即是QEMU的实现版本,也是最原始的virtio-net后端(设备)。virtio标准将其对于队列的抽象称为Virtqueue。Vring即是对Virtqueue的具体实现。

        一个Virtqueue由一个Available Ring和Used Ring组成,前者用于前端向后端发送数据,而后者反之。而在virtio网络中的TX/RX Queue均由一个Virtqueue实现。所有的I/O通信架构都有数据平面与控制平面之分。而对于virtio来说,通过PCI传输协议实现的virtio控制平面正是为了确保Vring能够用于前后端正常通信,并且配置好自定义的设备特性。而数据平面正是使用这些通过共享内存实现的Vring来实现虚拟机与主机之间的通信。

        举例来说,当virtio-net驱动发送网络数据包时,会将数据放置于Available Ring中之后,会触发一次通知(Notification)。这时QEMU会接管控制,将此网络包传递到TAP设备。接着QEMU将数据放于Used Ring中,并发出一次通知,这次通知会触发虚拟中断的注入。虚拟机收到这个中断后,就会到Used Ring中取得后端已经放置的数据。至此一次发送操作就完成了。接收网络数据包的行为也是类似,只不过这次virtio-net驱动是将空的buffer放置于队列之中,以便后端将收到的数据填充完成而已。


3 vhost-net原理

        vhost-net是处于内核态的后端驱动。QEMU实现的用户态virtio网络后端驱动所表现的网络性能并不如意,究其原因是因为频繁的用户态与内核态上下文切换,低效的数据拷贝、线程间数据同步等。于是演化出一种在内核态实现的virtio网络后端驱动方案,名为vhost-net。

        与之而来的是一套新的vhost协议。vhost协议可以将允许VMM将virtio的数据面offload到另一个组件上,而这个组件正是vhost-net。


3.1 Vhost 驱动模型

        vhost-net驱动程序在主机上创建一个/ dev / vhost-net字符设备。 此字符设备作为配置vhost-net实例的接口。

        当使用-netdev tap启动QEMU时,vhost = on将打开/ dev / vhost-net并使用几个ioctl调用初始化vhost-net实例。 这些必须将QEMU进程与vhost-net实例关联,准备virtio功能协商,并将guest虚拟机物理内存映射传递到vhost-net驱动程序。

        在初始化期间,vhost驱动程序创建一个名为vhost- $ pid的内核线程,其中$ pid是QEMU进程pid。 这个线程被称为“vhost工作线程”。 工作线程的任务是处理I / O事件并执行设备仿真。 


3.2 内核Virtio仿真

        Vhost不会模拟一个完整的virtio PCI适配器。 相反,它只将自己限制为virtqueue操作。 QEMU仍然用于执行virtio特性协商和实时迁移。 这意味着vhost驱动程序不是完整的virtio设备实现,它依赖于用户空间来处理控制平面,而数据平面在内核中完成。

        vhost工作线程等待virtqueue kick,然后处理放在virtqueue上的缓冲区。 在vhost-net这意味着从tx virtque的数据包并且通过tap文件描述符发送它们。

        文件描述符轮询也由vhost工作线程完成。 在vhost-net中,当数据包进入tap文件描述符时,工作线程被唤醒,并将其放置到rx virtqueue中,以便客户端可以接收它们。


3.3 Vhost作为用户空间接口工作逻辑

        vhost架构的一个令人惊讶的方面是它不以任何方式绑定到KVM。 Vhost是一个用户空间接口,不依赖于KVM内核模块。这意味着其他用户空间代码(如libpcap)在理论上可以使用vhost设备,如果他们发现它们方便的高性能I / O接口。

        当客户端kick主机,因为它已经将缓冲区放在一个virtqueue,需要一种方式来通知vhost工作线程有工作要做。由于vhost不依赖于KVM内核模块,它们不能直接通信。相反,vhost实例使用vhost工作线程监视活动的eventfd文件描述符进行设置。 KVM内核模块具有称为ioeventfd的功能,用于获取eventfd并将其挂接到特定的guest虚拟机I / O出口。 QEMU用户空间注册一个ioeventfd用于VIRTIO_PCI_QUEUE_NOTIFY硬件寄存器访问,它能kick virtqueue。这是当guest虚拟机kick virtqueue,vhost工作线程被KVM内核模块通知的方式。

        在从vhost工作线程返回到中断客户端时,使用了类似的方法。 Vhost需要一个“call”文件描述符,写这个文件描述符是为了去kick guest。 KVM内核模块有一个称为irqfd的功能,它允许eventfd触发客户机中断。 QEMU用户空间注册一个irqfd为virtio PCI设备中断并将其交给vhost实例。这是vhost工作线程如何中断客户端。

        因此,vhost实例只知道guest虚拟机内存映射,kick eventfd和call eventfd。


3.4 vhost-net基本运作原理

        在这套实现中,QEMU和vhost-net内核驱动使用ioctl来交换vhost消息,并且用eventfd来实现前后端的通知。当vhost-net内核驱动加载后,它会暴露一个字符设备在/dev/vhost-net。而QEMU会打开并初始化这个字符设备,并调用ioctl来与vhost-net进行控制面通信,其内容包含virtio的特性协商、将虚拟机内存映射传递给vhost-net等。对比最原始的virtio网络实现,控制平面在原有的基础上转变为vhost协议定义的ioctl操作(对于前端而言仍是通过PCI传输层协议暴露的接口),基于共享内存实现的Vring转变为virtio-net与vhost-net共享,数据平面的另一方转变为vhost-net,并且前后端通知方式也转为基于eventfd的实现。

        如下图所示,可以注意到,vhost-net仍然通过读写TAP设备来与外界进行数据包交换。而读到这里的读者不禁要问,那虚拟机是如何与本机上的其他虚拟机与外界的主机通信的呢?答案就是通过类似Open vSwitch (OVS)之类的软件交换机实现的。OVS相关的介绍这里就不再赘述。

 Vhost-net为后端的virtio网络架构图



3.5 KVM中virtio-net与vhost-net通信



  • vhost模块需要提前加载,注册一个misc的设备,供虚拟机启动时候使用。

  • 虚拟机创建的时候,会初始化一个tap设备,然后启动一个vhost _$(qemu-kvm_pid)的线程,配置vring等承载数据的高度。

  • guest和host进行网络数据IO的时候,只负责数据IO的中断,中断消息等由kvm模块负责。

  • guest发包的时候,virtio模块负责发送数据包加入链接,然后通知kvm模块,kvm模块通过ioeventfd通知vhost模块,此时可以将有包的堆栈挂在work_list上,然后激活线程vhost进行收包操作,收到包之后传递给tap设备,再往内核协议栈中上

  • guest收包的时候,首先是vhost的往tap设备发包,然后将包加入到其中一个,然后将挂在work_list,激活线程vhost,vhost进行收包的操作,然后传递到其中,然后vhost通过irqfd通知kvm模块,kvm模块给guest发送中断,guest会通过中断,到NAPI,执行轮询,接收数据包,然后上传到协议栈。


参考链接

DPDK系列之十二:基于virtio、vhost和OVS-DPDK的容器数据通道_cloudvtech的博客-CSDN博客_dpdk容器化

DPDK系列之六:qemu-kvm网络后端的加速技术_cloudvtech的博客-CSDN博客_dpdk kvm

DPDK系列之十五:Virtio技术分析之一,virtio基础架构_cloudvtech的博客-CSDN博客_virtio

从dpdk1811看virtio1.1 的实现—packed ring-lvyilong316-ChinaUnix博客

qemu-kvm中的virtio浅析 - 骑着蜗牛追太阳 - 博客园

Qemu模拟IO和半虚拟化Virtio的区别以及I/O半虚拟化驱动介绍_weixin_34051201的博客-CSDN博客

virtio blk原理 - 简书

virtio-blk简介_sdulibh的博客-CSDN博客

virtio-net原理(二) - 蓝色魔兽 - 博客园

virtio-net - 网络半虚拟化 - 知乎

DPU和CPU互联的接口之争:Virtio还是SR-IOV? - 极术社区 - 连接开发者与智能计算生态

virtio简介(一)—— 框架分析 - Edver - 博客园

KVM之Virtio介绍 (十五) - 程序员大本营

虚拟化之Virtio-Net基础篇-51CTO.COM

KVM 虚拟化详解 - 知乎

vhost前后端(vhost_net/virtio_net)转发流程详解-lvyilong316-ChinaUnix博客

Linux Kernel Vhost 架构 - 于杨 - 博客园

virtio,vhost 和vhost-user - allcloud - 博客园

本文由mdnice多平台发布



推荐阅读
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • MongoDB核心概念与基础知识解析
    MongoDB 是一种基于分布式文件存储的非关系型数据库系统,主要采用 C++ 语言开发。本文将详细介绍 MongoDB 的核心概念和基础知识,包括其与传统 SQL 数据库的区别,数据库及集合的基本操作,如数据的插入、更新、删除和查询等。通过本文,读者可以全面了解 MongoDB 的基本功能及其应用场景。 ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
  • 在C语言中,定义一个包含学号、姓名和年龄的学生信息结构体,并遵循严格的命名规范。首先,初始化结构体变量的所有成员为默认值,然后将其学号设为88,姓名设为“liming”,年龄设为25。最后,在控制台上输出该结构体变量的详细信息,以验证数据的正确性。例如,使用 `typedef struct Student` 定义结构体类型。 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • 文件系统管理与设计涉及众多内容,课堂讲解较为简略。本章主要介绍了以下几点:1. 基本概念 - 文件系统:一种用于实现数据持久性存储的系统抽象。 - 文件:文件系统中的基本存储单元,包含一组相关数据。文件系统通过文件组织和管理数据,提供高效的数据访问和管理机制。此外,还涵盖了文件的属性、类型和操作方法。 ... [详细]
  • Spring Security 认证模块的项目构建与初始化
    本文详细介绍了如何构建和初始化Spring Security认证模块的项目。首先,通过创建一个分布式Maven聚合工程,该工程包含四个模块,分别为core、browser(用于演示)、app等,以构成完整的SeehopeSecurity项目。在项目构建过程中,还涉及日志生成机制,确保能够输出关键信息,便于调试和监控。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
author-avatar
mobiledu2502884523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有