如果我正在使用Oracle的虚拟机,并且我为虚拟机分配了多个虚拟核心,那么如何分配实际核心?它是否在虚拟机中同时使用真实核心,还是使用模拟核心的东西?
答案 0 :(得分:10)
您的问题几乎就像问:操作系统如何确定运行给定进程/线程的核心?您的计算机始终在做出这种类型的决策 - 它运行的进程/线程比您拥有的核心要多得多。这个具体的答案本质上是相似的,但也取决于客户机的配置方式以及硬件可用于加速虚拟化过程的支持 - 所以这个答案肯定不是决定性的,我不会真正触及主机如何安排代码要执行,但让我们检查两个相对简单的情况:
第一个是完全虚拟化的机器 - 这将是一个没有启用或加速度最小的机器。呈现给guest虚拟机的硬件是完全虚拟化的,即使许多CPU指令只是简单地通过并直接在CPU上执行。在这种情况下,您的guest虚拟机VM的行为与主机上运行的任何进程一样:CPU资源由操作系统调度(要清楚,在这种情况下是主机),并且可以运行进程/线程在他们被允许的任何核心上。默认值通常是可用的任何核心,但可能存在一些优化以尝试将进程保持在同一核心上以允许L1 / L2高速缓存更有效并最小化上下文切换。通常,在这些情况下,您只能将一个CPU分配给客户机操作系统,这大致可以转换为在主机上运行的单个进程。
在稍微复杂的情况下,虚拟机配置了所有可用的CPU虚拟化加速选项。在英特尔发言中,这些被称为AMD的VT-x,它是AMD-V。这些主要支持特权指令,通常需要一些二进制转换/捕获以保护主机和客户端。因此,主机操作系统失去了一点可见性。包含在该硬件中加速MMU支持(这样可以直接访问内存页表而不受虚拟化软件的影响) - 并且可见性会下降一点。最终虽然它仍然主要表现为第一个例子:它是一个在主机上运行的进程,并相应地进行调度 - 只有你可以想到为每个虚拟CPU分配一个线程来运行指令(或传递它们)。 / p>
值得注意的是,虽然您可以(使用正确的硬件支持)为guest虚拟机分配的虚拟核心数量超过可用数量,但这不是一个好主意。通常,这会导致性能下降,因为guest虚拟机可能会使CPU崩溃,并且无法正确调度所请求的资源 - 即使CPU未完全征税。我把它作为一个与多线程程序具有某些相似性的场景,这个程序产生了比可用于运行它们的空闲CPU核心更多的线程(实际上很忙)。如果您使用较少的线程来完成工作,那么您的性能通常会更差。
在极端情况下,VirtualBox甚至支持hot-plugging CPU资源 - 尽管只有少数操作系统正确支持它:Windows 2008数据中心版和某些Linux内核。相同的规则通常适用于将一个客户CPU核心视为主机逻辑核心上的进程/线程的情况,但是主机和硬件本身应该决定将哪个逻辑核心用于虚拟核心。 / p>
说到这一切 - 关于VirtualBox 实际如何分配这些资源的问题......好吧,我没有挖掘代码,所以我当然不能肯定地回答,但它已经我的经验,它通常表现如上所述。如果您真的很好奇,可以尝试在任务管理器中标记VirtualBox VBoxSvc.exe和相关进程,并选择“Set Affinity”选项并将其执行限制在单个CPU中,并查看这些设置是否得到遵守。它可能取决于您可以使用哪种级别的硬件辅助,如果主机尊重这些设置,因为访客可能并未真正作为其中一部分运行。