云计算虚拟化:看这一篇就够了!

SSDFans 2020-03-13 00:00


点击蓝字
关注我们



先声明一下,本节以及之后的几节都是作者学习Redhat的网络虚拟化的心得。比较性急的读者可以直接点击:

https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net

https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net

https://www.redhat.com/en/blog/hands-vhost-net-do-or-do-not-there-no-try


虚拟化三元素:

对于网卡来讲,在一个虚拟化的环境中,一个或者多个VM都是跑在一台物理机的,这些VM也有独立的操作系统,而这些操作系统是通过一个hypervisor跑在物理机的操作系统上。同时,这个物理机要提供相应的资源给VM,比如它会提供一个虚拟的网卡给VM,VM会把它当作一个真实的物理网卡。这里面就涉及了三个部分:


KVM

kernel based的VM可以使Linux像一个hypervisor一样工作。这个模块为linux提供一个了hyervisor所必须的功能,而那些例如:内存管理,调度,网络协议栈等功能都是由linux的kernel提供的。这些VM就像在linux标准的进程调度器管理下的用户态进程,唯一的不同是它们独占的虚拟硬件设备。


QEMU

一个运行在host 用户空间的虚拟机监控进程,通过仿真,它为VM机提供一系列的不同的硬件和设备接口。QEMU和KVM一起可以提供给VM近似与真实硬件的性能。一个Guest 可以通过 CLI 对于QEMU进行配置。


Libvirt 

一个可以把基于XML格式的配置信息转换成QEMU的CLI。它同时提供一个管理的守护进程来管理子进程,诸如qemu, 因此qemu就不需要root的权限了。因此在 Openstack Nova, 它可以创建一个VM的时候,通过libvrit创建一个qemu进程给VM,对于每个VM,可以分别创建qemu进程给它。



因此,在这个框图中,需要注意的地方:

  1. 对于host和guest都有用户态和核心态。

  2. 对于guest上的OS,都是跑在Qemu这个用户态的进程上。

  3. 对于Host来讲,有几个VM就要有几个Qemu进程,libvrit可以和他们交互。


在上图中,可以看到CPU的虚拟化都是由Qemu和KVM配合实现,虚拟机管理是libvirt实现的,但是I/O的虚拟化基本都是由原有的Host的kernel协议栈实现的。这个就是一切问题的起源。


I/O stack 本来就比较慢,对于Linux kernel network stack来讲,缺省的pps也就是350K[1],通过利用网卡的多队列和CPU的多线程的操作,可以最终到1Mpps。对于disk I/O来讲,用过HBA+SSD配置的同学都知道Linux block I/O stack的overhead。 对于NVMe SSD,IRQ成为相对比较大的overhead。


同时原有的Qemu的networking的是基于file的TAP/TUN接口。[2]


大家要注意的是,这样slow的堆栈,我们要走两次,两次,两次。


怎么办呢,缺省的KVM的I/O stack实在是不能用,性能和CPU的消耗都是问题。这个时候,大家想到了CPU虚拟化中的演进过程,从全指令模拟到半虚拟化。这个时候,Virtio接口就闪亮登场了。[2]



VirtIO

VirtIO定义可控制路径和数据路径,控制路径的功能是在Host和Guest之间建立和清除数据路径。而数据路径就是关注在host和guest之间的package的负载的传输。分两个路径也就是意味着是不同的路径。控制路径需要的是可管理和灵活性,数据路径要求的就是性能。Virtio的规范可以分为两个部分:


  1. virtio spec - The virtio spec, which is maintained by OASIS, defines how to create a control plane and the data plane between the guest and host. For example the data plane is composed of buffers and rings layouts which are detailed in the spec.

  2. vhost protocol - A protocol that allows the virtio dataplane implementation to be offloaded to another element (user process or kernel module) in order to enhance performance.


Virtio的控制路径就在Qemu的进程中按virtio 的规范实现了,但是数据路径不能这么做,因为每次数据从Guest OS到Host OS都需要上下文切换,代价太大了。因此数据路径必须要bypass Qemu。


Vhost的目的就是实现一个从host kernel 到Guest的直通路径,从而bypass Qemu进程。Vhost协议定义了如何去建立数据路径,但是如何去实现并没有严格规定,这个实现取决于host和Guest上ring的layout和数据buffer的描述以及数据报的发送和接受机制。


Vhost因此可以在Kernel中实现(vhost-net),也可以在用户态实现(vhost-user).


我们先来看看vhost-net/virtio-net 实现. 



在本图中,Virtio后端接口就是跑在host的kernel上的vhost-net,Virtio前端接口就是跑在Guest Kernel上的Virtio-net。


在前端和后端之间我们有数据路径和控制路径。控制路径如上图的蓝色,在vhost-net的kernel驱动和qemu的进程中以及guset 的virtio-net。vhost-net是遵循vhost协议规范在host 和guest的kernel之间基于共享内存区域建立了一个直接的数据通道。


为了性能,因为virtio本身就是queue的定义,为了性能实现了多队列。[3]



到目前为止,我们讨论的都是guest如何把数据发送到hots kernel,这个只是VM和PM之间数据,对于真正的云计算环境,大家需要解决的还有,一个PM上的VMs的数据以及两个不同的PM上的VM的数据问题,这个时候OVS就出现了。



可以看到,OVS和vrtio-networking的实现包含了两个部分:


  1.  Host的用户态,实现了ovsdb 的数据库,以及管理vswitch的守护进程。

  2. Host的kernel,通过ovs kernel驱动实现了数据路径以及转发路径。

OVS控制器和数据库服务器以及host kernel的转发通路通讯。我们使用linux的port机制使网络封包进出OVS。在上图中,我们使用一个port连接物理网络和OVS的kernel转发路径,另一个连接Virtio-networking的后端vhost-net。要注意,在现实的情况下,我们可以有多个网卡通过多个port连接到OVS,同时多个虚拟机可以有多个后端vhost-net连接到OVS。


到目前位置,我们还在复习总结,这都是目前经典的KVM+Qemu+Virtio+OVS的结构,估计使用的人应该已经不多了。但在向用户态的DPDK前进之前,我们还应该在deep dive一下。


Deep dive into Virtio-networking and vhost-net


Networking


在我们的讨论中,物理网卡就是一个真实的物理设备帮助计算机连接外部世界,它可能有一些CPU的卸载功能,和之前讲的offload网卡一样,支持TSO,LSO等等。


在linux网络里面,还有虚拟网络的概念TUN/TAP,他们提供了点到点的网络连接,用户空间的应用可以用它交换网络封包。TAP是可以支持L2的以太帧的设备,TUN是可以支持L3的IP 封包。


当tun的linux kernel模块加载之后,它会创建一个/dev/net/tun设备。一个进程可以创建一个tap设备并打开它,使用ioctl接口进行操作。一个新的tap设备会在/dev 文件系统中创建一个设备名,其他进程可以访问它,发送或接受以太帧。


IPC, System programming


Inter-processes communcation 这个是unix编程的老朋友,在和Qemu和Vhost结合的部分,如果看代码的话看一看到就是eventfd模式。[5]最常使用的就是实现一个事件驱动的线程池。当然,eventfd的文件句柄也可以有更多的模式,如poll,select,epoll以及被写入而notified (callback)。


这个就是KVM和Qemu基于IPC的网络通讯机制。[6]


Qemu和设备模拟

qemu虽然在host看来只是一个普通的进程,包含了自己的内存空间。但是在Guest虚拟机看来,Qemu提供的内存空间就是它的物理内存。

对于Host来讲,和真实的物理设备进行交互I/O的时候,都需要执行特殊的指令和访问预先分配好的内存地址空间。因此当qemu想访问这段空间的时候,控制权需要回到qemu,它通过设备模拟的方式提供接口给guest。


Virtio Spec device/driver

virtio的规范包含两个重要的元素:设备和驱动。在一个常见的部署中,hypervisor通过一定的机制把virtio 设备暴露给guest。从Guest看来,这些设备就是它的物理设备。

比较常用的机制就是PCI或者PCIE 总线。当然,也可以通过MMIO的方式把设备放在预定义的Guest的内存地址。这个Guest OS看到的物理设备可以完全是虚拟化的(没有host物理设备对应)或者只是对应一个设备的接口。



把设备通过PCI prot 暴露的好处是利用了pci的广泛使用的优势。真正的物理PCI设备都有一段内存空间来放置配置空间,驱动可以通过这段地址空间读写PCI设备的寄存器。在虚拟化中,hypervios会拦截对这些地址空间的访问并进行设备模拟,提供像物理机一样的对应的内存地址空间内容以及访问应答。virtio 协议就是定义了这些PCI的配置空间。


当Guest 启动并进行PCI/PCIe的初始化时候,virtio设备就会提供对应的pci 厂商ID和设备ID,guest OS就会调用对用的驱动进行交互,这里就是virtio的驱动。


Virtio IO的驱动必须分配一段内存区域,hyperviosr和这个virtio设备都可以访问,一般的机制就是共享内存。之前我们讲的数据路径就是利用这些内存区域进行数据搬运,而控制路径就是设置和维护这个内存区域。


Vritio Sepc  Virtqueue

每一个virtio设备都有0或者n个virtqueue。virtqueue本身是由一系列guset分配的buffer组成,这些buffer同样可以被host进行读写访问。Virtio协议同时也定义了双向的notification机制。


  • Available Buffer Notification: Used by the driver to signal there are buffers that are ready to be processed by the device

  • Used Buffer Notification: Used by the device to signal that it has finished processing some buffers.

    用PCI设备举例,guest可以通过写一个特殊的内存地址发送一个available buffer notification,而virtio设备可以使用vCPU的中断发送一个used buffer notification。
    当然这个notification机制可以被动态的禁止,这样virtqueue就可以使用polling机制了,这个会在下章的DPDK中详细解释。


关于Virtio设备的接口,总结一下:

  • Device’s feature bits (which device and guest have to negotiate)

  • Status bits

  • Configuration space (that contains device specific information, like MAC address)

  • Notification system (configuration changed, buffer available, buffer used)

  • Zero or more virtqueues

  • Transport specific interface to the device


virtio-net on qemu


Qemu virtio sending buffer flow diagram




这个两张图把整个流程解释得已经很清楚了。需要注意的点是:


1. 有额外的virtqueue不在数据路径上,只是用来提供virtio-net驱动和设备之间的通讯,它可以提供一些控制功能,比如高级过滤功能,设置MAC地址以及active的queue的数量。要知道,virtio设备和真正的物理网卡一样可以提供卸载功能,它可以通知guest OS,只要下面由host的设备来实现就行。

 2. vritio-buffer也就是virtqueue中的buffer是由virtio的驱动申请并映射到virtio设备。这些设备应该在hyervisor中,因此hyperviosr可以访问guest的这部分buffer进行读写操作。


Vhost协议

在上面的virtio的实现机制中,有几个可以提升的地方:


  1. 当Guest发送available buffer notification的时候,vCPU要stop,控制器回到hypervisor这边,这个是需要上下文切换的。

  2. Qemu自身的task/thread的同步机制。

  3. 通过TAP的package没有batch的机制,每个package都需要syscall和数据copy

  4. 通过vCPU的中断发送available buffer notification

  5. 额外的syscall用来恢复vCPU的运行,


vhost就是用来解决这些问题。vhost协议API本质上是基于消息的,它可以帮助hyperviosr把数据路径的操作卸载给其他的机制(handler)可以更加高效地完成。通过这个协议,master可以把下列信息发送给其他handler


  • Hyperviosr的memory 布局,这样其他的handler可以定位virtqueue和buffer在hypervisor内存中的位置。

  • 一对文件描述符,根据vritio协议发送或接受notification。这些文件描述符被KVM和handler共享,因此他们之间的通讯可以不经过hypervisor,从而做到bypass hypervisor。从而数据路径的处理就完全由这个handler来处理了,这个handler可以直接访问virtqueue的memory地址空间,又可以在guest之间收发notification。


vhost 的消息机制可以使用任意的host-local 通讯机制,比如sockets或者字符设备,或者和hypervisor可以使用server/client机制。


下面我们来分析一下vhost在kernel中的一个实现vhost-net.


vhost-net kernel implamentation 



vhost-net sending buffer diagram flow


和之前没有vhost的框图一样,上面两图解释了vhost的作用,在数据路径上减少了上下文切换。同时:

  1. qemu和vhost-net的handler通过ioctl进行vhost的消息交换,使用基于eventfd的irqfd和ioeventfd进行notification的处理。

  2. 初始化之后,vhost会创建vhost-$pid进程,$pid就是hpyervisor的进程。

  3. qemu会分配一个eventfd并且在vhost和KVM进行注册。vhost-$pid内核进程polls这个fd,当guest写一个特殊的位置的时候,kvm会写这个fd。这个机制就是ioeventfd。这样,一个简单的guest特殊位置的读写操作就不会引起qemu进程的苏醒操作,而直接路由到vhost-$pid进行处理。同时的好处是,这个操作基于fd的消息机制,不需要vCPU stop等待,这样就避免了vCPU的切换。

  4. qemu分配了另一个eventfd也注册在vhost和KVM,用来直接插入vCPU的中断,叫irqfd,通过写它,可以允许任何的host上的进程都产生一个vCPU的中断。同样可以较少上下文切换。



和之前一样,使用OVS(标准)添加包的路由功能。

到这里,virtio-net/vhost-net的部分结束了,它定义了基于open-source的软件接口,后面的工作基本都在考虑如何提升它的性能了。从2016年开始,大家的KVM虚拟化的I/O stack的演进开始了。


对,下一节就是DPDK。


[1]https://blog.cloudflare.com/how-to-receive-a-million-packets/

[2] https://people.gnome.org/~markmc/qemu-networking.html

[3]https://www.linux-kvm.org/page/Virtio

[4]https://www.linux-kvm.org/page/Multiqueue

[5]https://zhuanlan.zhihu.com/p/40572954

[6]https://medium.com/@jain.sm/network-packet-flow-in-kvm-qemu-dc79db719078



 

高端微信群介绍

创业投资群


AI、IOT、芯片创始人、投资人、分析师、券商

闪存群


覆盖5000多位全球华人闪存、存储芯片精英

云计算机群


全闪存、软件定义存储SDS、超融合等企业级存储

AI芯片群


讨论AI芯片和GPU、FPGA、CPU异构计算

5G群


物联网、5G技术与产业讨论

第三代半导体群

氮化镓、碳化硅等化合物半导体讨论

储存芯片群

DRAM、NAND、3D XPoint等各类存储介质和主控讨论

汽车电子群

MCU、电源、传感器等汽车电子讨论

光电器件群

光通信、激光器、ToF、AR、VCSEL等光电器件讨论

渠道群

存储和芯片产品报价、行情、渠道、供应链




< 长按识别二维码添加好友 >

加入上述群聊




长按并关注

带你走进万物存储、万物智能、

万物互联闪存2.0新时代

微信号:SSDFans
SSDFans AI+IOT+闪存,万物存储、万物智能、万物互联的闪存2.0时代即将到来,你,准备好了吗?
评论
  • Supernode与艾迈斯欧司朗携手,通过Belago红外LED实现精准扫地机器人避障;得益于Belago出色的红外补光功能,使扫地机器人能够大大提升其识别物体的能力,实现精准避障;Belago点阵照明器采用迷你封装,兼容标准无铅回流工艺,适用于各种3D传感平台,包括移动设备、物联网设备和机器人。全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,与国内领先的多行业三维视觉方案提供商超节点创新科技(Supernode)双方联合推出采用艾迈斯欧司朗先进Belago红
    艾迈斯欧司朗 2024-12-20 18:55 53浏览
  • 光耦固态继电器(SSR)作为现代电子控制系统中不可或缺的关键组件,正逐步取代传统机械继电器。通过利用光耦合技术,SSR不仅能够提供更高的可靠性,还能适应更加复杂和严苛的应用环境。在本文中,我们将深入探讨光耦固态继电器的工作原理、优势、挑战以及未来发展趋势。光耦固态继电器:如何工作并打破传统继电器的局限?光耦固态继电器通过光电隔离技术,实现输入信号与负载之间的电气隔离。其工作原理包括三个关键步骤:光激活:LED接收输入电流并发出与其成比例的光信号。光传输:光电传感器(如光电二极管或光电晶体管)接收
    腾恩科技-彭工 2024-12-20 16:30 40浏览
  • 耳机虽看似一个简单的设备,但不仅只是听音乐功能,它已经成为日常生活和专业领域中不可或缺的一部分。从个人娱乐到专业录音,再到公共和私人通讯,耳机的使用无处不在。使用高质量的耳机不仅可以提供优良的声音体验,还能在长时间使用中保护使用者听力健康。耳机产品的质量,除了验证产品是否符合法规标准,也能透过全面性的测试和认证过程,确保耳机在各方面:从音质到耐用性,再到用户舒适度,都能达到或超越行业标准。这不仅保护了消费者的投资,也提升了该公司在整个行业的产品质量和信誉!客户面临到的各种困难一家耳机制造商想要透
    百佳泰测试实验室 2024-12-20 10:37 145浏览
  • 汽车行业的变革正愈演愈烈,由交通工具到“第三生活空间”。业内逐渐凝聚共识:汽车的下半场在于智能化。而智能化的核心在于集成先进的传感器,以实现高等级的智能驾驶乃至自动驾驶,以及更个性、舒适、交互体验更优的智能座舱。毕马威中国《聚焦电动化下半场 智能座舱白皮书》数据指出,2026年中国智能座舱市场规模将达到2127亿元,5年复合增长率超过17%。2022年到2026年,智能座舱渗透率将从59%上升至82%。近日,在SENSOR CHINA与琻捷电子联合举办的“汽车传感系列交流会-智能传感专场”上,艾
    艾迈斯欧司朗 2024-12-20 19:45 59浏览
  • 随着工业自动化和智能化的发展,电机控制系统正向更高精度、更快响应和更高稳定性的方向发展。高速光耦作为一种电气隔离与信号传输的核心器件,在现代电机控制中扮演着至关重要的角色。本文将详细介绍高速光耦在电机控制中的应用优势及其在实际工控系统中的重要性。高速光耦的基本原理及优势高速光耦是一种光电耦合器件,通过光信号传递电信号,实现输入输出端的电气隔离。这种隔离可以有效保护电路免受高压、电流浪涌等干扰。相比传统的光耦,高速光耦具备更快的响应速度,通常可以达到几百纳秒到几微秒级别的传输延迟。电气隔离:高速光
    晶台光耦 2024-12-20 10:18 132浏览
  • //```c #include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量 #include "stdio.h"              // 标准输入输出库 #include "intrins.h"         &n
    丙丁先生 2024-12-20 10:18 84浏览
  •         不卖关子先说感受,真本书真是相见恨晚啊。字面意思,见到太晚了,我刚毕业或者刚做电子行业就应该接触到这本书的。我自己跌跌撞撞那么多年走了多少弯路,掉过多少坑,都是血泪史啊,要是提前能看到这本书很多弯路很多坑都是可以避免的,可惜这本书是今年出的,羡慕现在的年轻人能有这么丰富完善的资料可以学习,想当年我纯靠百度和论坛搜索、求助啊,连个正经师傅都没有,从软件安装到一步一布操作纯靠自己瞎摸索,然后就是搜索各种教程视频,说出来都是泪啊。  &
    DrouSherry 2024-12-19 20:00 105浏览
  • 光耦合器,也称为光隔离器,是用于电气隔离和信号传输的多功能组件。其应用之一是测量电路中的电压。本文介绍了如何利用光耦合器进行电压测量,阐明了其操作和实际用途。使用光耦合器进行电压测量的工作原理使用光耦合器进行电压测量依赖于其在通过光传输信号的同时隔离输入和输出电路的能力。该过程包括:连接到电压源光耦合器连接在电压源上。输入电压施加到光耦合器的LED,LED发出的光与施加的电压成比例。光电二极管响应LED发出的光由输出侧的光电二极管或光电晶体管检测。随着LED亮度的变化,光电二极管的电阻相应减小,
    腾恩科技-彭工 2024-12-20 16:31 52浏览
  •         在上文中,我们介绍了IEEE 802.3cz[1]协议提出背景,旨在定义一套光纤以太网在车载领域的应用标准,并介绍了XMII以及PCS子层的相关机制,在本篇中,将围绕IEEE 802.3cz-MultiGBASE-AU物理层的两个可选功能进行介绍。EEE功能        节能以太网(Energy-Efficient Ethernet)是用于在网络空闲时降低设备功耗的功能,在802.3cz的定义中,链
    经纬恒润 2024-12-19 18:47 81浏览
  • 国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。如何测试数字隔离器测试数字隔离器需要精度和正确的工具集来评估其在各种条件下的功能和性能。以下设备对于这项任务至关重要:示波器:用于可视化信号波形并测量时序特性,如传播延迟、上升时间和下降时间。允许验证输入输出信号的完整性。频谱分析仪:测量电磁干扰(EMI)和其他频域特性。有助于识别信号
    克里雅半导体科技 2024-12-20 16:35 53浏览
  • 百佳泰特为您整理2024年12月各大Logo的最新规格信息。——————————USB▶ 百佳泰获授权进行 USB Active Cable 认证。▶ 所有符合 USB PD 3.2 标准的产品都有资格获得USB-IF 认证——————————Bluetooth®▶ Remote UPF Testing针对所有低功耗音频(LE Audio)和网格(Mesh)规范的远程互操作性测试已开放,蓝牙会员可使用该测试,这是随时测试产品的又一绝佳途径。——————————PCI Express▶ 2025年
    百佳泰测试实验室 2024-12-20 10:33 110浏览
  • ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发平台 AXVU13P!这款搭载 AMD 16nm 工艺 XCVU13P 芯片的高性能开发验证平台,凭借卓越的计算能力和灵活的扩展性,专为应对复杂应用场景和高带宽需求而设计,助力技术开发者加速产品创新与部署。随着 5G、人工智能和高性能计算等领域的迅猛发展,各行业对计算能力、灵活性和高速数据传输的需求持续攀升。FPGA 凭借其高度可编程性和实时并行处理能力,已成为解决行业痛点的关
    ALINX 2024-12-20 17:44 54浏览
  • 汽车驾驶员监控系统又称DMS,是一种集中在车辆中的技术,用于实时跟踪和评估驾驶员状态及驾驶行为。随着汽车产业智能化转型,整合AI技术的DMS逐渐成为主流,AI模型通过大量数据进行持续训练,使得驾驶监控更加高效和精准。 驾驶员监测系统主要通过传感器、摄像头收集驾驶员的面部图像,定位头部姿势、人脸特征及行为特征,并通过各种异常驾驶行为检测模型运算来识别驾驶员的当前状态。如果出现任何异常驾驶行为(如疲劳,分心,抽烟,接打电话,无安全带等),将发出声音及视觉警报。此外,驾驶员的行为数据会被记录
    启扬ARM嵌入式 2024-12-20 09:14 91浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦