当前位置: > 虚拟化 Virtualization > Hyper-V >

Hyper-V虚拟机资源基础

时间:2019-11-30 16:39来源:linux.it.net.cn 作者:IT
虚拟机资源基础
 
 本章介绍虚拟机的主要构建块:主板,处理器,内存和存储资源。您将了解如何在物理主机上虚拟化这些构建基块的机制,并探讨在将每个虚拟化资源分配给虚拟机时可使用的配置选项。您还将了解这些选项在不同的常见用法方案中的优点和局限性。通过全面了解虚拟机资源的基础,您将能够根据可用需求正确构建最佳的虚拟机配置。您还将理解为什么需要许多其他技术,以及在本书后面进行解释时应如何利用它们。  在本章中,您将学习:
 
          ◆          描述虚拟机管理程序如何虚拟化虚拟机的资源。
 
          ◆       使用处理器和内存高级配置选项。
 
          ◆         解释VHD / VHDX和直通存储之间的区别。
 
 了解VMBus
 
 在进入虚拟机资源之前,本节比第1章“虚拟化和Microsoft解决方案简介”中提供的高级概述更详细地介绍了Hyper-V架构。了解虚拟化的各种资源的方式非常重要。机器经过设计和启用。第1章中的图1.4显示了虚拟机管理程序直接在硬件上运行,所有虚拟机资源访问均通过虚拟机管理程序提供服务。如果仔细看图,我特意只显示了由管理程序管理的处理器和内存资源。其他资源必须可用于功能全面的环境,例如存储和网络。与系统中的处理器和内存进行通信的机制非常标准化,
 
 存储控制器和网络设备不是这种情况。每个供应商通常都有其自己的特定实现,并且必须提供驱动程序以使操作系统能够与硬件正确通信。用于Windows的驱动程序有数千种,其中大多数是由独立硬件供应商(IHV)编写的。所有这些类型的存储和网络都必须可由Hyper-V使用,因此驱动程序需要可用。Type 1虚拟机管理程序具有两种体系结构:整体式和微内核化,如图2.1所示。
 
 
 
使用单片式管理程序,负责与硬件通信的驱动程序位于实际的管理程序中,该管理程序是一个相当复杂的内核,基本上是一个小型操作系统。虚拟机通过这些专用的设备驱动程序访问硬件,从而获得了非常好的性能,因为虚拟机可以通过虚拟机管理程序中的这些驱动程序直接进入所有硬件。
 
但是,整体管理程序方法存在问题。首先是这些共享驱动程序是专门为系统管理程序编写的,这限制了单片系统管理程序支持的硬件。使用整体管理程序的虚拟化解决方案通常具有较小的硬件兼容性列表。共享的驱动程序基础导致了主要关注点,即安全性和稳定性。使用所有虚拟机的共享驱动程序,如果在管理程序中放置了恶意软件驱动程序,则所有分区都容易受到攻击和监听。此外,如果在管理程序中更新了存在问题的驱动程序,则将导致所有虚拟机出现问题。
 
考虑一下Windows生态系统,它拥有大量的硬件合作伙伴以及组织可能希望使用的数千个存储控制器和网络适配器。尝试为所有硬件创建虚拟机监控程序驱动程序是不切实际的,并且在使用Hyper-V时大幅减少支持的硬件也将不受欢迎。因此,微软选择了微内核 管理程序模型,这就是为什么有Windows Server管理/父分区的原因。通过Hyper-V使用的微内核管理程序模型,供应商为其硬件创建的所有Windows驱动程序仍可以使用并在管理分区中运行,从而无需使用特定于Hyper-V的驱动程序,并且不会减少硬件范围可用于Hyper-V。这也使驱动程序脱离了虚拟机管理程序,从而消除了与整体式虚拟机管理程序有关的安全性和稳定性问题。
 
实际上,虚拟机管理程序实际上仅管理CPU周期和RAM的分配,而不管理其他类型的设备,例如存储和网络。父分区托管一个虚拟化堆栈,其中包括以正常用户模式运行的管理组件。虚拟机管理服务(VMMS)管理虚拟机的状态并启动虚拟机
 
了解VMBus
 
机器工人进程(VMWP)。每个运行的子分区都有一个,它控制子分区的状态变化,启用某些类型的仿真硬件,并启用诸如停止和启动之类的管理活动。
 
图2.2显示了在Hyper-V服务器上运行的任务管理器,其中有一个vmms.exe实例,以及与每个VM对应的许多vmwp.exe实例。后台有一个PowerShell命令,该命令可帮助标识特定虚拟机的工作进程。您需要父分区以及系统管理程序来做任何有用的事情,例如创建子分区。尽管可以单独安装虚拟机监控程序,但是如果没有Windows Server父分区,它将不会做很多事情。
 
图2.2任务管理器显示了单个vmms.exe实例和许多vmwp .exe实例
 
组件也以内核模式运行,例如虚拟机总线(VMBus),它使虚拟服务提供商(VSP)之间的通信成为可能,这些服务允许对非CPU和内存硬件(例如存储和网络)的支持。每个VSP对应于在子分区中运行的多个虚拟服务客户端(VSC)。例如,我们有一个虚拟服务提供商和一个网络消费者,一个存储对,等等。当子分区希望访问不是CPU或内存的硬件资源时,其VSC向父分区上VMBus中托管的VSP发出请求,然后VSP执行与物理硬件的实际通信。
 
如图2.3所示,这是图2.1的更新版本,以更清楚地显示如何为各种类型的硬件资源提供服务。VMBus并非在所有子分区之间共享,并且每个子分区与父分区之间只有一个通道,因此同一服务器上运行的其他子分区无法看到任何通信或数据。即使现在想要访问硬件的子分区实际上已经通过VSC与父分区上托管的VMBus上的VSP通信,该VMBus不会造成任何明显的性能损失,该父分区与硬件进行通信。这是因为VMBus是在内核级别运行的纯内存总线,因此实际上没有引入延迟。通过使用此模型,
 
 
 
父分区托管不属于虚拟机管理程序的所有VM支持组件。如果父分区重新引导或不可用,则所有子分区都不可用。为避免混淆,Hyper-V解决方案的组件在图2.3中未显示。虚拟化基础结构驱动程序(VID,vid.sys)在父内核模式下运行,并为在用户模式下运行的VMMS和VMWP启用管理服务。VID与Windows Hypervisor接口库(WinHv)进行对话,该库通过Hypercall接口与Hypervisor直接通信,该接口与在每个VM(winhv.sys)中运行的WinHv通信。有很多活动部件,但是通常您不需要了解它们。事情就可以了。但是,
 
虚拟机的剖析
 
考虑虚拟化环境的基本目标。一个目标是使多个操作系统实例在单个物理系统上同时执行,这将带来第1章中介绍的许多好处。另一个目标是将物理主机上可用的资源分配给许多虚拟机,并共享给这些虚拟机,作为它们自己的独立系统,与主机上运行的其他虚拟化系统完全隔离。每个虚拟机都认为它是运行它的硬件的唯一用户。在每个虚拟机中,都安装了一个操作系统,并在该操作系统中安装了应用程序,并配置了实现为组织提供服务的配置。
 
操作系统被编写为在硬件上运行,并且期望存在可以与之交互的某些组件,例如计算机的BIOS,存储控制器,输入/输出系统和网络设备。操作系统中包含驱动程序,以查看某些类型的设备,例如网络和存储控制器,以启用操作系统的安装和启动。也可以为没有驱动程序的硬件添加驱动程序
 
 
 
包含在操作系统中。硬件组件的这种基本存在不适用于虚拟机。如前所述,虚拟机的整个环境是合成的,其中抽象资源分配给虚拟机,许多资源利用VMBus。但是,必须具备计算机的关键方面,操作系统才能安装和运行。请注意,在Windows Server 2016中使用SR-IOV网络配置或离散设备分配(DDA)时,物理硬件直接映射到VM。但是,这些是专门的配置,并且VM的核心资源(如芯片组,处理器和内存)仍处于虚拟状态。
 
第1代虚拟机
 
Hyper-V公开的所有合成资源和设备都提供了最高级别的性能和功能,但是,如果操作系统无法本机使用它们,则无法在该合成硬件上安装或启动该操作系统。即使在使用Hyper-V的今天,许多Windows 2000,Windows 2003和Windows XP虚拟机仍在虚拟化运行,并且这些操作系统不支持虚拟化。在来宾操作系统中使用VMBus体系结构需要与其他操作系统组件进行深度集成。它不像在安装过程中安装其他存储或网络驱动程序那样简单。
 
因此,通常需要提供某些类型的硬件来进行仿真,这意味着Hyper-V组件向虚拟机提供看似标准类型的硬件,例如Intel 82371AB / EB IDE控制器,Intel 21140以太网适配器, PS / 2键盘和鼠标,以及带有BIOS的完整虚拟主板。不过,在幕后,Hyper-V解决方案正在运行代码以假装此硬件存在。提供仿真硬件需要虚拟机管理程序中的其他工作负载,这主要是由工作进程为虚拟机vmwp.exe提供的。
 
请记住,vmwp.exe在父分区的用户模式空间中运行,这意味着使用仿真硬件时,它的性能将比合成等效项(仅在内核模式下运行且没有仿真的额外开销)差。物理硬件)。对于通过管理分区的I / O堆栈进行实际的实际硬件通信,仿真的硬件需要在用户模式和内核模式之间进行许多上下文切换,并且通信路径更加复杂。此外,与仿真设备的接口还假定了有关物理机的事情。例如,设置IDE传输涉及七个I / O端口写操作,每个写操作都是对vmwp.exe中的仿真器的单独往返操作,并且会带来巨大的性能损失。
 
术语第一代虚拟机对您来说可能是全新的。在Windows Server 2012 R2 Hyper-V之前,它曾被称为虚拟机。现在有一种新型的虚拟机,我将在“第2代虚拟机”一节中介绍,这就是为什么现在要进行名称区分的原因。将第1代虚拟机视为自Windows Server 2008 Hyper-V以来您认识并喜欢的虚拟机,但有一些改进。除非您要在具有最新操作系统的Windows Server 2012 R2上部署所有全新的虚拟机,否则您将继续使用第一代虚拟机一段时间,这根本不是问题。请记住,第1代虚拟机不仅完全支持VMBus和合成硬件,而且在需要时还提供对仿真硬件的支持。
 
虚拟主板和BIOS
 
虚拟机的核心是虚拟主板和基本输入/输出系统(BIOS)。这提供了启动虚拟机,选择启动设备以及将控制权移交给已安装的操作系统所需的环境。Microsoft为虚拟机使用American Megatrends BIOS。
 
但是,您不能以与访问物理机的BIOS相同的方式访问虚拟机的BIOS(例如,通过按Esc或Delete键)。相反,与BIOS启动和引导顺序有关的选项是通过使用BIOS区域的虚拟机属性配置的,如图2.4所示。注意,该图显示了可以设置Num Lock状态以及第1代虚拟机(CD,IDE,旧版网络适配器和软盘)中支持的引导设备的类型。下一章将介绍网络适配器的类型,但是现在您知道,传统网络适配器是模拟网络适配器,而不是利用VMBus的合成网络适配器。通常,您从不 除了非常特殊的用例外,还希望使用旧版网络适配器,并通过网络进行引导。
 
图2.4
 
第1代虚拟机可能具有的BIOS配置。可以使用上移和下移按钮更改引导顺序。
 
通过Hyper-V提供的虚拟主板在来宾操作系统中启用了许多其他系统设备。可以在设备管理器(devmgmt.msc)的“系统设备”部分中看到它们,但是通常您不会与这些项目进行交互。
 
那时间呢?
 
物理母板具有一个小电池和一个实时时钟(rtc)来跟踪时间。但是大多数操作系统的工作方式是在启动时从rtc读取时间,然后使用其自己的内部例程来计算经过的时间。虚拟机的问题在于,由于交付虚拟机资源的方式,用于计算时间的例程无法正确运行,这意味着虚拟机中的时间会漂移。
 
为解决此问题,hyper-V使用时间同步集成服务,该服务可在虚拟机中保持时间正确。您可能会看到虚拟机首次从保存的状态或检查点启动或恢复时出现的时间异常(虚拟机的时间点保存视图),但是这些时间应该在同步集成服务加载后迅速解决。将解决问题。即使虚拟机位于其他时区或属于与域控制器同步时间的域的一部分,也应保留时间
 
启用了同步集成服务。时间同步服务将与其他时间源一起很好地工作。运行w32tm / query / source命令以检查操作系统的时间源。hyper-V虚拟机应显示以下内容:
 
C:\> w32tm / query / source
 
VM IC时间同步提供程序
 
这些年来,域控制器的指南已经发生了变化。建议完全禁用时间同步,然后使用以下命令仅禁用部分服务:
 
REG ADD HKLM \系统\ CurrentControlSet \服务\ W32Time的\ TimeProviders ↵ \ VMICTimeProvider / v启用/吨REG_DWORD / d 0 再次,虽然,该建议是只禁用时间同步集成服务完全按照时间服务部分记录在以下位置:
 
http://technet.microsoft.com/zh-cn/library/virtual_active_directory_domain_ controller_virtualization_hyperv(WS.10).aspx
 
我的建议是定期进行检查,但是从根本上说,hyper-V在控制漂移方面已变得更好,因此可以最大程度地减少已经从另一个源进行同步的虚拟机所需的时间同步。
 
IDe控制器
 
本章稍后将详细介绍处理器和内存。系统的另一个“必不可少”组件是存储(从技术上讲,您不需要网络,尽管没有一个系统通常不会很有用)。第1代虚拟机必须从连接到IDE控制器的存储启动,如前所述,该存储模拟了Intel 82371AB / EB IDE控制器。这使得几乎所有操作系统都可以安装在Hyper-V虚拟机中,因为Intel 82371AB / EB IDE控制器是通用的,并且驱动程序内置在每个主要操作系统中。
 
第1代虚拟机中提供了两个IDE控制器:IDE控制器0和IDE控制器1。每个IDE控制器最多可以连接两个设备,它们可以是硬盘驱动器或DVD驱动器。通常,唯一使用DVD驱动器的时间是可以通过将操作系统安装ISO附加到驱动器来选择将操作系统安装到新虚拟机中的选项,尽管也可以映射到主机中的物理DVD驱动器。 。还可以安装或更新Windows Server 2016之前以ISO形式提供的Hyper-V集成服务,但现在通过Windows Update将其提供给来宾OS。
 
两个具有两个设备的IDE控制器每个最多允许连接四个存储设备,这似乎很有限。在大多数虚拟机中,仅将IDE控制器用于引导硬盘,而所有数据驱动器都将连接到合成SCSI控制器。
 
您可能正在看似明显的事情。在本章中,我一直在说仿真硬件是不好的,它是由父分区中的用户模式进程(vmwp.exe)提供的(性能差),并且尽可能避免使用它。现在,我说的是每个Hyper-V虚拟机都必须从连接到仿真IDE控制器的硬盘启动。这是否意味着每个虚拟机的操作系统磁盘的磁盘性能都会很差?是的,有一点,但大部分都不是,因为Hyper-V的架构师使用IDE控制器做了一些非常聪明的事情。
 
IDE控制器必须模拟通用的IDE控制器,以提供与所有操作系统的兼容性,在这些操作系统中,组件需要使用本地无法提供的,支持VMBus的合成设备。一旦在Hyper-V虚拟机中安装了操作系统,第一步就是安装Hyper-V集成服务,这可以使操作系统处于虚拟状态,并允许其利用可通过VMBus使用的合成设备。Integration Services还可以使Hyper-V与操作系统之间实现更紧密的集成,例如时间同步,数据交换,备份服务,关闭等。安装和加载集成服务后,快速通过滤波器(storflt)。因此,它与也可用的综合SCSI控制器的性能相匹配。这意味着,如果已安装Hyper-V Integration Services,则在操作系统启动后,在虚拟机中使用IDE或SCSI控制器之间不会有性能差异。SCSI控制器确实提供了其他功能,这就是为什么仍首选将其用于数据磁盘等资产的原因。
 
SCSI控制器
 
默认情况下,第1代虚拟机没有SCSI控制器,但是可以使用虚拟机属性页的“添加硬件”区域将多达四个SCSI控制器添加到虚拟机,如图2.5所示。虚拟机具有四个SCSI控制器后,添加SCSI控制器的选项将显示为灰色。SCSI控制器是一种完全利用内核内存VMBus的纯合成设备,它实质上提供了最高的裸机存储性能。术语裸 - 金属指不使用虚拟化的系统。将某物与裸机进行比较时,则将其与非虚拟化环境进行比较。在这种情况下,研究表明,与基础存储的原始性能相比,使用连接到SCSI控制器的存储不会造成性能损失。
 
图2.5将scsi控制器添加到第一代虚拟机
 
每个SCSI控制器最多支持连接的64个硬盘驱动器,最多等于通过SCSI总线连接的256个磁盘。像IDE控制器一样,这些硬盘可以是虚拟硬盘,也可以映射到主机上的物理硬盘(直通存储)。SCSI控制器还支持将磁盘热添加/热插到正在运行的虚拟机,IDE控制器没有此功能。SCSI控制器在Windows Server 2012 R2中提供了更多功能:
 
          ◆       多个虚拟机之间共享的VHDX
 
          ◆     动态调整VHDX文件的大小
 
始终在虚拟机中尽可能使用SCSI连接的磁盘,并将IDE连接的磁盘限制为用于操作系统和DVD驱动器。
 
COM端口
 
第1代虚拟机包括两个COM端口,COM 1和COM 2,可以将它们连接到Hyper-V主机本地或远程计算机上的命名管道。通常不建议使用COM端口,并且通常仅限于某些类型的来宾内核调试方案。
 
USB端口
 
如果您正在查看虚拟机设置对话框,则可能想知道在哪里可以找到USB设备。如何将连接到Hyper-V主机的USB设备直接映射到虚拟机?您将找不到它,而现实是您不想找到它。
 
在虚拟机中有两种访问USB设备的方案:
 
          ◆      作为用户与虚拟机的会话的一部分
 
◆  虚拟机始终可用—例如,一个软件或服务必须具有功能的USB加密狗
 
Hyper-V不允许将主机上连接USB的设备传递到虚拟机。这将破坏虚拟机从硬件的期望抽象,从而停止虚拟机移动。但是,这并不意味着没有解决方案。
 
对于第一种情况,USB设备可作为用户在虚拟机上的会话的一部分使用,解决方案是使用远程桌面协议(RDP)功能将用户本地设备上本地连接的USB设备直接传递给远程设备。虚拟机。使用Windows Server 2012和RemoteFX技术,几乎可以通过RDP重定向任何USB设备。
 
第二种情况是,即使用户未登录,也要将USB设备始终连接到虚拟机,需要使用启用IP over USB的第三方解决方案。该解决方案通过使一台物理服务器与所有USB设备连接在一起并运行一项服务来使USB设备能够通过IP进行远程访问而起作用。然后,虚拟机运行一个客户端软件,该客户端软件通过IP连接到USB设备,并使VM看起来像本地USB设备。这些类型的解决方案的好处在于,虚拟机仍然可以在主机之间移动,而不会丢失与USB设备的连接。有许多解决方案可用,但在以下位置介绍了我在客户环境中看到的两种解决方案:
 
www.silexamerica.com/products/connectivity-solutions/device-networking/usb-
 
并行连接/ sx-ds-3000wn / www.digi.com/products/usb/anywhereusb#overview
 
第2代虚拟机
 
早些时候我说过:“每个虚拟机都认为它是运行它的硬件的唯一用户”,而重点是该操作系统没有意识到它在虚拟机管理程序上运行,这就是为什么有这么多的原因第1代虚拟机中的仿真硬件。需要各种PS / 2键盘和鼠标设备,IDE控制器,用于PXE引导的旧版网络适配器,PCI控制器等,以便操作系统可以在虚拟环境中工作,因为它们本质上不了解虚拟化,因此无法本地使用虚拟化或合成设备。
 
首次引入虚拟化并需要其支持操作系统(例如Windows NT 4和Windows 2000)时,确实如此,但是对于现代操作系统(例如Windows Server 2012甚至最新的Linux发行版)来说,现实是他们本身就了解虚拟化并且完全是虚拟化的开明。他们可以使用虚拟设备而无需安装其他驱动程序,并且不需要“物理硬件”元素。现代操作系统旨在在物理和虚拟环境中运行。
 
Windows Server 2012 R2 Hyper-V中引入了第二代虚拟机。它专注于本来可以虚拟化的新一代操作系统,不需要IDE控制器,PS / 2 I / O设备,COM端口,旧版网络适配器,软盘驱动器和所有其他其他模拟的主板组件(例如PCI-to-ISA桥)。第2代虚拟机删除了这些仿真组件,从而提供了一个更简单,简化的虚拟机,该虚拟机还通过从BIOS切换到统一扩展固件接口(UEFI)(例如安全启动)(默认启用)来启用最新的操作系统功能。安全启动可确保从UEFI安全切换到操作系统,而无需任何其他方(例如恶意软件,在硬件和操作系统之间注入自己。在Windows Server 2012 R2中,安全启动适用于Windows来宾操作系统,而在Windows Server 2016中,此支持也扩展到Linux来宾操作系统。
 
第2代虚拟机可以从连接了SCSI控制器的硬盘和DVD驱动器引导,也可以从合成网络适配器引导以启用PXE引导方案。第2代虚拟机没有IDE控制器,软盘驱动器或旧版网络适配器选项。
 
通过Hyper-V Manager图形界面也没有可用的COM端口。如果在第2代虚拟机中需要COM端口用于远程内核调试,则可以使用Set-VMComPort PowerShell cmdlet添加一个COM端口。但是,与使用串行端口(例如使用综合调试)相比,虚拟机存在更好的选择。如果COM端口在引导时没有关联的命名管道,则该COM端口在虚拟机中将不可见。还要记住,内核调试与安全启动不兼容,因此,如果您需要执行内核调试(而我们中的许多人则不会!),请使用Set-VMFirmware -EnableSecureBoot Off关闭安全启动。
 
在图2.6中,您看到第二代虚拟机旁边的第一代虚拟机,其中显示了设备管理器以及BIOS模式和版本。请注意,第2代虚拟机中不存在大量硬件,因为对于本机虚拟化具有启发性的操作系统不需要此硬件。
 
 
 
 
 
在撰写本文时,可以在第2代虚拟机中安装以下操作系统:
 
 
Windows Server 2012
 
 
Windows Server 2012 R2
 
 
Windows Server 2016
 
 
Windows 8 64位
 
 
Windows 8.1 64位
 
 
Windows 10 64位
 
 
某些具有本地UEFI支持和Hyper-V SCSI控制器的64位Linux发行版,例如Ubuntu 14.04
 
最大的限制是需要操作系统完全本地支持UEFI,而Windows 8 / Windows Server 2012之前没有此功能,只有Windows的64位版本支持UEFI。有关Windows对UEFI支持的良好概述,请参见:
 
http://msdn.microsoft.com/zh-CN/windows/hardware/gg463149.aspx
 
使用第2代虚拟机的主要好处是能够从合成SCSI控制器或网络设备启动,以及将与启动时恶意软件相关的风险降到最低(通过利用UEFI安全启动功能)。在Windows Server 2016中,新的虚拟TPM和受保护的VM功能仅适用于第2代VM。与第1代虚拟机相比,在第2代虚拟机上安装和引导操作系统所需的时间更少,但是在引导虚拟机之后,性能没有任何差异。当创建虚拟机且无法更改虚拟机时,将选择第1代与第2代。单个Hyper-V服务器可以混合使用第1代和第2代虚拟机。
 
在决定使用第1代或第2代时,如果您不需要与Windows Server 2012 Hyper-V向后兼容,我的建议是使用第2代。也不要求与其他公共云服务兼容,例如Windows Azure基础架构即服务(IaaS),在撰写本文时,该服务不支持第二代虚拟机。这将随着时间而改变。
 
将第1代虚拟机转换为第2代
 
将第1代虚拟机转换为第2代虚拟机的问题经常出现,但现实情况是,在大多数情况下您不需要这样做。第1代虚拟机将继续工作,并且性能与第2代虚拟机相同。但是,如果您真的要进行此转换怎么办?您无法完成,或者至少没有大量工作就无法做到。
 
第1代虚拟机基于Bios,相当于某个磁盘配置,例如ntFs系统分区。第2代虚拟机基于ueFi,并使用Fat32系统分区。仅此一项就禁止在第一代和第二代虚拟机之间移动虚拟硬盘。还记得第一代计算机从ide控制器启动,第二代计算机从scsi控制器启动。
 
从第一代迁移到第二代的唯一方法是从Windows Pe引导虚拟机,将分区捕获到WiM文件,然后重新部署到第二代虚拟机。但是,这种努力是不值得的。第2代最好保存在新的虚拟机上。
 
VMCX配置文件
 
在Windows Server 2016之前,虚拟机的配置存储在XML文件中,该文件可以在XML或文本编辑器中读取。还可以编辑文件,以在受支持的机制(例如Hyper-V Manager和Hyper-V PowerShell cmdlet)之外对配置进行更改,这可能会导致问题。此外,由于文件的基于文本的性质,如果发生计划外的断电或失去对存储的访问,则文件很容易受到损坏。
 
除了包含VM的资源状态数据的新VMRS文件之外,Windows Server 2016移至新的基于二进制的配置文件VMCX文件。无法通过文本编辑器读取VMCX文件,并且该文件可抵抗存储或电源故障造成的损坏。
 
查看和修改配置的正确方法是通过上述方法
 
Hyper-V管理工具。但是,可以使用PowerShell转储VMCX文件的配置。我发现最好的方法是在VMCX文件中创建一个包含配置副本的临时对象。这样就可以从作为VMCX配置副本的临时对象中查看所有数据。例如:
 
$ tempVM =(Compare-VM -Copy -Path。\ yourvmcxfile.vmcx -GenerateNewID).VM 您可以使用以下方法检查所有关键属性:
 
$ tempVM | 选择 *
 
还可以查看作为对象一部分的特定集合,例如网络适配器和磁盘。例如:
 
$ tempVM.NetworkAdapters $ tempVM.HardDrives
 
$ tempVM.FibreChannelHostBusAdapters
 
如果键入$ tempVM并按Tab,PowerShell将显示所有可用选项。
 
虚拟机配置版本
 
每个版本的Hyper-V都引入了一个新的VM配置版本,该版本公开了新功能。Windows Server 2016引入了新的VM配置版本8。表2.1显示了适用于每种Hyper-V版本的各种配置版本。
 
 
 
表2.1:                Windows服务器版本的VM配置版本
 
hyper-V版本
 
支持的VM配置版本
 
Windows Server 2008
 
1个
 
Windows Server 2008 SP1
 
2
 
Windows Server 2008 R2
 
3
 
Windows Server 2012
 
4
 
Windows Server 2012 R2
 
5(和4从2012年启用实时迁移,但是一旦迁移,它将自动升级到版本5)
 
Windows Server 2016
 
8和5
 
请注意,Windows Server 2016同时支持8和5,因为2016年前的兼容性可能需要5。在2016年创建的新VM将使用新的VM配置版本8,而在2012 R2中创建的VM将保留版本5,除非手动对其进行了转换。将VM转换为新的VM配置版本时,其基于XML的配置将转换为二进制VMCX格式,并为运行时状态创建VMRS文件。
 
可以使用Hyper-V Manager或PowerShell完成此转换。图2.7显示了从Windows Server 2012 R2导入的配置版本5 VM的配置版本更新上下文菜单选项。
 
 
 
图2.7
 
虚拟机配置
 
使用hyper-V升级
 
经理
 
要使用PowerShell执行转换,请使用以下命令:
 
Update-VMVersion-名称“ <VM名称>”-确认:$ false
 
请注意,在将虚拟机配置版本升级到8后,不能将转换回退到5。因此,在将虚拟机升级到版本8之前,请确保不需要向后兼容。
 
处理器资源
 
了解了虚拟机的核心结构之后,就该转移到处理器了,这是虚拟机最有趣和最常用的资源之一。了解与处理器资源有关的一些术语以及这与虚拟化和Hyper-V的关系非常重要。
 
处理器,内核和逻辑处理器的数量与Windows Server和Hyper-V支持的内存量之间存在差异。随着具有多个处理核心的新处理器以及超线程等技术为理解处理器增加了更多的复杂性,对逻辑和虚拟处理器的审查非常重要。
 
主板有一个或多个插槽,可以安装处理器。这就是为什么套接字和处理器有时可以互换使用的原因。每个处理器具有一个或多个处理核心。早期的处理器只有一个核心,但是多核处理器从双核处理器开始,然后是四核,成为主流,今天有10核处理器可用。每个内核就像一个独立的处理器,能够执行自己的程序指令执行,尽管这些内核共享一个公共的总线接口和某些类型的处理器缓存,如第1章所述。
 
在许多类型的程序指令执行中,并未利用所有内核的执行资源,因此英特尔推出了超线程技术。该技术使单个处理器内核看起来像两个处理器内核(称为逻辑处理器),并允许两个指令线程在每个处理器内核上运行。通过允许处理器在两个指令线程之间切换以保持内核繁忙,从而提高了总体吞吐量。指令线程在等待资源时停顿是很常见的。使用超线程,如果一个线程停滞,则可以执行另一线程。内核上仍然只有一个执行资源,因此超线程不会使性能提高一倍。改进程度各不相同,但是在10%到15%之间的性能改进是可以接受的值。
 
图2.8显示了我的Windows Server 2012 R2盒子之一上的任务管理器。它具有两个Intel Xeon处理器,它们是八核处理器,并启用了超线程。请注意,套接字数为2,核心数为16,而逻辑处理器数为32,因为超线程将每个核心拆分为两个逻辑处理器。
 
图2.8逻辑处理器视图中的任务管理器,显示了物理处理器和逻辑处理器详细信息
 
在Windows Server 2012之前,Windows Server的各种SKU(版本)具有不同的功能和可伸缩性。Windows Server 2012对此进行了更改。Windows Server 2012 Standard和Datacenter具有相同的可伸缩性和功能,最多支持管理程序可访问的320个逻辑处理器和4TB内存。每个虚拟机最多可以分配64个虚拟处理器。这些可伸缩性数字在Windows Server 2012 R2 Hyper-V中没有变化,因为它们不需要。使用Windows Server 2012
 
Microsoft发现每个虚拟机具有64个vCPU的Hyper-V可扩展性功能,
 
现在,全球99%的SQL Server实例都可以在Hyper-V上进行虚拟化。Windows Server 2016引入了标准SKU和数据中心SKU之间的功能差异,但是两者的可伸缩性相同,并且与Windows Server 2012相同。
 
具有多个逻辑处理器对于虚拟化很有用。为了从普通系统上的许多逻辑处理器中受益,必须编写正在使用的应用程序以利用多个执行线程。或者,可以同时使用许多应用程序,并且操作系统将在可用逻辑处理器上分发它们。通过虚拟化,每个虚拟机都分配有一定数量的虚拟处理器(vCPU),然后映射到逻辑处理器。一个逻辑处理器可以由多个虚拟处理器使用,因为根据需要,逻辑处理器的容量会在虚拟处理器之间分配。这的工作方式与共享处理器的操作系统中的应用程序之间发生的时间分割类似。
 
在Windows Server 2012之前,对于所有工作负载,支持的比率是每1个逻辑处理器8个虚拟处理器(8:1),但Windows VDI环境除外,在Windows VDI环境中该比率为12:1。这样做是为了确保在分配给虚拟机的虚拟处理器方面,主机不会超负荷使用。例如,如果比率为8:1,则系统总共有8个逻辑处理器,则可以为该主机上运行的所有虚拟机总共分配多达64个vCPU。请注意,一个虚拟机永远不能分配超过服务器中逻辑处理器数量的虚拟处理器。采用相同的8个逻辑处理器,这意味着单个虚拟机分配的虚拟处理器不能超过8个。但是,我可以有8个虚拟机,全部具有8个虚拟处理器(或任何其他较小的组合,前提是总数不超过64个虚拟处理器)。Windows Server 2012中删除了虚拟处理器与逻辑处理器的可支持性比率。如果您测试环境且该环境有效,那么Microsoft将支持它。虚拟机中的虚拟处理器数量仍然不能超过服务器中存在的逻辑处理器数量。Hyper-V主机最多支持2,048个虚拟处理器。虚拟机中的虚拟处理器数量仍然不能超过服务器中存在的逻辑处理器数量。Hyper-V主机最多支持2,048个虚拟处理器。虚拟机中的虚拟处理器数量仍然不能超过服务器中存在的逻辑处理器数量。Hyper-V主机最多支持2,048个虚拟处理器。
 
即使已删除支持的比率,这也不意味着在构建Hyper-V环境时不需要仔细计划。虚拟化无法神奇地启用比物理可用资源更多的处理资源。对于CPU使用率非常低的虚拟机(例如大约10%),将8个虚拟处理器配置为1个逻辑处理器将是不错的选择,并且物理内核的平均利用率约为80%。如果虚拟机具有较高的处理器利用率,则8:1的比率将导致性能不佳,因为虚拟机会不断等待物理内核上的周期。
 
某些应用程序(例如SQL Server和Exchange)具有自己支持的虚拟处理器与逻辑处理器的比率,该比率可以低至1:1。我将在本章稍后详细介绍。但是,由于超线程实际上产生的附加性能相当低,因此,我更倾向于仅在考虑虚拟与物理比率时才对处理器内核进行计数。如果我有一个具有4个处理器核心的Hyper-V主机,即使启用了超线程,我也会考虑32个虚拟处理器的最大数量。图2.9显示了物理处理器到核心,逻辑处理器到虚拟处理器的映射的高级视图。
 
图2.9
 
逻辑观点
 
处理器虚拟       ħ yper 处理器映射
 
Ť hreading
 
64个逻辑处理器
 
                                        1个处理器      8核
 
 
 
                                                                 将320个支持的逻辑处理器                           分配给虚拟机
 
                                                                 每台主机2048个的虚拟处理器的                                  机
 
请注意,Hyper-V中没有处理器相似性的概念。您不能强制某个虚拟处理器始终映射到同一逻辑处理器。在等待处理器可用时,这可能会导致性能下降,并且还破坏了从物理资源中抽象虚拟资源的目标。
 
我应该关闭超线程吗?
 
超线程不会造成任何危害,并且可能会提高性能,除非它将逻辑处理器的数量提高到320以上,这是hyper-V支持的最大数量。如果超线程导致320个以上,则超管理程序可以使用超线程提供的那些逻辑处理器代替物理内核。因此,如果超线程将逻辑处理器的数量推到320以上,请在服务器的Bios / ueFi中将其关闭。
 
虚拟处理器到逻辑处理器的调度
 
如何将虚拟机的虚拟处理器分配给逻辑处理器进行计算很有趣。考虑最简单的方案:虚拟机上的单个虚拟处理器。当虚拟处理器需要执行计算时,系统管理程序将计算调度到可用的逻辑处理器,如图2.10所示。
 
图2.10将单处理器VM中的虚拟处理器分配给主机上的逻辑处理器
 
对于具有多个虚拟处理器的虚拟机,对称多处理(SMP)环境,这变得更加复杂。问题在于,操作系统认为所有处理器都可以同时运行,因为操作系统将排他性地拥有硬件,并且可以允许不同处理器上不同计算之间的相互依赖性。在虚拟环境中,这是一个问题,因为许多虚拟处理器正在使用相同的逻辑处理器。因此,系统管理程序中的虚拟处理器调度程序可能会出现问题。
 
考虑图2.11,其中两个虚拟机现在具有多个处理器。如果处理器计划程序必须同时将VM中的所有虚拟处理器计划到逻辑处理器,则虚拟处理器计划程序突然变得效率低下。即使当前未工作的虚拟处理器也将作为一组在逻辑处理器上进行调度,并且在有相等数量的逻辑处理器可用于确保VM的计算可以采用之前,无法调度VM中的任何虚拟处理器。同时放置。考虑一个使用率很高的服务器,该虚拟机最多可以有64个虚拟处理器。试图以这种方式对处理器进行分组和调度存在很大问题。这种调度称为帮派调度,因为当多处理器虚拟机需要调度处理器时,所有虚拟处理器都会“组合”在一起,并针对可用逻辑处理器一起进行调度。
 
 
 
这是一个很好的类比:考虑与一群朋友出去吃饭。您坐下,打开菜单,确切地知道您想吃什么。然后您继续坐在那里15分钟,直到其他人都决定要点什么为止,因为您必须同时订购所有东西。从本质上讲,您是团伙安排。
 
没有人能够创建一个不会导致延迟和效率低下的完美帮派调度程序。由于这种组调度,对于某些虚拟机管理程序,您需要尽可能减少每个虚拟机的虚拟处理器数量。
 
Hyper-V不使用组调度,而是采用另一种方法来处理多处理器虚拟机以及对逻辑处理器的调度。请记住,问题在于操作系统认为所有处理器都可以同时运行。Microsoft并没有尝试解决此问题,而是修复了操作系统内核本身,以使操作系统不再假定所有处理器都将在同一时间进行调度。这使Hyper-V能够彼此独立地调度来自多处理器虚拟机的虚拟处理器,从而仅在具有工作负载时才调度虚拟处理器。这称为免费处理器调度。此修复程序是在Windows Server 2008中进行的,因此Windows Server 2000仅支持单个处理器。对Windows Server 2003 Service Pack 2和Windows XP Service Pack 3中的内核进行了有针对性的更改,该更改允许配置两个虚拟处理器。由于群发调度不与Hyper-V一起使用,因此没有指导来限制虚拟机中虚拟处理器的数量。拥有大量空闲处理器仍然会带来一些开销,但是这是相当少的,并且与使用组调度的虚拟机监控程序的影响相去甚远。在我的实验室环境中,几乎我所有的虚拟机都有两个处理器,有的则有八个。
 
使用与Hyper-V相同的晚餐比喻,可以让您随时准备点晚餐,然后吃点东西。但是,这可能是您不良的就餐礼节,很可能使您无法参加以后的晚餐活动,并使您将来有很多单独用餐的习惯。
 
https://technet.microsoft.com/library/mt126119.aspx 记录并更新了Hyper-V的每个来宾操作系统支持的虚拟处理器的确切数量,但是主要的数字如表2.2所示。请注意, Microsoft站点上未列出Windows Ser ver 2000和Windows Server 2003,因为它们不再受支持。Windows Server 2000仅支持一个处理器,Windows Server 2003仅支持两个处理器。
 
 
 
表2.2:                虚拟处理器的最大数量
 
操作系统
 
虚拟处理器数量
 
Windows Server 2008 R2及更高版本
 
64
 
Windows Server 2008 SP2
 
4
 
现代支持的Linux发行版(rhel   5.9 +,suse 11 sP2 +,ubuntu 12.04+)
 
64
 
Windows 8及以上
 
32
 
Windows 7的
 
4
 
Windows Vista sP2
 
2
 
重要的是要了解帮派安排还不错。相反,目前没有一种有效的算法可以使用它。将来,可能会创建完美的算法,然后看到Hyper-V实现某种类型的帮派调度,我不会感到惊讶。处理器分配
 
在为虚拟机分配处理器时,可以分配1到64(或系统中逻辑处理器的数量)之间。此外,可以设置其他三个值来帮助控制处理器资源的使用。这些是虚拟机保留(百分比),虚拟机限制(百分比)和相对权重:
 
虚拟机储备(百分比)  为此虚拟机保留的处理器数量,因此始终可用。如果主机具有4个逻辑处理器,并且虚拟机具有1个虚拟处理器,并且保留设置为50%,则意味着该虚拟机始终可以使用其中一个逻辑处理器的一半。请注意,这并不意味着它是相同的内核或全部来自同一内核,但是管理程序将确保虚拟机始终具有该虚拟机可用的逻辑处理器的一半。如果虚拟机未使用全部保留,则其他虚拟机可能会访问处理器资源。但是,一旦具有保留空间的虚拟机需要CPU,它将优先处理并保证其完全分配。“总系统资源的百分比”值显示分配的储备相当于总系统资源的百分比。如果为虚拟机分配了8个虚拟处理器,保留了25%的空间,并且服务器总共有16个逻辑处理器,则这意味着所保留的系统资源总数的百分比为12%(实际上为12.5%)。
 
虚拟机限制(百分比) 虚拟机可以使用的最大处理器数量。默认值为100%,这意味着该虚拟机可以使用分配的处理器的全部资源。请注意,在发生资源争用时,虚拟机可能无法获得全部的100%,但是它将始终获得其预留量。
 
相对权重 用于确定虚拟机在资源争用时获得CPU时间份额的重要性。例如,权重为200的虚拟机所获得的CPU周期数是权重为100的虚拟机所获得的CPU周期数的两倍。
 
尽管启动虚拟机后无法更改虚拟机的处理器数量,但是可以在虚拟机运行时修改虚拟机预留(百分比),虚拟机限制(百分比)和相对权重值。这使您可以动态调整虚拟机的处理器资源。这样一来,您可以为虚拟机分配比通常所需更多的处理器,但是您可以将“虚拟机限制(百分比)”值设置为50%之类,以便仅使用一半的容量。如果在虚拟机运行时需要更多处理器,则可以增加该值。通常,操作系统不会“浪费”处理器资源,因此通常不需要这种限制,
 
解决超大型Hyper-V虚拟机的“挂起”问题
 
对于具有32个以上虚拟处理器的虚拟机,有时我会看到该虚拟机在登录后30秒内挂起(同时启动服务器管理器并使用了处理器资源)。经过调查,我发现问题在于hyper-V主机中的大量逻辑处理器已进入c3睡眠状态,这是一种深度睡眠状态,可以在处理器空闲时节省电能。问题似乎是由所有这些逻辑处理器试图同时唤醒并彼此竞争引起的。对我来说,解决方案只是使用以下命令在hyper-V主机上的处理器上禁用c3睡眠状态:
 
reg.exe添加HKLM \ System \ CurrentControlSet \ Control \ Processor / v功能↵ / t REG_DWORD / d 0x0007e066
 
然后,我将重新启动服务器,而我的问题已解决。
 
Windows Server Hyper-V具有针对每个虚拟机设置的另一个与处理器相关的设置。此设置为“迁移到具有不同处理器版本的物理计算机。”由于处理器的体系结构和指令集完全不同,因此无法使用迁移技术在Intel和AMD处理器之间迁移虚拟机。但是,默认情况下,您也无法在具有相同处理器系列的不同版本的服务器之间迁移。尽管两个服务器都可能具有Intel处理器,但是不同的处理器可能具有不同的功能,特性和指令,这是一个问题,因为某些应用程序在开始检查处理器功能时会执行测试。如果应用程序检查处理器并确定它具有特定的指令集,然后使用迁移技术将其移动到具有不支持特定指令的其他处理器的服务器,则在应用程序进行调用时,应用程序可能崩溃。为了解决此问题,Hyper-V增加了在来宾操作系统中隐藏处理器的许多更高级别功能的功能。即使处理器版本不同,也可以在群集的节点之间移动来宾操作系统,因为虚拟操作系统仅暴露于处理器系列所有版本中都存在的通用指令。该功能不会扫描处理器,并且不会公开集群中所有处理器中最低的通用功能集。它只限于一个通用的基本集,该基本集低于集群中的所有处理器。除非您知道您将需要在具有不同版本的主机之间移动的能力,否则不要启用此设置,因为隐藏处理器的指令可能会对应用程序和服务产生性能影响,否则将使用这些指令来提高性能。也可以使用PowerShell通过以下命令进行设置:
 
Set-VMProcessor -CompatibilityForMigrationEnabled $ true
 
启用此设置后隐藏的确切说明如表2.3所示。
 
 
 
表2.3:在                 启用处理器兼容性的情况下隐藏的流程功能
 
英特尔处理器
 
aMD处理器
 
ssse3,sse4.1,sse4.2,PoPcnt,未对齐的sse,XsaVe,aVX
 
ssse3,sse4.1,sse4.a,sse5,PoPcnt,lZcnt,未对齐的sse,amd 3dnow !、扩展了amd 3dnow!
 
在Windows Server 2012 Hyper-V之前,还具有启用运行较早操作系统(例如NT 4)的设置,但是该选项已从Hyper-V管理器图形用户界面中删除。对于较早的操作系统,问题在于,现代处理器返回的功能信息多于操作系统所能处理的信息,并且它将显示蓝屏(这在Windows NT 4 SP6中已修复)。仍然可以设置此选项,但是必须使用PowerShell配置它:
 
Set-VMProcessor -CompatibilityForOlderOperatingSystemsEnabled $ true
 
了解这两种设置的一种好方法是利用
 
Sysinternals,可以列出处理器的所有功能。您可以在以下位置找到它:http : //technet.microsoft.com/zh-cn/sysinternals/cc835722.aspx
 
在未启用任何兼容性的情况下在处理器上运行Coreinfo时,我看到了操作系统可用的所有功能。启用的功能显示*而不是-。当我在同一台虚拟机上运行Coreinfo但在设置CompatibilityForMigrationEnabled之后,所有以粗体显示的项目都从*更改为-,这意味着它们现在已隐藏,如下面的清单所示。在此示例中,SSSE3,SSE4.1,SSE4.2和POPCNT被隐藏。使用CompatibilityForOlderOperatingSystemsEnabled运行,从返回的数据中删除了整个逻辑处理器到高速缓存映射部分,这意味着它已从操作系统中隐藏。仅在需要时才使用这些功能很重要,因为您将从处理器中删除功能,除非绝对必要,否则您将不希望这样做。
 
S:\ Tools> coreinfo
 
 
 
Coreinfo v3.2-转储有关系统CPU和内存拓扑的信息
 
版权所有(C)2008-2012 Mark Russinovich
 
Sysinternals的- www.sysinternals.com
 
 
 
英特尔(R)至强(R)CPU            E5530   @ 2.40GHz
 
Intel64 Family 6 Model 26 Steping 5,真正的英特尔
 
HTT              *        启用超线程
 
系统管理程序      *        存在系统管理程序
 
VMX              -        支持Intel硬件辅助虚拟化
 
SVM              -        支持AMD硬件辅助虚拟化
 
EM64T            *        支持64位模式
 
 
 
SMX              -        支持Intel可信执行
 
SKINIT           -        支持AMD SKINIT
 
 
 
NX               *        支持无执行页面保护
 
SMEP             -        支持管理模式下执行保护
 
SMAP             -        支架监控模式访问限制
 
PAGE1GB          -        支持1 GB大页
 
PAE              *        支持> 32位物理地址
 
PAT * 支持页面属性表                   
 
PSE              *        支持4 MB页面
 
PSE36            *        支持> 32位地址4 MB页面
 
PGE              *        支持页表中的全局位
 
SS               *        支持总线侦听以进行缓存操作
 
VME              *        支持Virtual-8086模式
 
RDWRFSGSBASE     -        支持直接GS / FS基本访问
 
 
 
FPU              *        实现i387浮点指令
 
MMX              *        支持MMX指令集
 
MMXEXT           -        器具AMD MMX扩展
 
3DNOW            -        支持支持3DNow!指示
 
3DNOWEXT         -        支持支持3DNow!扩展说明SSE              *        支持SIMD流扩展
 
SSE2             *        支持流式SIMD扩展2
 
SSE3             *        支持流式SIMD扩展3
 
SSSE3            *        支持补充SIMD扩展3
 
SSE4.1           *        支持流式SIMD扩展4.1
 
SSE4.2          *        支持流SIMD扩展4.2
 
 
 
AES              -        支持AES扩展
 
AVX              -        支持AVX指令扩展
 
FMA              -        支持使用YMM状态FMA扩展
 
MSR              *        实现RDMSR / WRMSR指令
 
MTRR             *        支持存储器类型范围寄存器
 
XSAVE            -        支持XSAVE / XRSTOR说明
 
OSXSAVE          -        支架XSETBV / XGETBV说明
 
RDRAND           -        支架RDRAND指令
 
RDSEED           -        支架RDSEED指令
 
 
 
CMOV             *        支持CMOVcc指令
 
CLFSH            *        支持CLFLUSH指令
 
CX8              *        支持比较和交换8字节指令
 
CX16             *        支持CMPXCHG16B指令
 
BMI1             -        支架位操作的扩展1
 
BMI2             -        支架位操作扩展2
 
ADX              -        支持ADCX / ADOX说明
 
DCA              -        支持从存储器映射装置预取
 
F16C             -        支持半精度指令
 
FXSR             *        支持FXSAVE / FXSTOR指令
 
FFXSR - 支持优化FXSAVE / FSRSTOR指令                 
 
MONITOR          -        支架MONITOR和MWAIT指令
 
MOVBE            -        支架MOVBE指令
 
ERMSB            -        支持增强的REP MOVSB / STOSB
 
PCLULDQ          -        支架PCLMULDQ指令
 
POPCNT           *        支持POPCNT指令
 
SEP              *        支持快速系统调用说明
 
LAHF-SAHF        *        支持64位模式下的LAHF / SAHF指令
 
HLE              -        支持硬件锁省略说明
 
RTM              -        支持限制事务内存的说明
 
 
 
DE               *        支持I / O断点,包括CR4.DE
 
DTES64           -        的64位分支地址可以写入历史
 
DS               -        器具驻留在内存中缓冲调试
 
DS-CPL           -        支持与CPL调试存储功能
 
PCID             -        支架PCID,并设定CR4.PCIDE
 
INVPCID          -        支持INVPCID指令
 
PDCM - 支架表现能力MSR                  
 
RDTSCP           -        支架RDTSCP指令
 
TSC              *        支持RDTSC指令
 
TSC-截止日期    -        本地APIC支持单次期限计时器
 
TSC- INVARIANT    -        TSC以恒定速率xTPR运行            -        支持禁用任务优先级消息
 
 
 
EIST             -        支持增强型英特尔SpeedStep
 
ACPI             -        器具MSR电源管理
 
TM               -        器具热监控电路
 
TM2              -        器具温度监视器2控制
 
APIC             *        器具软件访问的本地APIC x2APIC           -        支持x2APIC
 
 
 
CNXT-ID          -        L1数据高速缓存模式自适应或BIOS
 
 
 
MCE              *        支持机器检查,INT18和CR4.MCE
 
MCA              *        实现机器检查架构
 
PBE              -        支架使用FERR#/ PBE#引脚
 
 
 
PSN              -        用工具96位处理器序列号
 
 
 
PREFETCHW        *        支持PREFETCHW指令
 
 逻辑到物理处理器的映射:
 
*-   物理处理器0
 
-*   物理处理器1
 
 逻辑处理器到套接字的映射:
 
**   插座0
 
 逻辑处理器到NUMA节点的映射:
 
**   NUMA节点0
 
 逻辑处理器到缓存的映射:
 
*-   数据缓存          0,级别1,32    KB,Assoc    8,LineSize   64 *-   指令缓存   0,级别1,32    KB,Assoc    4,LineSize   64 *-   统一缓存       0,级别2,256   KB,Assoc    8,LineSize 64   64 *-   统一缓存       1,3级,    8 MB,Assoc   16,LineSize   64-*   数据缓存          1,1级,   32 KB,Assoc    8,LineSize   64-*   指令缓存   1,1级,   32 KB,Assoc    4, LineSize   64-*   统一缓存       2、2级,  256 KB,Assoc    8,LineSize   64-*  统一缓存       3,级别    3,8 MB,Assoc   16,LineSize   64
 
 逻辑处理器到组的映射:
 
**   0组
 
NUMa支持
 
考虑一下现在拥有具有64个虚拟处理器和最多1TB内存的虚拟机的功能。我不知道当今市场上具有64个逻辑处理器的物理处理器,即使具有超线程功能,这也意味着具有比单个处理器提供的虚拟处理器更多的虚拟处理器的虚拟机将从多个物理处理器接收资源。多处理器母板具有多个插槽,可以在其中安装处理器,并且有相应数量的内存插槽直接链接到每个插槽。处理器以及由该处理器直接连接和管理的内存被称为非均匀内存访问(NUMA)节点。套接字与NUMA节点之间通常存在1:1的关系,尽管某些最新的硬件每个套接字确实有多个NUMA节点。具有四个插槽的母板通常每个插槽都具有存储库,因此将具有四个NUMA节点。处理器可以比非本地内存更快地访问其NUMA节点中的本地内存,这意味着为获得最佳性能,处理器上运行的进程应使用该处理器的NUMA节点中的内存。
 
Windows Server 2012为虚拟机处理器NUMA引入了一组新的配置,但现实是您永远都不要碰这些。最有可能发生的坏事是,Hyper-V将为您的环境进行正确的配置,而无需任何手动干预。但是,我确实想介绍这些设置的目的以及NUMA为什么很重要。请注意,Windows Server 2008 R2 Hyper-V主机可以识别NUMA,并且始终会尝试确保在同一NUMA节点内分配了虚拟处理器和内存,但是该NUMA拓扑不适用于虚拟机,这不是虚拟机可用的。考虑到虚拟机可能只有四个vCPU,因此不可能使用多个NUMA节点的问题。
 
操作系统知道NUMA节点和可实现最佳资源使用的配置。对于Hyper-V中可能使用的大型虚拟机,NUMA拓扑也将投影到虚拟机上,称为虚拟NUMA或vNUMA。vNUMA使用标准的ACPI(高级配置和电源接口)静态资源相似性表(SRAT),这意味着NUMA拓扑应可用于任何支持NUMA的操作系统,包括Linux。这种NUMA意识对于使用基于NUMA配置的资源的企业应用程序(例如SQL,MySQL和IIS)也是有益的。
 
虚拟机NUMa配置
 
图2.12显示了可用于虚拟机的处理器配置的NUMA配置选项。这些选项被隐藏起来是有充分的理由的。在几乎所有情况下,都不应更改这些值。Hyper-V将尽最大努力根据物理Hyper-V主机设置正确的NUMA拓扑。但是,在某些情况下,您可能需要更改这些值,这些值与单个插槽上的处理器数量,内存和节点数量有关。
 
图2.12配置
 
虚拟机的nuMa配置的选项
 
考虑具有许多类型服务器的大型Hyper-V环境。物理服务器具有不同的NUMA拓扑,并且虚拟机可以在服务器之间实时迁移。在这种情况下,应更改NUMA配置,以匹配虚拟机可能迁移到的所有服务器中最小的NUMA拓扑。例如,假设我有两台服务器:
 
◆  服务器1 NUMA拓扑:最大处理器数量为16,最大内存量为63822。
 
◆  服务器2 NUMA拓扑:最大处理器数量为8,最大内存量为22720。
 
如果在服务器1上创建了虚拟机,则将为该虚拟机配置NUMA拓扑。如果随后将虚拟机移至Server 2,则VM将具有错误的NUMA配置,并且将没有最佳的资源分配,因为它认为单个NUMA节点实际上跨越了多个NUMA边界。因此,有必要手动设置虚拟机的NUMA拓扑以匹配服务器2的拓扑。希望将来,Hyper-V的管理解决方案可以查看群集中的所有节点,并自动为虚拟机配置一个虚拟机。与群集中最小的NUMA配置匹配的NUMA拓扑。在撰写本文时,这还没有发生。
 
此外,在大多数群集中,主机都具有相同的NUMA拓扑,因此实际上这不是一个大问题。
 
自动化NUMA配置的另一个挑战是,通过无共享实时迁移,可以将虚拟机迁移到群集之外。没有管理解决方案可以考虑这一点。对于大多数情况,虚拟机是在将要运行的服务器上创建的,这意味着它们将具有最佳的配置,并且不需要任何手动操作。
 
注意使用硬件拓扑按钮。如果更改设置并意识到您不知道原始值,则可以单击此按钮,并且这些值将重置为该服务器的Hyper-V建议值。
 
请注意,如果虚拟机使用动态内存,则该虚拟机将禁用vNUMA。
 
NUMa跨越
 
如前所述,最佳性能来自使用NUMA节点内的本地内存在处理器内核上运行的进程,而不必“跨越” NUMA节点。跨接意味着所需的内存已连接到另一个处理器;它被称为外部内存 或远程内存,并且其延迟比本地内存高。NUMA跨越配置分为两种类型:主机级别的配置和虚拟机级别的配置。
 
默认情况下,Windows Server 2012在主机级别启用NUMA跨越。这提供了最大的灵活性,因为虚拟机可以访问和使用任何NUMA节点中的内存。但是,与强制虚拟机使用与处理器核心相同的NUMA节点上的内存相比,这也可能导致性能降低。通过在主机级别禁用NUMA扩展,可以在主机上的所有虚拟机上禁用它,并确保虚拟机的虚拟NUMA节点由来自一个NUMA节点的内存支持,以提供最佳性能。但是,这也可能意味着,如果单个NUMA节点上虚拟机所需的内存量不可用,则虚拟机可能无法启动。这也意味着,如果目标节点不能满足NUMA要求,则可能无法将虚拟机实时迁移到其他节点。
 
仅当您以管理员身份熟悉NUMA及其禁用含义并拥有可帮助确保最佳配置的其他管理套件时,才应更改NUMA跨接选项。实际上,最佳实践应该是启用NUMA spanning,这是我的建议。要禁用NUMA扩展,请打开“ Hyper-V设置”页面,然后取消选择NUMA扩展选项,如图2.13所示。
 
图2.13
 
更改hyper-V服务器的nuMa spanning选项
 
 
 
请注意,System Center Virtual Machine Manager允许为每个虚拟机配置NUMA跨越。在后台,这意味着手动配置虚拟机分配给特定的NUMA节点,但这不是您想要尝试手动执行的事情。如果您认为工作负载总是可以预期地执行,并且您接受了内存碎片后虚拟机可能无法启动的情况,请关闭该客户机的跨接。如果您认为工作负载可预测地启动,并且性能可能不理想,那么请保持打开跨接状态。对于大多数人而言,再次为大多数虚拟机启用NUMA跨度可能是正确的选择。
 
请注意,无论启用还是禁用NUMA跨越,虚拟机管理程序将始终尽最大努力提高效率,并在适当的物理NUMA节点上调度虚拟处理器,以备份虚拟机的内存。Hyper-V还将尽一切可能不将内存分割成多个NUMA节点。NUMA跨越仅在没有其他选择但只能分段时才允许出路。但是,如果物理NUMA节点中没有逻辑处理器可用,则管理程序可以将虚拟处理器临时调度到另一个NUMA节点中的远程逻辑处理器。如果没有本地NUMA节点资源可用,则在远程NUMA节点上运行虚拟处理器仍然比根本不运行虚拟处理器更有效率。同样,NUMA扩展不会更改此行为。
 
内存资源
 
当您查看虚拟环境中使用的资源时,内存是处理器的另一种主要资源类型,它通常决定主机上可以支持的虚拟机的数量。尽管逻辑处理器通过快速上下文切换由虚拟处理器共享,但相同的技术不适用于内存。上下文(内存本身的内容)不能足够快地进行交换以模拟同时执行。
 
对于Service Pack 1之前的Windows 2008和Windows Server 2008 R2,在虚拟机运行时无法修改分配给虚拟机的内存量。如果Hyper-V服务器具有16GB的内存,并且假设Windows Server父分区保留了1GB的内存,则可以为服务器上运行的虚拟机分配15GB的内存。1GB分配了15GB内存的虚拟机或30个使用512MB内存的虚拟机可能消耗了15GB。
 
在此模型中,必须为每个虚拟机分配所需的最大内存。但是,在任何特定时间点,可能都不需要大量此内存。例如,主机上的一半VM可能需要完整分配,但是另一半可能正处于空闲期,并且不需要接近其全部内存分配的任何位置。这可能导致在正常使用期间浪费大量内存,从而减少了每个服务器上可以承载的虚拟机的数量。
 
动态记忆体
 
Windows Server 2008 R2 Service Pack 1引入了新的内存优化功能,即动态内存。这项新技术允许分配给虚拟机的内存量根据来宾操作系统中运行的进程在任何给定时间点所需的内存量而增加和减少。动态内存不同于其他虚拟机管理程序使用的内存过量使用。内存过量使用策略告诉VM
 
希望不是所有的VM都尝试写入所有可见的内存。如果发生这种情况,则必须将内存与其他存储(例如压缩内存,共享内存或磁盘数据)交换,这可能会严重影响VM性能。
 
动态内存为每个虚拟机使用三种设置:初始,最大和(在Windows Server 2012及更高版本中)最小内存。Hyper-V可以根据其对内存的实时需求和主机上的内存可用性,智能地向虚拟机添加内存或从虚拟机中删除内存。最初为虚拟机分配了定义为启动RAM的内存量,然后根据虚拟机内部进程如何使用内存,分配了额外的内存(如果有),可能会从其他需求较少的虚拟机中重新分配,或者从虚拟机中删除。
 
图2.14显示了在Windows Server 2012中配置内存的对话框。请注意,如果未选中“启用动态内存”复选框,则虚拟机将使用静态内存,并将使用在“启动RAM”设置中定义的数量。选择启用动态内存可以更改动态内存设置。“启动RAM”中定义的值仍用作初始内存量,但“最小RAM”和“最大RAM”值也可用。最大RAM是虚拟机的内存可以增长到的大小。默认的最大RAM为1,048,576MB; Hyper-V允许的最大数量。但是,可以根据预期的和可容忍的内存使用量将其配置为更合理的限制,以防止在出现问题且未经检查的内存使用量增加时,剥夺其他虚拟机的内存。Windows Server 2012中引入了最低RAM,它允许虚拟机的配置缩小到其启动RAM值以下。如果您的应用程序最初需要一定数量的内存来启动但随后不再需要该数量的内存,则此功能很有用。
 
图2.14配置虚拟机的动态内存设置
 
与主机上运行的其他虚拟机相比,该图中还提供了用于设置内存百分比以用作缓冲区并使用内存滑块设置内存优先级的选项。内存缓冲区使您可以保留分配给VM的额外内存,而无需立即使用。这完成了两件事。首先,不希望操作系统在添加更多RAM之前完全耗尽所有内存,这可能需要花费几秒钟的时间来添加和使用。在那几秒钟内,虚拟机的性能可能会受到严重不利影响,并且它将开始将内存页面调出到其页面文件中。该页面文件是磁盘上的文件,当物理内存不足时,操作系统的虚拟内存管理器可以使用该文件临时存储来自RAM的页面。这可能会降低性能,因为磁盘的使用要比RAM慢得多。其次,它提供了额外的内存,供缓存和其他使用内存的用户使用,否则这些内存将在后台使用。
 
为了避免这种内存不足并为缓存提供额外的内存,动态内存提供了超出虚拟机瞬时需求的某些内存,直到最大内存设置(即,Hyper-V永远不会分配超过最大内存的内存)。默认情况下,此数量是需求的20%。当虚拟机的可用内存百分比小于此可用内存百分比时,如果Hyper-V主机中物理上可用,则会添加更多内存,以使虚拟机恢复到所需的可用内存百分比。可以根据虚拟机的需求将内存缓冲区更改为所需的数量,并且可以在虚拟机运行时对其进行修改。
 
另一个滑块用于在没有足够的物理RAM来满足VM所需的所有数量时,设置内存分配的优先级。就像CPU分配一样,具有较高内存优先级的VM将在具有较低优先级的VM之前获得更多的内存。
 
动态内存在内存优化技术方面与众不同的一方面是如何决定添加或删除内存。我之所以使用“ 智能内存”一词,是因为动态内存不仅会在虚拟机的可用内存不足的情况下为其提供更多内存,还会根据工作负载所需的内存量来决定。图2.15显示了具有8GB RAM的Windows Server 2008 R2服务器的任务管理器视图的一部分。乍一看,该虚拟机只有4MB的可用内存,因此似乎需要更多空间。但这种情况并非如此。
 
图2.15仅有4MB可用内存但仍有大量可用内存的操作系统
 
Windows XP,Windows Server 2003和更早的操作系统尝试使用尽可能少的内存,因此通常会看到具有大量可用内存的系统。Windows Vista,Windows Server 2008和更高版本的操作系统使用所有可用于缓存目的的内存,通过将程序预加载到内存中来帮助提高性能。如果有可用的内存,则可以使用它来尝试提高性能。释放内存不会使任何人受益,这就是为什么很少在Windows Server 2008及更高版本上看到很高的可用内存值的原因。这是因为几乎所有内存都一直被使用,内存过量使用技术(例如在首次写入时分配内存(在虚拟机写入数据时分配内存))不适用于现代操作系统,并且为什么Hyper-V不使用该内存优化功能技术。应用程序可以在需要时使用用于缓存的内存,因此用于缓存的内存在很大程度上仍然可用,因此查看可用内存是毫无意义的。我们需要考虑可用内存(包括用于高速缓存的大部分内存),这也可以在图2.15中看到。
 
动态内存使用内存的提交值来标识已使用的内存量,从而确定其内存需求,这是它为内存分配带来智能的关键。Hyper-V Integration Services在来宾OS中具有动态内存虚拟服务客户端(VSC),该客户端与父分区中的相应虚拟服务提供商(VSP)通信以报告其内存使用情况,尤其是其可用内存量。基于来宾中的可用内存量,可以将为虚拟机配置的所需内存缓冲区和主机中额外可用内存中的物理RAM量分配给来宾。仅由于动态内存VSC提供的来宾OS洞察力,才可以进行这种类型的智能内存分配。
 
虽然向虚拟机添加内存非常简单-更多的内存只是提供给来宾OS供其使用,但是删除不再需要的内存的过程更加复杂。您不能只是从客户机操作系统的内存管理器中夺走内存,并期望它继续运行。来宾可能正在使用内存(请记住,在现代操作系统中实际上很少有内存可用),并且即使它是真正的免费,来宾也希望将来可以使用。而且,即使可以从虚拟机中获取内存,也很难知道最安全的内存是什么!Hyper-V使用称为膨胀的过程来解决这些问题并删除内存。
 
膨胀是一种聪明的方法,可以使客户机操作系统确定它不再需要的内存并停止使用该内存。由Hyper-V控制的内核模式设备驱动程序分配“气球”内存。当Hyper-V希望从动态内存VM返回内存时,它会请求气球驱动程序在该VM内部分配内存。在来宾操作系统中运行的驱动程序分配内存,并将“气球”增长到一定大小。当现代OS收到内存分配请求时,它将使用对现有内存内容和工作负载活动的洞察力来确定最佳内存来源。可用内存,缓存内存以及未使用或不活动的应用程序内存都是典型的目标。如果这些都不可用,则来宾OS可以选择将内存内容分页到来宾OS页面文件以生成可用内存。关键在于,来宾操作系统(而不是不了解内存使用方式的外部进程)可以智能地决定以最不干扰的方式分配哪些页面,而对性能的影响最小。一旦将内存分配给了气球驱动程序,这些地址便被传递给虚拟化管理器,该虚拟化管理器告诉虚拟机管理程序它现在可以有效地从物理RAM取消映射那些地址范围,因为气球驱动程序将永远不会真正接触它们,并且没有其他部分
 
来宾操作系统可以触摸它们。内存已被Hyper-V回收,可以与其他虚拟机一起使用。
 
如果虚拟机将来需要额外的内存,则VM管理可以完全或一定数量地“缩小”气球。Hyper-V在其先前位置提供了物理RAM,然后气球驱动程序将先前分配的RAM释放回来宾OS。此过程如图2.16所示。
 
图2.16气球驱动程序的膨胀,以允许hyper-V从虚拟机回收内存
 
气球驱动程序已压缩,未在来宾中分配任何内存。
 
 
 
受内存压力的Hyper-V为虚拟机中的气球驱动程序设置了所需的大小。气球驱动程序向来宾请求内存,并在分配内存后将页面报告给Hyper-V,从而可以将内存与物理内存解除映射。
 
根据预期的内存使用情况了解和计划虚拟机的放置并设置实际最大值仍然至关重要。不良的计划将导致主机内存不足,并且虚拟机无法获得足够的RAM。
 
虽然动态内存非常适合虚拟桌面中的客户端操作系统
 
在基础架构实施中,它还可以很好地应对许多服务器工作负载。我已经看到许多组织在文件服务器,域控制器,System Center服务器等所有类型的服务器工作负载上使用动态内存,并节省了大量内存。通过优化使用内存,使用动态内存可以在服务器上运行更多虚拟机。
 
某些类型的服务在使用动态内存时需要特别考虑,而其他一些则不应使用。我在下面的列表中包括了一些主要的。最终与应用程序供应商联系,以获取对动态内存的支持:
 
◆  在提供更新的Linux Integration Services的Windows Server 2012 R2发行之前,Linux VM无法使用动态内存。这样,Linux的最新发行版就可以利用动态内存,但是没有更新的Integration Services的较旧版本可能无法使用。
 
 
Exchange 2010及更高版本的邮箱服务器角色在启动邮箱服务器时检查内存量,然后不重新检查它。因此,如果在邮箱服务启动后将Exchange添加到虚拟机,则Exchange将不会利用额外的内存。
 
 
SQL Server的企业SKU支持将内存热添加到操作系统中,这就是SQL Server处理动态内存的方式。为了使SQL Server利用更多的内存,必须运行SQL Server的企业SKU。使用SQL Server Enterprise版时,每秒检查一次物理内存。如果增加了内存,则会重新计算SQL Server的目标内存大小,这将显示动态内存的增加情况。由于SQL Server拥有有关可用内存的缓存机制,因此对于SQL Server虚拟机,缓冲区百分比应设置为5%,而不是默认的20%。
 
 
像SQL Server一样,Java也有自己的缓存机制。对于运行Java工作负载的虚拟机,缓冲区百分比应设置为5%,而不是默认的  20%。
 
应该清楚的是,动态内存不是内存过量使用技术。动态内存为虚拟机提供了初始的内存量,然后,当虚拟机将内存用于进程时,如果主机中有可用内存,则会添加额外的内存。这样可确保最佳使用内存,同时又不存在过多使用虚拟机可用内存的风险。
 
Windows Server 2012 Hyper-V可以分配给虚拟机的最大内存量为1TB。虚拟机还可以使用其他与内存相关的设置:智能分页文件位置。由于Windows Server 2012中的更改为虚拟机引入了“最小RAM配置内存”选项,因此需要智能分页文件。新的最小RAM功能带来了潜在的问题。从内存角度考虑,在充分利用主机的主机上考虑以下情形:
 
1.     虚拟机已经运行了一段时间,并且分配的物理RAM的数量被设置为其最小RAM值512MB。Hyper-V通过气球驱动程序进程占用了启动时分配的额外内存(启动RAM,为1GB)。
 
2.     重新启动虚拟机或重新启动主机。
 
3.     要重新启动,虚拟机需要1GB的内存,但只有512 MB的可用空间。在这种最坏的情况下,Hyper-V主机没有备用内存,并且无法从主机上运行的其他虚拟机回收内存。
 
在这种唯一情况下,将使用新的智能分页功能:
 
          ◆        虚拟机正在重新启动(也由主机重新启动引起)。
 
          ◆      没有可用的物理内存。
 
          ◆         无法从主机上运行的其他虚拟机回收内存。
 
此时,将在虚拟机配置中指定的位置为虚拟机创建一个智能分页文件,该文件将被虚拟机用作完成启动的内存。映射到Smart Paging文件的内存将尽快膨胀,并且不再使用和删除Smart Paging文件。停止使用Smart Paging文件的目标时间是尽快且不超过10分钟。Smart Paging功能仅用于提供可靠的虚拟机重启,而不能用于引导后提供过量使用。
 
为什么hyper-V不使用页面共享
 
使用虚拟化技术时,通常在一个物理硬件上运行许多操作系统实例(通常是类似的版本)。在我的主服务器上,我有18个都运行Windows Server 2012 R2的虚拟机。操作系统版本相同,这意味着它们的大部分内存内容将具有与运行相同客户机操作系统的其他虚拟机相同的数据。
 
页面共享的想法是,一旦存储在物理内存中,则仅存储所有虚拟机的重复内存页面,基本上是虚拟机内存的单实例存储。一种可行的方式是管理程序中的进程查看每个虚拟机的每个内存页面,为每个内存页面创建一个哈希值,然后比较哈希值。如果找到重复的哈希,则对内存页面进行逐位比较以确保内存页面确实相同,然后内容仅在内存中存储一​​次,并且重复的虚拟机页面地址指向单独存储的页面。现在,我们正在共享页面。这似乎是个好主意,但由于许多原因,它不适  用于较新的操作系统,Windows Server 2008和更高版本。
 
首先,页面共享在空白页面上效果最佳。但是,正如您在上一节中使用Windows Vista及更高版本所看到的那样,内存很少会留空,并用于尽可能多地缓存。
 
其次,内存页面越来越大,甚至更大。过去,内存页为4KB,因此现在有可能在整个操作系统中查找具有相同内容的4KB页,因此将节省物理内存空间。处理器已经支持大内存页面很长时间了,通常建议使用2MB的内存页面大小,这是Windows Vista和Windows Server 2008及更高版本默认使用的版本(以及更新的Linux操作系统)。查找重复的2MB内存页面的机会很小,这就是为什么随着操作系统采用大内存页面,内存共享技术失去了优势的原因。
 
另一个因素是Windows Vista及更高版本使用地址空间负载随机化,这是一种安全技术,可将Windows内核的关键组件和用户空间加载到256个可能的位置中的一个。这使得恶意软件更难根据组件在内存中的位置来攻击内核,因为这些位置在操作系统的不同实例上以及每次重新启动时都会有所不同。同一操作系统的重复实例在此内存内容的相同位置中不会具有相同内容,这将使页面共享的效率降到最低,但这仅适用于操作系统内容的一小部分。
 
运行时内存大小调整
 
动态内存是一项强大的功能,对于许多情况下的完美解决方案,在这种情况下,分配给VM的内存应根据来宾操作系统中的实际利用率而变化。但是,在某些情况下,这种波动的内存分配是不合适的。考虑一个托管服务提供商,它必须仔细计划资源分配并根据提供给客户的某些资源计费。内存分配不断变化的VM会使计划变得困难,计费也变得复杂。同时,客户可以灵活地按需更改VM的内存而无需重新启动VM,这是有益的。这只是此功能有用的一个例子。还有许多其他功能,但是关键是要提供更多的控制和更精细的内存配置。
 
Windows Server 2016引入了运行时内存调整大小功能,也称为热添加/删除内存。顾名思义,它是为完全独立于动态内存的正在运行的VM添加和删除内存的功能。实际上,动态内存和运行时内存调整大小是互斥的。如果使用动态内存,则无法通过调整运行时内存大小来手动调整VM的分配内存。运行时内存大小调整的要求如下:
 
 
来宾系统必须运行Windows 10或Windows Server 2016并具有Linux支持,才能为最新发布的发行版热添加内存,但不能热删除。Windows 10/2016中对内核模式内存管理器的更改使内存可以从Windows 10/2016之前不存在的操作系统中删除(拔出)或添加(插入)。
 
 
VM不使用动态内存。
 
 
可以是第一代或第二代VM
 
 
添加到VM的内存量不能超过主机上可用的内存量。
 
 
虚拟机删除的内存不能超过虚拟机中当前可用的内存;也就是说,无法释放被进程标记为正在使用的内存。这与动态内存不同,动态内存可以强制客户机操作系统将内存分页到磁盘,以将所需的内存量释放到气球驱动程序。可以用与缩小NTFS分区类似的方式来考虑-您只能将磁盘缩小仅可用空间量。要进一步缩小磁盘,您必须删除数据。要从虚拟机中删除的内存超过虚拟机中当前可用的内存,您必须通过停止应用程序和服务来释放内存
 
在幕后,当未配置动态内存的Windows 10或Windows Server 2016 VM启动时,该VM仍使用自动启动的动态内存VSC,并且该VM中的所有内存均配置为可热插拔。这使将来可以根据将来的配置通过内核模式内存管理器删除内存,因为内核知道内存是易失性的,并且对内存的访问可能会更改。请注意,虽然从热添加和删除的角度讨论了内存,但是内存都是合成的,VM内部没有模拟内存条的添加和删除的概念。来宾操作系统得到了充分的启发。
 
您可以随时通过Hyper-V管理器,PowerShell等为正在运行的VM更改内存配置。这将导致VM的VM工作进程(VMWP)通过动态内存VSC与VM内核中的API通信,并且将通过添加或删除内存页面来实现内存更改。在来宾内部,将看到当前分配的内存量,这与动态内存不同
 
 
 
始终显示分配的内存高水位线的内存。删除内存后,VM内部可见的内存量将减少。
 
动态内存还具有从Windows 10和Windows Server 2016中热删除内存的功能,并且不再使用气球扩展功能,因为实际删除内存对于来宾OS更有效和有用。对于不支持热移除内存的Windows 10/2016之前的操作系统,动态内存仍使用气球增加功能。
 
使用此功能时,我已经提到过,您不能从VM中删除超过可用和未被使用的内存,并且添加的内存也不能超过主机中的可用内存。如果您尝试从虚拟机中删除的内存量超过了可用内存量,则会从虚拟机中获取最大可删除内存量,并且您将收到一条错误消息,指出内存更改仅部分完成。如果您尝试添加的内存超出可用空间,则会发生同样的情况;将添加尽可能多的可用内存,并且错误消息将指示内存更改仅部分完成。此错误的示例如图2.17所示。
 
图2.17内存更改时的错误消息
 
只能部分完成
 
运行时内存调整大小和动态内存的主要区别在于vNUMA仍可与运行时内存调整大小一起使用,而动态内存则不是这种情况。对于Hyper-V团队来说,这是当务之急,不要将vNUMA的好处带给VM内运行的工作负载。
 
添加运行时内存大小调整并不会消除动态内存的好处。动态内存根据VM内部运行的进程的需求(通常随时间变化),在VM之间提供内存的自动重新平衡。对于许多工作负载,动态内存仍然是最佳选择。通过运行时内存调整大小进行更细粒度的手动配置更适合于主机类型的情况,或者必须严格控制内存分配但可能需要修改的情况。
 
虚拟存储
 
我之前介绍了IDE控制器和SCSI控制器,它们支持要附加的存储。主要有两种存储类型:虚拟硬盘和直通存储。在开始讨论这些技术之前,我想明确一点:始终使用虚拟硬盘!尽管在某些情况下Windows Server 2008 R2 Hyper-V中需要传递存储,但Windows Server 2012 Hyper-V中的新VHDX格式永远不需要传递存储,因此不要使用它。但是,为了完整起见,我将简要介绍一下。
 
处理器和内存是虚拟机的重要资源,但是存储也很关键。通过将Windows Server 2008 R2及更高版本的Hyper-V虚拟机从Hyper-V主机附加到LUN,然后使用磁盘的直通磁盘功能将磁盘直接映射到VM,可以使Windows Server 2008 R2及更高版本的Hyper-V虚拟机从SAN引导。 Hyper-V。但是,在大多数情况下,虚拟机将具有一些专用存储。
 
甚高频
 
虚拟机最常见且推荐的存储是使用虚拟硬盘,在Windows Server 2012之前是VHD格式。在Windows Server 2008 R2中,VHD格式是操作系统的核心部分,并且从性能分析来看,使用直通磁盘的差异仅可忽略不计。可以使用Windows Server 2008 R2和更高版本的磁盘管理工具挂载VHD,并且物理计算机可以使用Server 2008 R2和Enterprise以及Windows 7以及更高版本的Windows 7中提供的“从VHD引导”功能从VHD引导。
 
VHD的最大大小为2TB,并且有几种类型的VHD:
 
动态扩展 这是最流行的格式。使用最少的磁盘空间创建虚拟硬盘。使用磁盘时,文件会在文件系统上扩展以容纳写入磁盘的数据,直到指定为虚拟硬盘大小的大小为止。此选项是对磁盘空间的最有效利用,因为除非需要,否则物理硬盘驱动器上不会使用空间。在Windows Server 2008中,动态磁盘会降低性能,例如执行写入操作时,文件必须增长。但是,VHD实现已在Windows Server 2008 R2中重写,并且此性能损失可忽略不计。如果删除数据,除非执行压缩操作,否则动态扩展磁盘不会收缩。这种类型的磁盘通常也称为精简配置,因为它从精简开始并随着向其写入数据而增长。
 
固定大小 在这种情况下,为虚拟硬盘指定的大小将在创建磁盘时分配和使用。如果创建了127GB固定大小的虚拟硬盘,则会在Hyper-V服务器上创建127GB VHD文件。这很可能导致虚拟硬盘碎片更少。
 
差异 差异硬盘链接到父虚拟硬盘,并且仅存储来自父硬盘的更改。进行写入时,差异(子)磁盘将提交写入操作,而读取操作将来自父VHD,除非对原始数据或其新数据进行了更新,在这种情况下,将从中读取数据差异磁盘。VHD成为父磁盘后,它将变为只读磁盘。差异磁盘的名称为AVHD而不是VHD,并且与动态磁盘类似,它会随着数据的写入而增长。
 
图2.18概述了VHD的类型及其功能。
 
图2.18最大大小但父磁盘                                                                                                              
 
           当前大小未分配的键类型当前大小(只读)                                                            
 
差异的VHD磁盘
 
创建时分配的磁盘上的整个空间
 
文件随着数据写入而增长差异文件随着数据写入而增长
 
                                                    动态VHD / VHDX             固定VHD / VHDX              差分VHD / VHDX
 
尽管动态VHD和固定VHD之间的性能差异很小
 
对于Windows Server 2008 R2,建议在生产环境中使用固定的VHD。主要原因是使用动态VHD时,底层存储总是有空间用尽的可能性,因此,随着动态VHD尝试增长,它将失败,从而导致不可预测的结果。如果系统具有定义明确的过程来监视磁盘空间使用情况并根据需要发出警报,则可以在生产中使用动态VHD。VHD是Microsoft发行的标准,并由Citrix等其他供应商使用。可以在Microsoft下载中心网站上找到该规范。只需在www.microsoft.com/download上搜索“ VHD规范” 。
 
虚拟机可以连接多个VHD,但是单个VHD不能同时由多个虚拟机使用。Hyper-V支持IDE总线和SCSI总线,以将VHD连接到虚拟机。尽管IDE总线必须用于DVD驱动器和虚拟机将要从中引导的磁盘,但对于所有其他VHD,建议使用SCSI总线以实现最佳性能和最大灵活性。
 
使用Hyper-V管理器和命令行工具可以在动态VHD和固定VHD之间执行转换。转换过程将创建一个新的VHD,并将内容从源VHD复制到目标。
 
VhDX
 
Windows Server 2012中引入了VHDX格式,以解决VHD实施的一些可伸缩性,并在较小程度上解决了性能挑战。VHD仍可以在Windows Server 2012 Hyper-V中使用,但是建议始终使用VHDX,除非需要与Windows Server 2008 R2 Hyper-V或向后兼容Windows Azure IaaS(当前支持)仅VHD)。
 
VHD具有相同的VHD功能,例如从VHDX引导,三种类型的VHDX(动态,固定和差异)以及Windows Server 2012中的本机安装和使用。VHDX建立在VHD之上,它提供了新的可伸缩性和选项。
 
VHDX支持的最大虚拟硬盘大小为64TB,是VHD格式的32倍。在与世界上最大的公司进行咨询的所有这些年中,我从未见过NTFS容量超过14TB。新的VHDX格式不包含任何工作负载,从而消除了以前由于VHD的大小限制而需要通过存储的少数情况。虽然Windows Server 2012中引入的新ChkDsk功能确实可以允许更大的NTFS卷,因为卷现在可以修复任何损坏,而停机时间只有几秒钟而不是几小时或几天,这是事实,但我仍然不相信任何组织需要大于64TB的单个卷。
 
VHDX还利用改进的日志记录机制来更新VHDX元数据,该功能可防止在意外事件(如断电)的情况下避免损坏。此外,VHDX具有存储自定义元数据的功能,这对于存储有关虚拟硬盘的用户注释很有用。VHDX文件支持TRIM功能,如果硬件与TRIM兼容,则可以回收空间。
 
VHDX文件自动与磁盘的基础物理结构对齐,以提供最佳性能,并且还为动态磁盘和差异磁盘利用更大的块大小,从而提供更好的性能。当您使用动态VHDX文件时,与VHD相比,性能差异甚至可以忽略不计,因此在置备新的VHDX文件时将动态作为默认选择。但是,如果您没有合适的监视解决方案,则对VHD的指导同样适用。为了确保您不会用完物理磁盘空间,您仍将使用固定的VHDX格式。
 
当VHDX与Windows Server 2012 R2中的SCSI控制器结合使用时,如果正在运行的虚拟机使用VHDX,则可以动态调整VHDX的大小,只要卷中有足够的未分区空间,就可以扩展甚至缩小磁盘。
 
VHDX文件还可以由Windows Server 2012 R2中的多个虚拟机共享,这些虚拟机存储在群集共享卷上或由横向扩展文件服务器提供。我将在第4章“存储配置”中对此进行详细介绍并动态调整大小。
 
如果您有VHD磁盘,则可以使用Hyper-V Manager通过“编辑磁盘”操作,并使用“允许转换”操作的“编辑虚拟磁盘向导”,将它们转换为VHDX。替代方法是将PowerShell与Convert-VHD cmdlet一起使用,如命令Convert-VHD   。\ test.vhd。\ test.vhdx中所示。
 
创建虚拟硬盘
 
可以通过多种方式创建虚拟硬盘。使用Hyper-V Manager,可以使用“新建–硬盘”选项创建磁盘,我将在以下步骤中逐步进行介绍。此外,如果您选择在虚拟机设置对话框中的磁盘控制器上创建新的虚拟硬盘,则会启动相同的向导。
 
1.         从Hyper-V管理器中选择“新建–硬盘”选项。
 
2.         单击“下一步”打开“新建虚拟硬盘向导”简介屏幕。
 
3.         选择磁盘格式的类型:VHD或VHDX。如果可能,请始终使用VHDX。点击下一步。4.选择磁盘是固定大小的(如果在前一屏幕上选择了VHDX,则为默认值),动态扩展(如果在前一屏幕上选择了VHDX,则为默认值)或差异,然后单击下一步。  
 
5.     为新的虚拟硬盘和位置选择一个名称,然后单击“下一步”。
 
6.     如果正在创建固定磁盘或动态磁盘,则可以使用Configure Disk(配置磁盘)屏幕为新磁盘选择大小,或从现有物理或虚拟硬盘复制内容,如图2.19所示。默认大小为127GB,但是您应该更改此大小以满足您的需求。点击下一步。
 
图2.19
 
选择新虚拟硬盘的大小或源内容
 
                                 7.将显示选择摘要。单击完成以创建新的虚拟硬盘。
 
Hyper-V Manager中还包含“编辑磁盘”操作,该操作在启动时允许选择虚拟硬盘,然后对其执行以下操作:
 
精简 减小虚拟硬盘的大小。如果已删除虚拟硬盘中的大量数据,并且应回收了动态磁盘的物理空间,则此功能很有用。
 
转换 允许在虚拟硬盘格式(VHD / VHDX)和预配类型(固定/动态)之间进行转换。转换通过创建新的虚拟硬盘并复制内容来进行,以便在转换过程中它将消耗磁盘上的额外空间,并且可能需要很长时间。
 
扩展 扩展虚拟硬盘的容量。
 
Hyper-V Manager中的“检查磁盘”操作提供了有关所选虚拟硬盘的基本信息,如图2.20所示。对于动态虚拟硬盘,它会显示其最大大小以及当前在磁盘上使用的空间量。
 
图2.20 “检查磁盘”选项显示的有关虚拟硬盘的基本信息
 
图形工具对于自动化非常直观,但是通常会使用脚本语言,而PowerShell是Microsoft首选的命令行界面和脚本语言。
 
以下是一些我最喜欢的与虚拟硬盘相关的PowerShell命令。请注意,您不必指定磁盘是VHD还是VHDX。只需将文件类型设置为VHD或VHDX,命令就可以知道要创建的虚拟硬盘的类型。在本书的后面,我将向您展示如何在虚拟机创建过程中创建新的虚拟硬盘。
 
这是创建固定的VHDX文件的命令:
 
New-VHD -Path D:\ Virtuals \ newfix.vhdx -Fixed -SizeBytes 10GB 要创建动态VHDX文件,请使用以下命令:
 
New-VHD -Path D:\ Virtuals \ newdyn.vhdx -Dynamic -SizeBytes 1TB 创建差异VHDX文件的命令如下:
 
New-VHD -ParentPath D:\ Virtuals \ newfix.vhdx'
 
-Path D:\ Virtuals \ newdif.vhdx -Differencing'-SizeBytes 1000000000
 
这是使用非常大的块大小创建VHDX的命令:
 
New-VHD –路径D:\ Virtuals \ LargeBlockSize.vhdx –BlockSizeBytes 128MB'
 
–LogicalSectorSize 4KB –SizeBytes 1TB
 
可以使用Add-VMHardDiskDrive PowerShell cmdlet将虚拟硬盘添加到虚拟机,如以下示例所示:
 
Add-VMHardDiskDrive -VMName Demo1-路径D:\ Virtuals \ newdyn.vhdx'
 
-ControllerType SCSI
 
直通存储
 
正如我提到的,一种存储选项是使用直通磁盘,从而使虚拟机具有直接映射到物理磁盘的连接性。但是,这要求物理磁盘只能由单个虚拟机使用。由于从虚拟机直接链接到物理硬件,因此失去了从硬件抽象虚拟机的好处。其他功能(例如使用提供虚拟机时间点保存状态的检查点)是不可能的。
 
Hyper-V主机无法访问通过虚拟机的磁盘。它可以由虚拟机专用。该磁盘必须在Hyper-V主机上处于脱机状态才能连接到虚拟机。直通磁盘可以用于非常高的I / O应用程序(例如SQL Server),但是鉴于VHDX性能的不断提高,通常不需要这样做。在VHDX之前,由于VHD大小限制,对于大于2TB的卷,需要使用直通存储,但是由于VHDX,这不再是限制因素。
 
离散设备分配
 
SR-IOV是PCI Express规范的一部分。它使您可以将设备的控制方面与设备的数据移动方面分开,从而使该设备多次出现在PCI Express总线上(对于控制平面一次,对于每个数据平面一次)。将其用于NIC(网络接口卡)时,它允许每个VM都有自己的直接通往NIC的路径,并使NIC拥有通往VM的内存的直接路径。  无需软件即可解决。为此,虚拟机管理程序必须构建一个虚拟网络交换机,并让NIC运行其中的一部分。软件开关仍然存在,但是NIC中的各个数据路径可以绕过它。
 
在Hyper-V中,这些单独的数据平面(称为虚拟函数,原因可追溯至  20年)没有被建模为完整的虚拟NIC。虚拟NIC由软件处理,大多数(但不是全部)网络流量被转移给虚拟功能。顺便说一下,您可以通过查看vNIC和虚拟功能在来宾VM中看到这一点。它们具有相同的MAC地址。但是,虚拟功能本身无法完全发挥作用,有时甚至在VM的生命周期中(例如,它处于实时迁移过程中),所有流量都将通过软件路径。顺便说一下,这与大多数其他虚拟机管理程序形成对比,虚拟机管理程序通过虚拟功能发送所有流量,并且没有在虚拟功能旁构建软件路径,而无需进行实时迁移,VM检查点以及其他无法使用的功能虚拟机公开的实际硬件。
 
Windows Server 2016扩展了将硬件直接映射到具有离散设备分配(DDA)的VM的想法。DDA使与PCI Express连接的设备直接通过虚拟机连接。在某些情况下这可能很有用。例如,某些类型的存储(尤其是NVMe设备)甚至图形适配器通常可能无法通过RemoteFX与应用程序一起使用,这是因为无法识别应用程序的驱动程序,或者由于历史上仅限于DirectX原语的通过RemoteFX公开的功能有限(尽管使用带有OpenCL和OpenGL支持的Windows Server 2016进行了改进)。使用DDA时,硬件直接传递到VM,因此使用硬件的IHV驱动程序代替通用虚拟设备驱动程序。使用RemoteFX与DDA的决定实际上归结为需要本地驱动程序和最佳性能时使用DDA,以及需要扩展时使用RemoteFX vGPU。
 
要使用DDA,系统必须支持访问控制服务,该服务可确保PCI Express设备的安全通过。此外,主机必须支持SLAT(Hyper-V 2016的基本要求)和中断重新映射(Intel VT-d2或AMD I / O MMU)。
 
要测试您的计算机是否支持DDA,请执行以下PowerShell,该操作还将标识可与DDA一起使用并因此分配给DDA的所有硬件。
 
虚拟机:
 
wget的https://raw.githubusercontent.com/Microsoft/Virtualization- ↵
 
文档/主/ Hyper-V的采样/ benarm-的powershell / DDA /调查-dda.ps1 ↵
 
-OutFile survey-dda.ps1。\ survey-dda.ps1
 
Microsoft的精彩文章详细介绍了此脚本的输出:
 
https://blogs.technet.microsoft.com/virtualization/2015/11/20/discrete-device-assignment-machines-and-devices/
 
请注意,使用DDA时,设备也不能在主机中使用或在以下设备之间共享
 
虚拟机。设备直接通过虚拟机。这也意味着无法进行VM的实时迁移,因为VM直接绑定到特定主机中的硬件。这与不阻止实时迁移的SR-IOV不同。缺少实时迁移是主要的让步,并且此功能仅在非常特定的情况下使用。但是,在这些情况下,直接映射PCIe设备的功能是一个巨大的好处。此外,还有一个关键点:在不让整个计算机遭受拒绝服务攻击的情况下,很难将整个设备传递给客户。几乎每个设备都可能被诱使在总线上生成错误,这将使整个计算机瘫痪,并出现有关硬件故障的奇怪消息。因此,DDA应该仅用于管理员完全信任的VM。实际上,启用DDA的VM可能应该是托管者基础结构的一部分,而不是租户可以使用的东西。请注意,这可能会让您稍稍停顿,因为Azure对其N系列VM使用了确切的功能,从而使NVIDIA卡暴露于VM。但是,Microsoft和NVIDIA执行了广泛的渗透测试,从而找到了在Azure中启用此功能的安全方法。
 
主机必须正在运行Windows Server2016。但是,来宾操作系统可以是Windows Server 2016,Windows Server 2012 R2,Windows 10(1511及更高版本)以及某些Linux发行版。通过直接将GPU映射到Azure VM,将利用这项技术在Azure中启用具有GPU功能的N系列VM。
 
要使用DDA,首先需要从要映射到VM的设备上卸载默认驱动程序,从管理OS卸载该设备,然后再将其映射到VM。以下脚本来自本文:该脚本将卸载系统上的NVMe设备,使它们可用于VM。
 
https://blogs.technet.microsoft.com/virtualization/2015/11/19/discrete-device-assignment-description-and-background/
 
#获取所有属于NVMe控制器的设备
 
$ pnpdevs = Get-PnpDevice -PresentOnly | 哪里对象{$ _。Class -eq↵
 
“ SCSIAdapter”} | 哪里对象{$ _。Service -eq“ stornvme”} 
 
#遍历它们禁用和卸下它们
 
foreach($ pnpdevs中的$ pnpdev)
 
{
 
       disable-pnpdevice -InstanceId $ pnpdev.InstanceId -Confirm:$ false
 
       $ locationpath =($ pnpdev |获取pnpdeviceproperty ↵ DEVPKEY_Device_LocationPaths)。数据[0]
 
       dismount-vmhostassignabledevice -locationpath $ locationpath
 
       $ locationpath}
 
脚本的输出将包括已识别并已卸载的设备。现在,还可以通过执行Get-VMHostAssignableDevice cmdlet来查看这些设备,该cmdlet包含一个名为LocationPath的属性。它是使用Add-VMAssignableDevice cmdlet通过DDA将设备映射到VM时指定的LocationPath,例如:
 
PS C:\> Get-VMHostAssignableDevice
 
 
 
实例ID:PCIP \ VEN_144D&DEV_A820&SUBSYS_1F951028&REV_03 \ 4&368722DD&0&0010
 
LocationPath:PCIROOT(40)#PCI(0200)#PCI(0000)CimSession:CimSession:。
 
电脑名称:SAVDALHVFX
 
IsDeleted:错误
 
 
 
PS C:\>添加-VMAssignableDevice -LocationPath ↵
 
“ PCIROOT(40)#PCI(0200)#PCI(0000)” -VMName TestVM
 
若要从VM删除设备,请使用Remove-VMAssignableDevice,其参数与Add cmdlet相同。没有用于管理DDA的图形界面-您必须使用PowerShell。请记住,由于这是将设备直接映射到VM,因此如果硬件需要特殊的驱动程序,则这些驱动程序将需要安装在VM guest虚拟机OS中,并且您将不再能够实时迁移VM。
 
使用DDA将NVMe存储设备映射到VM时,不需要其他配置。但是,如果要映射往往具有大量内存的图形设备,则内存映射的I / O空间将无法用于来宾OS映射  和使用图形设备的内存。您将需要重新配置VM。  需要映射的确切内存量取决于图形设备,可以通过在“设备管理器”中检查设备的“资源”选项卡来查看,  如图2.21 所示。您可以使用Set-VM cmdlet的-LowMemoryMappedIoSpace和-HighMemoryMappedIoSpace参数修改VM的低内存空间和高内存空间。本文对此进行了详细说明:
 
https://blogs.technet.microsoft.com/virtualization/2015/11/23/discrete-device-assignment-gpus/
 
本文还指出,您应通过Set-VM设置-GuestControlledCacheTypes $ true来使客户机控制缓存。所有这些配置都需要关闭VM。
 
图2.21
 
图形设备的内存资源
 
底线
 
描述虚拟机管理程序如何虚拟化虚拟机的资源。 系统管理程序通过Hyper-V直接管理处理器和内存资源。计划逻辑处理器以满足分配给虚拟机的虚拟处理器的计算机要求。多个虚拟处理器可以共享同一逻辑处理器。系统管理程序从物理主机中可用的内存中为虚拟机分配内存。动态内存允许根据资源需求在虚拟机中添加和删除内存。管理分区通过称为VMBus的内核模式内存总线提供其他类型的资源,例如网络和存储。这使现有的Windows驱动程序可用于通常使用的各种存储和网络设备。
 
掌握它 动态内存与内存过量使用有何不同?
 
正确使用处理器和内存的高级配置选项。 当虚拟机可以在具有相同处理器系列的不同版本的主机之间移动时,应使用虚拟机处理器的兼容性配置。处理器兼容性选项在来宾操作系统中隐藏了更高级别的功能,从而可以在不停机的情况下迁移到虚拟机。处理器预留和限制选项可确保一个虚拟机与其他虚拟机共存,而不会获得太多或太少的资源。动态内存配置允许配置虚拟机的启动,最小和最大内存量。重要的是要注意,只有当主机内存在足够的内存时,配置的最大内存量才可用。
 
掌握它 什么时候应该修改虚拟机的NUMA属性?
 
 
 
底线
 
解释VHD / VHDX与传递存储之间的区别。 VHD和VHDX文件是虚拟硬盘,它们是文件系统上的文件或Hyper-V主机可以访问的共享文件。它们提供了虚拟机和基础物理存储所见的存储的抽象。直通存储将虚拟机直接映射到可从主机访问的物理磁盘,这限制了Hyper-V功能并破坏了虚拟化的关键原理之一:从物理结构中抽象虚拟机。
 
熟练掌握  VHD为什么仍与Windows Server 2012 Hyper-V一起使用?
 

 


(责任编辑:IT)
------分隔线----------------------------