为 VirtualBox 分配更多“核心”真的有好处吗?

为 VirtualBox 分配更多“核心”真的有好处吗?

我有一台 2.8 四核 i7,带有 VirtualBox。我可以选择为客户机分配最多 4 个核心,但我一直只分配了两个。为客户机分配更多核心有什么优点/缺点?顺便说一句,在运行两个客户机操作系统(Win 7 和 Ubuntu)时,我仍然能够在 Ultra 设置下玩星际争霸 2,BFBC2(我的压力测试器)也是如此。i7 对核心间不均匀负载有何反应?

答案1

您分配给虚拟机的“虚拟”核心可用于客户端操作系统中的多处理。如果您只为虚拟机分配一个核心,那么客户操作系统就没有机会在多个核心之间分配负载。让我们假设一些实际场景:

主机有 4 个 CPU,客户机分配 1 个 CPU

  • 运行 4 个物理核心的主机
  • VM 中的客户端操作系统分配了 1 个核心

在这种情况下,客户操作系统将只能使用一个核心。因此,如果您运行一个在多个核心上扩展性良好的多线程应用程序,它仍然只能在一个核心上运行。因此,客户操作系统上的所有线程都必须共享一个物理核心。

在此设置中运行完全加载 CPU 的客户操作系统将产生约 25% 的主机操作系统 CPU 负载(主机上加载的 4 个核心中的一个)。

当然,您仍然可以在主机操作系统中运行耗费 CPU 的任务并利用剩下的 3 个核心。

主机有 4 个 CPU,客户机分配有 4 个 CPU

  • 运行 4 个物理核心的主机
  • VM 中的客户端操作系统分配了 4 个核心

在这种情况下,您可以在客户虚拟机中运行可扩展的多线程应用程序,从而充分利用所有 4 个虚拟 CPU。VirtualBox 将使用 4 个物理核心来处理虚拟机中安排的任务,因此您的主机 CPU 负载最高可达到 100% 的使用率。

那么您应该选择什么设置?

这个问题的答案很大程度上取决于您想做什么。在某些情况下,将所有核心分配给虚拟机,甚至运行多个虚拟机,为每个虚拟机分配全部 CPU 数量,可能会很有用。在这种情况下,虚拟机可以充分利用主机的整个处理能力。如果分配给虚拟机的 CPU 数量多于实际物理存在的 CPU 数量,则虚拟机将受到不同虚拟机负载的影响。为了防止这种情况,您可以将一些核心专用于特定虚拟机。例如,在 4 核节点上运行 2 个虚拟机,每个虚拟机分配 2 个 CPU,可以帮助每个虚拟机获得 2 个专用 CPU(假设主机操作系统没有施加负载,这也会占用部分处理能力)。

将所有核心分配给虚拟机是否会对我的主机产生负面影响?

这同样取决于软件运行。如果您运行的是空闲的 VM(根本没有运行 CPU 密集型程序),则此 VM 施加的负载将接近 0%。如果所有 VM 都处于空闲状态,您甚至可以并行运行 10 个 VM,并且仍然会遇到接近 0% 的主机 CPU 负载。

CPU 在负载不均匀时会如何表现?

嗯,CPU 负载分配很大程度上取决于 OS 内置的特定组件,即调度程序。对于 Windows XP,调度程序会尝试轮流加载所有 CPU 核心。因此,在四核 CPU 上运行满负荷的单线程任务将使每个核心产生约 25% 的负载。
不幸的是,事实证明这对现代 CPU 电源管理不利。对于现代系统来说,如果一个核心在第二个核心参与之前就加载到 100%,这甚至是一个优势。原因是,只要负载不足以完全用完一个核心,其他核心就可以保持深度睡眠模式以节省能源并减少散热。

对于某些 CPU(如 Intel Core i-Series 和较新的 AMD(Bulldozer)),这更有趣,因为如果只使用部分内核,则未使用的内核将被关闭。这降低了 CPU 的功耗。两者(Intel 和 AMD)都开始使用热量和功耗预算,然后对处于活动状态的内核进行超频。因此,这可以提高单线程应用程序(无法分配给多个内核以并行执行任务)的性能。但是,当所有内核都处于活动状态时,大多数这些“提升”技术对处理能力的影响很小,因为“所有内核都处于活动状态”的情况正是 CPU 的设计目标。但是,当您关闭一些内核时,剩余的内核可以超频运行,而不会导致芯片比所有内核都处于活动状态时更热(或消耗更多电量)。

因此答案是,您的 core i7 可以很好地处理单核上的不均匀负载,甚至可以为单线程应用程序提供性能提升。但是,这种提升在几个百分点的范围内,而实际上,可以将负载分布在多个 CPU 内核上的多线程应用程序在最佳情况下可以按倍数提升(双核上为 2 倍,四核上为 4 倍……)。因此,就组合 CPU 功率而言,多线程总是比单线程结合时钟提升提供更多的功率。

答案2

在评论中别处VirtualBox 专家“mpack”写道:

在现实生活中,许多操作都是磁盘密集型或网络密集型的。只有少数操作是 CPU 密集型的。

您为虚拟机创建的核心越多,这些核心造成的开销就越大(由于上下文切换)。

在实践中,理想的选择通常是分配两个核心到每个虚拟机。

如果您需要全天运行 CPU 密集型任务(例如视频编码),请不要在虚拟机中运行这些任务。在主机操作系统上运行它们:它们在那里运行速度会更快。

相关内容