AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1154112
Accepted
panxl
panxl
Asked: 2024-02-23 02:23:35 +0800 CST2024-02-23 02:23:35 +0800 CST 2024-02-23 02:23:35 +0800 CST

如果有硬件辅助虚拟化,那么使用半虚拟化的目的是什么?

  • 772

我正在研究 QEMU/KVM 和 Firecracker/KVM。据我了解,Firecracker 和 QEMU 都与 KVM 通信,通过将 CPU 模式更改为来宾到主机(反之亦然),最终使硬件辅助虚拟化受益。

  1. 在CPU的guest模式下,guest甚至可以直接执行其特权指令,那么为什么我们还需要半虚拟化呢?

  2. 在 Firecracker 中,仅模拟了 5 个设备,例如

  • virtio网,
  • virtio 块,
  • virtio-vsock 等。

即使在这种极简设计中,我们也必须放置半虚拟化驱动程序。难道我们不能仅仅依靠硬件辅助虚拟化吗?

virtualization
  • 4 4 个回答
  • 870 Views

4 个回答

  • Voted
  1. Best Answer
    Austin Hemmelgarn
    2024-02-23T22:36:38+08:002024-02-23T22:36:38+08:00

    仅考虑网络的情况。

    为了在大多数情况下真正有用,虚拟机需要能够通过网络进行通信。为此,访客显然必须看到某种网络接口。但是 VT-x、AMD-V 和 ARM VHE 以及几乎所有其他硬件虚拟化实现都不提供 NIC,它们只是为您提供了一种安全隔离和分区 CPU 资源的方法。因此,硬件虚拟化不会为您提供网络接口。

    现在,您可以从主机系统通过物理网络接口,但这存在许多问题:

    • 它需要在主机操作系统启动时进行特殊处理,以确保它实际上不会将驱动程序绑定到该接口。
    • 它需要硬件中的特殊支持才能确保安全(您需要IOMMU,并且您想要通过的 NIC 必须支持在 IOMMU 后面运行)。
    • 它实际上需要每个虚拟机都有一个可用的网络接口。这显然意味着任何使用笔记本电脑的人都会不走运,但这也意味着大多数大型虚拟机托管提供商也会不走运(他们可能在同一主机上运行数十个虚拟机)。
    • 如果没有 RDMA 硬件和大量额外的复杂性,它使得实时迁移在功能上不可能实现(就像任何其他直接设备直通一样)。
    • 在虚拟机需要相互通信的情况下,它本质上会引入外部故障点(因为它们必须通过系统外部的网络交换机发送流量)。

    因此,您显然需要以某种方式模拟网络接口。显而易见的选择是选择一个常用的物理网卡并对其进行模拟。但这有其自身的一系列问题:

    • 模拟物理网卡所做的许多事情在计算上相当昂贵。它仅在物理实现中有效,因为它使用物理逻辑和 ASIC。
    • 大多数模拟成本高昂的相同内容对于虚拟机来说甚至不需要,但您无法避免模拟它,因为驱动程序会期望它能够工作。
    • 来宾驱动程序需要大量额外的复杂性来支持这些甚至没有带来任何实际好处的东西。从长远来看,Linux 的 Intel e1000(一种常见的模拟物理网卡)驱动程序大约有 17k 行代码,而 virtio-net 驱动程序只有 4.8k(如果包括它可能在其上使用的 virtio-pci 组件,则为 7.3k) x86 系统)。

    virtio-net 解决了这些问题,它只涵盖了在来宾操作系统和主机网络层之间移动网络数据包实际需要的内容,仅此而已。解决这些问题可以带来巨大的性能提升。我最近没有测试过,但上次我使用 QEMU 进行比较时,virtio-net 提供了模拟 e1000 卡两倍以上的有效带宽,以及大约 1/10 的延迟,所有这些都在主机端具有较低的 CPU 使用率。

    同样的逻辑适用于大多数其他设备。有些东西可以相对便宜地模拟,或者不是性能关键的,因此不需要高效(这就是为什么没有 VirtIO 看门狗定时器,例如,它不是性能关键的,并且在大多数情况下模拟很简单),但是对于大多数不符合这些标准的事情,有一个 paravirt 选项,因为性能差异巨大,并且复杂性的降低往往会使事情变得更加可靠。

    有时,半虚拟化可以让您完成使用“常规”硬件无法真正完成的事情。VirtIOFS 和 9P2000 的 VirtIO 传输就是最好的例子,它们没有类似的硬件,但提供了一种相当有效的方式来在主机和来宾之间共享文件,而无需模拟网络或块设备。

    • 10
  2. shodanshok
    2024-02-23T14:49:43+08:002024-02-23T14:49:43+08:00

    简短的回答:当使用来宾端驱动程序进行增强时,现代硬件虚拟化使用某种形式的半虚拟化来执行性能最密集的操作。因此,现代虚拟机管理程序汇集了专用硬件支持和半虚拟化。

    长版本:原始的 X86 架构很难正确虚拟化并与未经修改的操作系统一起使用。一种解决方案是动态翻译有问题的代码片段,即时重新编译它们。这使得未经修改的来宾能够运行,但缺点是转换器本身的开销高且复杂。此外,每种客户内核类型都需要特殊处理。

    因此,项目开始修改 Linux 内核以避免困难的情况 - 即:当指令/调用不容易虚拟化时,让我们从底层虚拟机管理程序调用超级调用。超级调用是半虚拟化的基础,您可以将其视为用户空间系统调用的等价物。换句话说,底层 Linux 内核是主机操作系统,另一个 Linux 内核将作为来宾“用户空间”应用程序运行。

    这种方法最大限度地减少了虚拟化开销,但它需要修改后的来宾内核才能工作。您的标准 Windows 安装将无法运行。因此引入了完整的硬件虚拟化,其中向微处理器添加了额外的特权环。这允许主机操作系统在特定特权级别(即:-1,虚拟机管理程序空间)中运行,而来宾操作系统在环0(即:0,内核空间)中运行不变。然而,虚拟设备模拟仍然存在问题和/或开销较高,因此需要创建自定义来宾驱动器。这些驱动器为对性能最敏感的设备(特别是磁盘和网络)重新引入了有针对性的半虚拟化。这给我们带来了当前的情况,硬件辅助的虚拟机管理程序通过有针对性的半虚拟化驱动器得到增强。

    • 6
  3. djdomi
    2024-02-23T19:43:25+08:002024-02-23T19:43:25+08:00

    我也做了一些研究,我认为这可能会帮助你理解这个问题,但它可能不会直接解决它(也许)。除了 shodanshok 答案之外,我可能会炸毁他的“扩展”答案,也许会有点巨大的足迹

    半虚拟化(可能)仍然具有相关性,原因如下:

    1. 性能优化:

    尽管特权指令可以直接在来宾模式下执行,但半虚拟化可以通过优化来宾操作系统和虚拟机管理程序之间的通信来增强性能。半虚拟化允许使用专门为来宾和虚拟机管理程序之间的高效协作而设计的接口和协议。

    1. 灵活性和便携性:

    半虚拟化支持虚拟化来宾操作系统,而这些操作系统可能未针对在虚拟化环境中直接执行进行优化。通过提供特定的接口,客户系统可以更轻松地跨各种虚拟化平台移植。

    1. 安全:

    半虚拟化可以通过为来宾和虚拟机管理程序之间的通信提供明确定义的接口来提供安全优势,从而潜在地减少攻击媒介。

    1. 关于 Firecracker 和类似的极简虚拟化解决方案:

    尽管它们使用一组有限的模拟设备运行,但半虚拟化的使用允许来宾和虚拟机管理程序之间更高效、更灵活的通信。即使在极简设计中,半虚拟化驱动程序也可以提高整体性能并优化来宾和虚拟机管理程序之间的交互。因此,即使在这样的环境中,半虚拟化仍然是有益的

    维基百科说一下:

    在计算中,半虚拟化或半虚拟化是一种虚拟化技术,它为虚拟机提供与底层硬件软件接口相似但不相同的软件接口。

    修改接口的目的是减少来宾执行操作所花费的执行时间,与非虚拟化环境相比,这些操作在虚拟环境中运行起来要困难得多。半虚拟化提供了专门定义的“挂钩”,以允许来宾和主机请求并确认这些任务,否则这些任务将在虚拟域中执行(执行性能较差)。成功的半虚拟化平台可以使虚拟机监视器(VMM)变得更简单(通过将关键任务的执行从虚拟域重新定位到主机域),和/或减少虚拟客户内机器执行的整体性能下降。

    半虚拟化要求来宾操作系统针对 para-API 进行显式移植——不支持半虚拟化的传统操作系统发行版无法在半虚拟化 VMM 之上运行。然而,即使在无法修改操作系统的情况下,也可以使用组件来实现半虚拟化的许多显着性能优势。例如,Xen Windows GPLPV 项目提供了一套半虚拟化感知设备驱动程序,旨在安装到在 Xen 虚拟机管理程序上运行的 Microsoft Windows 虚拟客户中。 [1] 此类应用程序往往可以通过半虚拟机接口环境访问。这确保了跨多个加密算法模型的运行模式兼容性,从而允许在半虚拟框架内无缝集成。

    我认为,尽管我们可以参考维基百科文章,但您可能有一些原因不想将硬件直接暴露给来宾,特别是如果您出售租用的虚拟机。

    此外,通常情况下,我们还需要标准和标准化驱动程序以及接口。
    在尝试安装 Windows 9x/nt/VIST/XP 时,我们不想像以前那样处理驱动程序。但或多或少也在标准硬件上 7/10/11(他们大多已经有了,有时已经包括了 VirtIO 支持)。(特别是在 Windows 7 时期之前)。

    这就是为什么我们需要更多地了解历史:

    维基百科文章的历史部分说:

    Parallels Workstation 操作系统将其等效项称为“超级调用”。所有这些都是同一件事:对下面的虚拟机管理程序的系统调用。此类调用需要“来宾”操作系统的支持,该操作系统必须具有特定于虚拟机管理程序的代码才能进行此类调用。

    “半虚拟化”一词首先在与 Denali 虚拟机管理器相关的研究文献中使用。[4] 该术语还用于描述 Xen、L4、TRANGO、VMware、Wind River 和 XtratuM 虚拟机管理程序。所有这些项目都使用或可以使用半虚拟化技术,通过实现不实现实际 x86 指令集难以虚拟化部分的虚拟机来支持 x86 硬件上的高性能虚拟机。

    管理程序提供底层计算机系统的虚拟化。在完全虚拟化中,来宾操作系统无需修改即可在虚拟机管理程序上运行。然而,通过让客户操作系统与虚拟机管理程序进行通信,可以提高性能和效率。通过允许来宾操作系统向虚拟机管理程序表明其意图,每个系统都可以在虚拟机中运行时进行合作以获得更好的性能。这种类型的通信称为半虚拟化。

    2005年,VMware提出了半虚拟化接口,即虚拟机接口(VMI),作为客户操作系统和虚拟机管理程序之间的通信机制。该接口支持透明的半虚拟化,其中操作系统的单个二进制版本可以在本机硬件上运行,也可以在半虚拟化模式下的虚拟机管理程序上运行。

    这提醒我,它的内核中的支持也已在 2011 年左右被放弃,而从 08 年开始引入了 VirtIO(可能作为继任者)

    恕我直言:

    与 TCP/IPv4 堆栈类似,它代表了一种旨在无限期持续下去的遗留技术,尽管在部署时未预见到未来的发展。我希望我没有因为这个冗长的答案而让您的眼睛太疲劳。;)

    参考):

    • https://en.wikipedia.org/wiki/半虚拟化
    • https://docs.kernel.org/driver-api/virtio/virtio.html#:~:text=Virtio%20is%20an%20open%20standard,spec%20(%5B1%5D)。
    • https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
    • https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
    • 很多都不是我的品牌
    • 并且还大量使用了知名的搜索引擎;)
    • 1
  4. Chester Gillon
    2024-02-24T22:07:56+08:002024-02-24T22:07:56+08:00

    另一个答案包含:

    现在,您可以从主机系统通过物理网络接口,但这存在许多问题:

    • 它实际上需要每个虚拟机都有一个可用的网络接口。这显然意味着任何使用笔记本电脑的人都会不走运,但这也意味着大多数大型虚拟机托管提供商也会不走运(他们可能在同一主机上运行数十个虚拟机)。

    作为反驳,单根 IO 虚拟化 (SR-IOV)可用于允许物理 PCIe 设备通过 PCIe 总线多次呈现自身。从上面链接的 NVIDIA(前 Mellanox)页面:

    该技术支持具有独立资源的设备的多个虚拟实例。Mellanox 适配器能够为 Mellanox ConnectX® 系列卡中的每个端口公开多达 127 个虚拟实例(虚拟功能 (VF))。然后可以单独配置这些虚拟功能。每个 VF 都可以视为连接到物理设备的附加设备。功能。它与物理功能共享相同的资源,并且其端口数量等于物理功能的端口数量。SR-IOV 通常与启用 SR-IOV 的虚拟机管理程序结合使用,以提供虚拟机对网络资源的直接硬件访问,因此提高其性能。

    作为 VM 托管提供商的一个示例,Amazon Web Services Linux 上的增强网络页面包含:

    增强网络使用单根 I/O 虚拟化 (SR-IOV) 在支持的实例类型上提供高性能网络功能。SR-IOV 是一种设备虚拟化方法,与传统的虚拟化网络接口相比,它可提供更高的 I/O 性能和更低的 CPU 利用率。增强的网络提供更高的带宽、更高的每秒数据包 (PPS) 性能以及持续更低的实例间延迟。使用增强网络无需额外付费。

    • 0

相关问题

  • 哪些 939 插槽芯片支持 AMD-V?

  • Windows Server 2008 Hyper-V 虚拟化服务器的最佳 RAID 配置?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve