CPU 虚拟化着重于性能,只要有可能就会直接在处理器上运行。只要有可能就会使用基础物理资源,且虚拟化层仅在需要时才运行指令,使得虚拟机就像直接在物理机上运行一样。
CPU 虚拟化与仿真不同。ESXi 不使用仿真来运行虚拟 CPU。采用仿真时,所有操作均由仿真器在软件中运行。软件仿真器允许程序在不同于最初编写时所针对的计算机系统上运行。仿真器通过接受相同的数据或输入并获得相同的结果,来模拟或再现原始计算机的行为,从而实现仿真。仿真提供了可移植能力,并在几个不同平台上运行针对一个平台而设计的软件。
CPU 资源过载时,ESXi 主机将在所有虚拟机之间对物理处理器进行时间划分,以便每个虚拟机在运行时就如同具有指定数目的虚拟处理器一样。运行多个虚拟机的 ESXi 主机会为各虚拟机分配一定份额的物理资源。如果使用默认资源分配设置,与同一主机关联的所有虚拟机都将在每个虚拟 CPU 上收到相同份额的 CPU。这意味着单处理器虚拟机分配到的资源只有双处理器虚拟机的一半。
基于软件的CPU虚拟化
采用基于软件的CPU虚拟化后,客户机应用程序代码直接在处理器上运行,同时转换客户机特权代码并在处理器上运行转换后的代码。
转换后的代码有点大,通常比本机运行速度慢,因此具有少量特权代码组件的客户机应用程序的运行速度与本机应用程序非常接近,而具有大量特权代码组件(系统调用、陷阱或页面表更新等)的应用程序在虚拟环境中的速度可能比较慢。
硬件辅助的CPU虚拟化
一些处理器为CPU虚拟化提供硬件辅助。
使用硬件辅助虚拟化时,客户机可以使用独立的执行模式(客户机模式)。应用程序代码或特权代码等客户机代码均在客户机模式下运行,出现某些事件时,处理器提出客户机模式而进入ROOT模式。管理程序将在ROOT模式中执行,确定退出的原因,采取任何必要的措施,并在客户机模式中重新启动客户机。
将硬件辅助用于虚拟化时,不需要转换代码,因此,系统调用或陷阱密集型工作负载在运行时的速度非常接近本机速度。但是,涉及更新页面表一类的一些工作会导致多次退出客户机模式进入ROOT模式。根据退出的次数和退出所用的总时间,硬件辅助虚拟化可以明显提高执行的速度。
CPU虚拟化的性能影响
根据工作负载和使用的虚拟化类型,CPU虚拟化会增加不同的开销。
如果应用程序的大多数时间用于执行指令而不是等待用户交互、设备输入或数据检索等外部事物,则应用程序受CPU约束。对于此类程序,CPU虚拟化开销包括必须执行的额外指令。此开销应用程序本身可以使用的CPU处理时间。CPU虚拟化开销通常会导致整体性能下降。
对于不受CPU约束的应用,CPU虚拟化可能会提高CPU利用率。如果备用CPU容量可用于吸收开销,则仍然可以在整体吞吐量方面提供不错的性能。
在单处理器虚拟机(而不是带有多个 CPU 的 SMP 虚拟机)上部署单线程应用程序可获得最佳的性能和资源利用率。
单线程应用程序只能利用单个 CPU。在双处理器虚拟机中部署这些应用程序不会加快应用程序的速度。相反,这样会使得第二个虚拟 CPU 使用本该由其他虚拟机以其他方式使用的物理资源。