虚拟化界的强强联手:VirtIO与GPU虚拟化的完美结合

近距离了解 VirtIO 和 GPU 虚拟化

  

这是一篇 Linaro 开发团队项目组的科普文章。我们在处理器虚拟化项目中,经常会遇到 VirtIO 相关的问题;比如运行 Andriod 系统的时候需要运行 VirtIO 组件。‍‍‍随着 Cassini 项目和 SOAFEE(嵌入式边缘可扩展开放架构)等项目的开发,VirtIO 成为支持基于标准的云原生边缘开发/部署环境的关键构件,旨在实现这些高效的 EDGE 开发环境。GPU 虚拟化是 VirtIO 中较为复杂的组件之一。

本文将讨论其中的一些挑战以及 Linaro 开发团队在这一领域取得的进展。基于VirtIO的块和网络设备是相对简单的抽象,可以很好地映射到底层硬件。这些设备经过多轮优化,最大限度地减少了虚拟化开销。由于硬件种类繁多,图形处理器(GPU)更难抽象化。在简单的 2D 图形时代,任何特定的硬件都只能支持特定范围的内存布局和色深。随着技术的发展,图形引擎获得了复制内存区域、管理精灵或旋转纹理等各种不同的能力。随着 3D 技术的出现,情况并没有变得更简单。

现代 GPU 实际上是一种特殊用途处理器,经过优化后可以执行渲染现代场景所需的大量并行计算。很多现代超级计算机都以这些数字运算流水线为核心,这并不奇怪。然而,与大多数 CPU 不同的是,GPU 执行模型的细节往往不为用户所知。通常情况下,GPU 要么使用更高级别的 API 进行编程,然后由专有的二进制 Blob 将其翻译成秘密的隐藏指令流,再输送到 GPU。虽然有许多开放的 GPU 编程 API,旨在实现 GPU 之间的可移植性,但也有与特定硬件绑定的供应商专用库。所有这些都使得 GPU 虚拟化成为一个特别具有挑战性的领域。可以使用的方法大致有两种:虚拟函数和 API 转发。89f75f285230010ce75a67502e9413ab.jpeg
虚拟功能

这种方法与其他高性能虚拟化硬件的做法类似,都是将单个物理卡划分为多个虚拟功能(VF)。然后,每个 VF 都可以与访客共享,访客可以直接驱动它,就像作为主机运行一样。在服务器领域,主要 GPU 厂商(英特尔、AMD、nVidia)的高端 GPU 卡都支持 SR-IOV。它使用成熟的 PCI 分区在客户机之间划分 VF。然而,面向汽车和工业市场的 GPU 面临两个挑战:
- VF 数量较少(可能只有 2 个,需要抽象化)- 平台特定的分区方案市场上支持 VF 分区的 GPU 仍然相当罕见,而且现有的 GPU 通常只支持有限的分割,这意味着仍然需要一个完全抽象的虚拟 GPU 来复用多个有图形需求的客户。由于这些设备通常是平台设备(即直接映射内存,而非 PCI 设备),因此需要在固件、平台和驱动程序之间协调,才能支持这些 VF 的分配。从简洁抽象的角度来看,这使得问题变得更加复杂。
软件辅助虚拟功能为了解决这些限制,我们采用了各种软件辅助方法来弥补纯硬件支持的不足。其最初形式是一种名为 "中介设备"(mdev)的扩展,在硬件允许的情况下,它允许主机内核对设备进行分区。目前,支持该功能的内核驱动程序只有英特尔 i915 驱动程序和一个 s390 加密驱动程序。

d13f3aa9412403eb7aedc652b7547235.jpeg

利用 virtIO-gpu 的扩展(本地上下文)优化 GPU 虚拟化。
此方法:
- 利用 VirtIO 机制实现常用功能
- 直接向客户机提供原生上下文
- 客户机运行经过修改的原生 GPU 驱动程序,支持:
- VirtIO 感知
- 针对特定 GPU 的自定义协议


应用程序接口转发GPU 虚拟化的另一种方法是 API 转发。它的工作原理是为客户提供一个理想化的虚拟硬件,该硬件与共享库抽象的要求密切相关。VirtIO GPU 最初的 3D 加速基于 OpenGL。

该设备提供了一个名为 VirGL 的虚拟 OpenGL 设备,它基于 Gallium3D 接口。这样,访客只需向设备输入一系列 OpenGL 命令和通用的独立于 GPU 的着色器中间语言。在后端,这些命令被输入 virglrenderer,然后通过主机 GPU 进行渲染。1309ab8268ed3121a4429514d97e8bcb.jpeg对 VirGL 方法的主要不满在于效率。虽然可以运行流畅的桌面体验,但性能却远低于直接在主机上运行的预期。其中一个原因可能是古老的 OpenGl 编程模型与现代 GPU 的编程方式相比过于抽象。再加上不可避免的虚拟化开销,加剧了其性能问题。为了取代 OpenGL,我们开发了一种名为 Vulkan 的更现代的 API,它是一种更低级的编程 API,更贴近现代图形硬件的工作方式。它还将图形与计算工作流(GPUS 的一个重要用例)统一在一个 API 下。

虽然虚拟 GPU 对 Vulkan 的支持尚未在 QEMU 等项目中实现,但一些替代虚拟机监控器(VMM)能够使用这种模式提供更高效的虚拟 GPU 实现。最后还有第三种协议,即 Wayland 协议,它并不直接针对 GPU,而是用于与支持 3D 的显示服务器进行对话。这样,在客户机中运行的客户程序就能与主机显示管理器无缝集成。最初的用例是让 CrosVM 客户端中的 Linux 应用程序与 ChromeOS 主机集成。有趣的是,该协议还针对车载娱乐系统进行了扩展。
两种方法的比较对于那些希望通过保持尽可能轻量级的抽象来尽可能提高图形硬件性能的用户来说,虚拟函数似乎是未来的发展方向。此外,通过将复杂的图形栈隔离在客户域库中,还可以降低开发风险,这也是一个很好的安全论据。GPU 就其本质而言,必须处理大量不受信任的访客数据。

不过,这种直通方法也有一些缺点。在云原生开发中,最大的问题是将客户代码绑定到特定的 GPU 架构上,这意味着云和边缘部署之间的可移植性较差。此外,对于 Linaro 这家主要使用开源技术的公司来说,增加支持需要访问遍布整个堆栈的专有代码,而不是处理开源抽象。我们认为,通过使用 Rust 等更安全的语言编写 VirtIO 后端,图形堆栈的一些安全问题可以得到改善。 但需要注意的是,大部分后端最终仍将使用普通 C 语言库进行处理。要降低特权主机被攻击的风险,一种方法是将图形后端转移到单独的虚拟机(有时称为驱动域)中。这样,如果守护进程被攻破,攻击者仍会被控制在一个相对有限的环境中。d476dcb33f320b0788718e014936f853.jpeg

与 Orko 项目的关系

Orko 项目是我们之前的虚拟化项目 Stratos 的精神继承者。我们正在努力将一些 VirtIO 设备集成到 SOAFEE 参考平台中,以加快其应用。多媒体是汽车工作负载的主要驱动力,因此拥有一个实用的 GPU 解决方案非常重要。最初有两项工作计划用于支持 GPU。

衡量抽象成本

虽然有一些关于 VirGL 在某些系统上的性能的轶事,但我们还没有看到对这些抽象在 ARM 硬件上的成本进行全面测量。我们想知道这些较新的图形管线是否可用于处理像运行 AAA 级游戏一样的繁重工作负载,而不会产生过多的开销。

对于 QEMU,有几个小组提出了各种补丁,通过各种扩展来增强 virtio-gpu 设备。我们打算在帮助审查的同时,将这些补丁与 QEMU 最近的 xenpvh 支持集成,并开始在实际硬件上测量每个抽象的成本。我们还想探索使用 CrosVM Wayland 后端(它在引擎盖下使用 vhost-user),看看与 QEMU 的 xenpvh 模式和我们的 Xen vhost-user 前端集成有多少工作量。
独立的 virtio-gpu 守护进程

虽然我们在 SOAFEE 平台中使用 QEMU 来帮助启动 VirtIO 设备,但我们的愿景仍然是利用 rust-vmm 组件,使用 Rust 编写独立于管理程序的独立守护进程。独立守护进程之所以有用,还有很多其他原因:

  • 通过 rust-vmm 特质和 vhost-user 扩展,我们隐藏了 Xen 中映射内存和通知的底层实现,实现了跨管理程序的抽象层。这种方法简化了管理程序的交互,并提高了虚拟机管理的灵活性。
  • 如果没有独立于核心 VMM 的后端,我们就无法尝试我之前讨论过的驱动域概念


最好的办法是扩展 CrosVM 的 Wayland 实现以支持其他 GPU 命令流,还是从头开始编写一个新的后端,还有待观察。我们目前正在进行准备工作,测量各种抽象的开销,以帮助我们了解未来的发展方向。 

-对此,您有什么看法见解?-

-欢迎在评论区留言探讨和分享。-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/671676.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页html版面分析-- BeauifulSoup(python 文档解析提取)

介绍 BeauifulSoup 是一个可以从HTML或XML 文件中提取数据的python库;它能通过转换器实现惯用的文档导航、查找、修改文档的方式。 BeauifulSoup是一个基于re开发的解析库,可以提供一些强大的解析功能;使用BeauifulSoup 能够提高提取数据的效…

【强训笔记】day7

NO.1 思路:双指针模拟,begin表示最长数字字符串最后一个字符,而len表示数字字符串的长度,i用来遍历,如果为数字,那么定义j变量继续遍历,直到不为数字,i-j如果大于len,就…

TRIZ理论助力充电桩产业跨越技术瓶颈,实现产业升级!

随着新能源汽车市场的迅猛发展和电动汽车保有量的不断增加,充电桩作为电动汽车的“能量补给站”,其重要性日益凸显。然而,充电桩产业在发展过程中也面临着诸多技术瓶颈,如何突破这些瓶颈,推动充电桩产业升级成为行业亟…

【字符串】Leetcode 二进制求和

题目讲解 67. 二进制求和 算法讲解 为了方便计算,我们将两个字符串的长度弄成一样的,在短的字符串前面添加字符0;我们从后往前计算,当遇到当前计算出来的字符是> 2’的,那么就需要往前面进位和求余 注意&#xf…

d3dcompiler_47.dll缺失怎么修复?,修复d3dcompiler_47.dll文件缺失的详细教程

d3dcompiler_47.dll缺失怎么修复?遇到这样的问题是不是不知道怎么办?如果你不知道该怎么办,那么小编这篇文章将教大家如何去解决d3dcompiler_47.dll文件缺失。 方法1:下载并安装d3dcompiler_47.dll文件 当出现找不到d3dcompiler_…

怎么把静图变成gif?推荐一招在线制作

想要实现图片转换gif动图的操作使用什么工具能实现呢?在这个高速发展的时代经常需要在网络中分享、保存各种各样的gif动图。当我们想要将一些静态图片变成有趣的gif图片时,就可以使用gif在线制作(https://www.gif.cn/)工具&#x…

ComfyUI 基础教程(十三):ComfyUI-Impact-Pack 面部修复

SD的WebUI 中的面部修复神器 ADetailer,无法在ComfyUI 中使用。那么如何在ComfyUI中进行面部处理呢?ComfyUI 中也有几个面部修复功能,比如ComfyUI Impact Pack(FaceDetailer),以及换脸插件Reactor和IPAdapter。 ComfyUI-Impact-Pack 是一个功能强大的插件,专为 ComfyUI …

投资海外标的,首选跨境ETF!现在新开佣金低至万0.5!

全球资产配置的利器 随着经济的发展,全球资产配置成为中产阶级的关注方向。目前,全球资产配置的主要渠道包括直接开立境外账户、 QDII 基金、跨境 ETF 等。 现阶段通过跨境 ETF 投资境外股市是最便利、最具效率的方式之一。首先,与直接境外…

猪饲料生产加工厂污废水如何处理

猪饲料生产加工厂的污废水处理是一个复杂的过程,旨在减少生产活动对环境的影响,确保废水排放符合环保标准。以下是一个基本的处理流程,适用于处理猪饲料生产加工过程中产生的废水: 初步处理(预处理)&#x…

解决 java: 非法字符: ‘\ufeff‘

【报错解释】: 该错误通常发生在尝试编译Java源代码文件时,文件开头的字符是一个字节顺序标记(Byte Order Mark,BOM),即\ufeff。在Java中,\ufeff不是一个合法的字符,因此编译器会报…

git-新增业务代码分支

需求 使用git作为项目管理工具管理项目,我需要有两个分支,一个分支是日常的主分支,会频繁的推送和修改代码并推送另外一个是新的业务代码分支,是一个长期开发的功能,同时这个业务分支需要频繁的拉取主分支的代码&#…

1天搞定SpringBoot+Vue全栈开发 (4)多表查询及分页查询

1.多表查询 在多表查询中,mybatis和mybatis plus无区别 User: package com.example.mpdemo.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.Ta…