服务器 频道

虚拟化风暴前夕 微软HyperV技术分析

  Hyper-V还具有一个关于性能的重要特性:多处理器虚拟机,Hyper-V支持4 CPU的Windows Server 2008虚拟机,和2 CPU的Windows Server 2003虚拟机。多处理器虚拟机并不是一个Hyper-V才具有的特性,VMware的ESX Server早已经实现4 CPU的虚拟机,并且是在各种操作系统下(WMware Workstation也能提供2 CPU的虚拟机)。

  如果服务器工作负载需要很高的性能,我们可以考虑使用多处理器的虚拟机。数据库服务器可以消耗掉大量的处理器资源,这时,多处理器虚拟机就是很必须的,就像我们做过的测试那样。当然,只有当工作负载确实需要的时候,才应该使用多处理器虚机,因为管理更多的处理器会带来一些额外的开销。就像早期Window NT具有单处理器和多处理器两种内核一样(单处理器版本去掉了一些多处理器才有的如同步之类的模块,并作了相关优化)。


进程状态及其转换示意图,进程的就在这些状态之间“旋转”

  众所周知,为了保护共享数据,需要一些同步机制,例如锁、信号量等。通常,多处理器操作系统内核和驱动会采用自旋锁(Spin Lock,类似于互斥锁,但是保持时间更短。更详细的信息可以参考《Windows Internals》第四版,P152)的机制,在获得自旋锁之前,线程并不会阻塞,而是一直处于自旋状态,前提是自旋锁只会保持很短的时间。然而在虚拟化条件下,这个前提会被打破,因为虚拟处理器是按照时间片进行调度的。如果在保持自旋锁的时候竞争虚拟处理器,则其他虚拟处理器就要自旋很长时间,导致CPU循环的浪费,降低了虚拟机的性能。显然,多处理器虚拟机在繁忙的负载条件下,这种情况会频繁发生。

  在Windows Server 2008内核以及Hyper-V Hypervisor中加入了一个创新设计,尽可能防止出现自旋锁的长时间等待条件,如果确实存在长时间等待条件,也会有效地加以检测并对其进行处理。这个方法叫做自旋锁启发方法,未实现自旋锁启发方法的虚拟机作系统将停在一个紧凑循环上旋转以等待其他虚拟处理器释放自旋锁,通常这个旋转可能会阻塞其中一个硬件 CPU,从而降低了虚拟化性能。而在自旋锁启发式操作系统中,自旋锁代码会在将要发生旋转时通过Hypercall API通知Hyper-V Hypervisor管理程序,这样Hypervisoer管理程序就可以立即调度执行另一个虚拟处理器并降低不必要的CPU使用。Hyper-V还还在调度程序和内存虚拟化逻辑上进行了优化以使它们在大多数临界区中都不会被锁定,从而确保多处理器系统能够获得很好的延展性。

  在前些天的媒体测试见面会上,微软中国的工程师展示了Hyper-V虚拟机的效率,表明4 CPU的Windows Server 2008虚拟机,其延展性可以和物理4 CPU系统一较高下。当然,具体的提升仍然需要通过测试来评估。

  注:自旋锁启发方法其实不完全是Hyper-V的内容,它更多是Windows Server 2008的核心内容。Vista也实现了这个自旋锁启发方法。

0
相关文章