Windows Server 2008内核新变化下


 在 Windows Server 2003 中,当线程进行内存分配时,内存管理器在分配内存时将优先考虑在线程当前执行的节点中进行分配。如果线程暂时调度到非理想节点,则在此期间执行的所有分配操作都将在非理想节点中执行。所以,当线程最终回到其理想节点中执行时,它将不再像最初一样紧挨着所分配内存中存储的数据或代码。

  为解决这一问题,在 Windows Server 2008 中,内存管理器在所有线程内存分配时都将优先考虑线程的理想节点,即使线程正在另一节点附近执行。内存管理器还能自动了解处理器和节点之间的延迟,所以当理想节点中没有足够的可用内存时,它会检查与理想节点最近的另一节点。此外,当线程引用代码或数据时,内存管理器将把其待机列表中的页面迁移到线程的理想节点。

  希望控制分配位置的应用程序可使用新的 NUMA 内存 API,它使这些应用程序能够为内存分配、文件映射视图和文件映射对象指定首选节点。对于与文件映射相关的分配,内存管理器会检查映射操作是否指定节点,然后检查文件映射对象是否指定节点,如果两者都未指定,则最后它将回来继续选用线程的理想节点。

  在 Windows Server 2008 之前,用于存储或网络 I/O 的中断及其相关的延缓进程调用 (DPC) 能够在任意 CPU 上执行,包括在与启动 I/O 操作处于不同节点的 CPU 上执行。这有可能导致 I/O 操作中的数据读取或写入在访问数据的节点以外的其他节点的内存中执行。

  为避免这种情况,Windows Server 2008 I/O 系统将 DPC 执行定向到启动 I/O 操作的节点中的 CPU,并且拥有支持 PCI 总线 MSI-X(消息信号中断标准的扩展)设备的系统还可以通过使用设备驱动程序来进一步让 I/O 在本地完成,因为这些设备驱动程序将利用 Windows Server 2008 API 将 I/O 中断定向到启动该 I/O 的处理器
动态分区

  让系统更具伸缩性的一种方法是让其支持动态增加硬件资源(如 CPU 和内存)。如果这些资源无需重启系统即可实现更换,则此支持还能使系统更具可用性。

  Windows Server 2003 支持动态内存添加功能,从而使得具有动态内存支持的服务器能在管理员添加的同时即可使用这些 RAM。Windows Server 2008 还扩展了动态内存支持,因为它可实现内存更换。

  RAM 由于越来越依赖纠错码 (ECC) 校正而非常容易发生故障,因此在支持动态更换的服务器上,Windows Server 2008 可透明地将出现故障的内存条中的数据迁移到替换内存上。具体过程为:首先迁移操作系统所控制的数据,然后将硬件设备置于低功耗状态来有效关闭它们,迁移内存中的剩余数据,接着恢复设备电源继续正常操作。

  Windows Server 2008 还支持处理器的动态添加和动态更换。对于动态更换,硬件必须支持备用 CPU 概念,当现有 CPU 产生故障指示时,备用 CPU 可联机或动态添加到系统中,目前仅高端系统支持此概念。Windows Server 2008 调度程序可减缓故障 CPU 上活动的速度,并将工作转移至替换硬件上,随后可取出故障 CPU 并将其更换为新的备用件。

  Windows Server 2008 支持处理器的动态添加,因此管理员能在不停机的情况下升级服务器的处理能力。但是,调度程序和 I/O 系统只能将新 CPU 提供给那些通过新 API 请求 CPU 到达通知的设备驱动程序和应用程序,因为某些应用程序内置假定 CPU 数量对于引导会话而言是固定的。例如,应用程序可能为每个 CPU 分配一个工作队列,线程执行时将使用与该 CPU 关联的队列。如果调度程序将该应用程序的某个线程调度到新的 CPU 上,它可能会试图引用并不存在的队列,因而可能导致损坏应用程序的数据并很有可能致使该应用程序崩溃
基于 Microsoft 服务器的应用程序(如 SQL Server 和 Exchange Server)能支持 CPU 动态添加,一些核心 Windows 进程也支持此功能,包括 System 进程、会话管理器进程 (%SystemRoot%System32Smss.exe) 和 Generic Service Hosting 进程 (%Systemroot%System32Svchost.exe)。其他进程也可使用 Windows API 来请求新 CPU 到达通知。当新 CPU 到达时,Windows 将向设备驱动程序通知这一情况、启动 CPU 并随后通知所写入的设备驱动程序和应用程序使用新的 CPU,这样它们就可以在需要时分配数据结构以跟踪新 CPU 上的活动。

  计算机虚拟化

  在 Windows Server 2008 之前,Microsoft 就已经使用宿主虚拟化技术(如图 5 所示)实现了包括Virtual Server 2005 在内的各种虚拟化产品。在宿主虚拟化中,虚拟机的实现技术是在宿主操作系统上(通常是作为设备驱动程序)运行的虚拟机监控器 (VMM)。VMM 依赖宿主操作系统的资源管理和设备驱动程序,并且当宿主操作系统调度其运行时,它会在活动虚拟机 (VM) 之间对 CPU 切分时间片
Hyper-V(以前的代号为“Viridian”)是利用管理程序虚拟化得以实现的。管理程序完全控制着所有硬件资源,甚至引导系统和用于控制 VM 的 Windows Server 2008 操作系统本身实质上也是以虚拟机的方式运行(如图 6 所示)。

  图 5 宿主计算机虚拟化

  图 6 Hyper-V 体系结构

 管理程序可将系统分成多个 VM,并将 Windows Server 2008 的引导实例当作主分区(或根分区),以使其可直接访问各种硬件设备(如磁盘、网络适配器和图形处理器)。管理程序要求根分区执行电源管理并响应硬件即插即用事件。它将截取子分区中启动的硬件设备 I/O 并将其路由到根分区,然后根分区使用标准 Windows Server 2008 设备驱动程序来执行硬件访问。通过这种方式,运行 Hyper-V 的服务器可以充分利用 Windows 对硬件设备的支持。

  当将 Windows Server 2008 配置为具有 Hyper-V 服务器角色时,Windows 将把 hypervisorimagelaunchtypeboot 引导配置数据库 (BCD) 设置设为 auto,并将 Hvboot.sys 设备驱动程序配置为在引导过程的前期启动。如果配置了该选项,Hvboot.sys 将使系统做好虚拟化准备,然后将 %Systemroot%System32Hvax64.exe 或 %Systemroot%System32Hvix64.exe 加载到内存中,具体加载哪个程序取决于系统是实现 AMD-V 虚拟化扩展还是 Intel VT CPU 虚拟化扩展。

  加载完成后,管理程序使用虚拟化扩展将自身插入到 Windows Server 2008 中。用户模式的应用程序使用 x64 处理器的 Ring 3 权限级别,而内核模式代码则在 Ring 0 上运行,因此管理程序实际是在概念权限级别 Ring -1 上运行,因为它可控制 Ring 0 上运行的代码的执行环境。

  当使用 Hyper-V 管理控制台创建或启动子分区时,它将利用 %Systemroot%System32DriversWinhv.sys 驱动程序来与管理程序通信,该驱动程序使用公开记录的 hypercall API 来指示管理程序创建指定物理内存大小的新分区和执行特征。根分区中的 VM 服务 (%Systemroot%System32Vmms.exe) 为每个子分区创建一个 VM 工作进程 (%Systemroot%System32Vmwp.exe) 以管理子分区的状态
 Windows 改善子 VM 操作系统性能的其中一种方法是 Windows Server 2008 和 Windows Vista 都已实现的启发方法(即仅当操作系统运行实现 Microsoft hypercall API 的管理程序时才会激活的代码序列)。通过直接请求管理程序的服务,子 VM 避免了在管理程序必须猜测子操作系统的意图时所产生的虚拟代码开销。

  例如,未实现自旋锁(执行底层多处理器同步)启发方法的来宾操作系统将停在一个紧凑循环上旋转以等待其他虚拟处理器释放自旋锁。此旋转可能会阻塞其中一个硬件 CPU,直到管理程序调度第二个虚拟处理器。在启发式操作系统中,自旋锁代码会在将要发生旋转时通过 hypercall 通知管理程序,这样管理程序可以立即调度另一个虚拟处理器并降低不必要的 CPU 使用。

  Windows Server 2008 改善 VM 性能的另一种方式是加速 VM 对设备的访问。可通过在子操作系统中安装统称为“VM 集成组件”的一个组件集合来增强性能。

  如果运行未安装集成组件的 VM,则子操作系统将为管理程序所提供的模拟设备配置硬件设备驱动程序。当设备驱动程序试图使用硬件资源时,管理程序必须进行干预以便通知根分区,根分区将代表子 VM 操作系统使用标准 Windows 设备驱动程序执行设备 I/O。由于单独的高级 I/O 操作(例如读磁盘)可能包含多个离散的硬件访问,所以它可能导致管理程序和根分区中出现许多称为“截取”的转换。

  Windows Server 2008 使用以下三种组件来最小化截取:虚拟机总线驱动程序 (%Systemroot%System32DriversVmbus.sys)、虚拟服务客户端 (VSC) 和虚拟服务提供商 (VSP)。当利用受支持操作系统将集成组件安装到 VM 中时,VSC 将取代设备驱动程序的角色,并使用子 VM 中的 Vmbus.sys 驱动程序服务,通过管理程序的 hypercall 和内存共享服务将高级 I/O 请求发送到根分区中的虚拟机总线驱动程序。在根分区中,Vmbus.sys 将请求转发到相应的 VSP,然后它通过根分区的设备驱动程序来启动标准 Windows I/O 请求

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3