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

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时代即将到来,你,准备好了吗?
评论
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 18浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 35浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 205浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 88浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 156浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 149浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 124浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 24浏览
  • 在物联网(IoT)短距无线通信生态系统中,低功耗蓝牙(BLE)数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输,最高能满足2Mbps的数据传输速率,可轻松实现设备之间的快速数据同步和实时交互,例如传输传感器数据、低采样率音频/图像与控制指令等。低功耗蓝牙(BLE)数据透传解决方案组网图具体而言,BLE透传技术是一种采用蓝牙通信协议在设备之间实现数据透明传输的技术,设备在通信时会互相验证身份和安全密钥,具有较高的安全性。在不对MCU传输数据进
    华普微HOPERF 2025-01-21 14:20 22浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 27浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 119浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 74浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦