这是我将在接下来的几个月中编写的第一篇博客文章,名为“推动Windows的限制”,介绍Windows和应用程序如何使用特定资源,资源的许可和实现派生限制,如何衡量资源用法以及如何诊断泄漏。为了能够有效地管理Windows系统,您需要了解Windows如何管理物理资源(如CPU和内存)以及逻辑资源(如虚拟内存,句柄和窗口管理器对象)。了解这些资源的限制以及如何跟踪其使用情况,可以将资源使用情况归因于使用这些资源的应用程序,有效地为特定工作负载调整系统的大小,并识别泄漏资源的应用程序。

这是整个推动限制系列的索引。虽然他们可以独立存在,但他们认为你是按顺序阅读的。

推动Windows的限制:物理内存

推动Windows的限制:虚拟内存

推动Windows的限制:分页和非分页池

推动Windows的限制:进程和线程

推动Windows的限制:把手

推动Windows的限制:USER和GDI对象 - 第1部分

推动Windows的限制:USER和GDI对象 - 第2部分

物理内存

计算机上最基本的资源之一就是物理内存。Windows内存管理器负责用活动进程,设备驱动程序和操作系统本身的代码和数据填充内存。由于大多数系统在运行时访问的代码和数据比在物理内存中所能容纳的要多,物理内存本质上是一段时间内使用的代码和数据的窗口。内存量因此可能会影响性能,因为当进程或操作系统需要的数据或代码不存在时,内存管理器必须将其从磁盘中引入。

除了影响性能外,物理内存的数量还会影响其他资源限制。例如,由物理内存支持的非分页缓冲池,操作系统缓冲区的数量明显受到物理内存的限制。物理内存也有助于系统虚拟内存限制,这是大致物理内存大小加上任何分页文件的最大配置大小的总和。物理内存也可以间接地限制最大进程数量,我将在以后的文章中讨论进程和线程限制。

Windows服务器内存限制

Windows对物理内存的支持受硬件限制,许可,操作系统数据结构和驱动程序兼容性的限制。MSDN中“Windows发行版 ”的“ 内存限制”页面记录了不同Windows版本的限制以及版本内SKU的限制。

您可以在所有Windows版本的服务器SKU中看到物理内存支持许可的差异化。例如,32位版本的Windows Server 2008 Standard仅支持4GB,而32位Windows Server 2008 Datacenter则支持64GB。同样,64位Windows Server 2008 Standard支持32GB,而64位Windows Server 2008 Datacenter可以处理高达2TB的数据。在那里没有太多的2TB系统,但Windows服务器性能团队知道一对夫妇,包括他们在实验室中曾经有过的一个。以下是在该系统上运行的任务管理器的屏幕截图:

推动Windows的限制:物理内存

Windows Server 2003数据中心版支持128GB的最大32位限制,这是由于内存管理器用于跟踪物理内存的结构会在较大的系统上占用系统的虚拟地址空间太多。内存管理器跟踪一个名为PFN数据库的数组中的每个内存页面,为了性能,它将整个PFN数据库映射到虚拟内存中。因为它代表了每个页面的内存为28字节的数据结构,所以128GB系统上的PFN数据库大约需要980MB。32位Windows有一个由硬件定义的4GB虚拟地址空间,在当前执行的用户模式进程(例如记事本)和系统之间默认分割。980MB因此消耗了可用的2GB系统虚拟地址空间的将近一半,仅剩1GB的内核映射,

推动Windows的限制:物理内存

这也是为什么内存限制表列出了在使用4GB调优(称为4GT并使用Boot.ini的/ 3GB或/ USERVA,以及Bcdedit的/设置IncreaseUserVa启动选项启动)时,同一SKU的下限,因为4GT将拆分给用户模式3GB,只留下1GB的系统。为了提高性能,Windows Server 2008通过将其最大32位物理内存支持降至64GB,为系统地址空间预留了更多空间。

内存管理器可以通过根据需要将PFN数据库的片段映射到系统地址来容纳更多的内存,但这会增加复杂性并且可能由于增加的映射和取消映射操作而降低性能。直到最近,系统才变得足够大才能被考虑,但是由于系统地址空间不是在64位Windows上映射整个PFN数据库的限制,因此对64位Windows的支持更多。

64位Windows Server 2008 Datacenter的最大2TB限制不是来自任何实现或硬件限制,但Microsoft将只支持可以测试的配置。从Windows Server 2008的发行版开始,任何地方最大的系统都是2TB,所以Windows限制了它在那里使用物理内存。

Windows客户端内存限制

64位Windows客户端SKU支持不同数量的内存作为SKU差异化功能,其中Windows XP Starter为512MB,Vista Ultimate为128GB,Windows 7 Ultimate为192GB。但是,所有32位Windows客户端SKU(包括Windows Vista,Windows XP和Windows 2000 Professional)最多支持4GB的物理内存。4GB是使用标准x86内存管理模式可访问的最高物理地址。最初,甚至在服务器上,甚至不需要考虑在客户机上支持4GB以上的内存。

但是,当Windows XP SP2正在开发之中时,预计会有超过4GB的客户端系统,因此Windows团队开始在内存超过4GB的系统上对Windows XP进行广泛的测试。Windows XP SP2还在硬件上启用了物理地址扩展(PAE)支持,该硬件实现了不执行内存,因为它是数据执行保护(DEP)所必需的,但是也支持超过4GB的内存。

他们发现,许多系统会崩溃,挂起或无法启动,因为一些设备驱动程序(通常是在客户端而不是在服务器上找到的视频和音频设备)通常没有被编程为预计物理地址大于4GB。因此,驱动程序会截断这些地址,导致内存损坏和损坏的副作用。服务器系统通常具有更通用的设备并具有更简单和更稳定的驱动程序,因此通常没有出现这些问题。有问题的客户端驱动程序生态系统导致客户SKU决定忽略高于4GB的物理内存,即使理论上可以解决这个问题。

32位客户端有效内存限制 

虽然4GB是32位客户端SKU的许可限制,但有效限制实际上较低,并取决于系统的芯片组和连接设备。原因是物理地址映射不仅包含RAM,还包含设备内存,x86和x64系统将所有设备内存映射到4GB地址边界以下,以便与不知道如何处理的32位操作系统兼容地址大于4GB。如果一个系统有4GB内存和设备,比如视频,音频和网络适配器,这些设备的内存总和为500MB,那么500MB的4GB内存将会位于4GB的地址边界之上,如下图所示:

推动Windows的限制:物理内存

结果是,如果你有一个内存为3GB或更多的系统,并且你正在运行一个32位的Windows客户端,那么你可能没有得到所有内存的好处。在Windows 2000,Windows XP和Windows Vista RTM上,您可以在系统属性对话框,任务管理器的性能页面以及在Windows XP和Windows Vista(包括SP1)上的Msinfo32中查看Windows可以访问多少RAM。 Winver实用程序。在Windows Vista SP1上,其中一些位置更改为显示已安装的RAM,而不是可用的RAM,如本知识库文章中所述

在我的4GB笔记本电脑上,使用32位Vista引导时,可用的物理内存量为3.5GB,如Msinfo32实用程序中所示:

推动Windows的限制:物理内存

您可以使用Alex IonescuMeminfo工具(他正在贡献David Solomon共同编写Windows Internals的第5版)来查看物理内存布局这是Meminfo的输出,当我用-r开关在系统上运行它时,转储物理内存范围:

推动Windows的限制:物理内存

请注意内存地址范围从9F0000页到100000页的间隔,以及另一个从DFE6D000到FFFFFFFF(4GB)的间隙。但是,当我使用64位Vista引导系统时,所有4GB都显示为可用,并且您可以看到Windows如何使用4GB边界之上剩余的500MB RAM:

推动Windows的限制:物理内存 

什么是占用4GB以下的洞?设备管理器可以回答这个问题。要检查,启动“devmgmt.msc”,在视图菜单中选择连接资源,然后展开内存节点。在我的笔记本电脑上,映射设备内存的主要消费者是(不出所料)显卡,它在E0000000-EFFFFFFF范围内消耗了256MB:

推动Windows的限制:物理内存

其他杂项设备占了其余的大部分,PCI总线为设备保留额外的范围,作为固件在启动过程中使用的保守估计的一部分。

大容量视频卡的高端游戏系统对低于4GB的内存地址的消耗可能非常大。例如,我从一家精品游戏钻机公司购买了一台4GB内存和两块1GB显卡。我没有指定操作系统的版本,并假设他们把64位的Vista,但它来的32位版本,因此只有2.2GB的内存可以访问的Windows。在我安装了64位Windows之后,在系统的Meminfo输出中可以看到从8FEF0000到FFFFFFFF的巨大内存空洞:

推动Windows的限制:物理内存

“设备管理器”显示,超过2GB的洞中有512MB是针对视频卡的(每个256MB),看起来固件为动态映射预留了更多的空间,或者因为它的估计保守:

推动Windows的限制:物理内存

即使只有2GB的系统也可以避免在32位Windows下使用所有的内存,因为芯片组积极地保留了设备的内存区域。我们几个月前从一家主要OEM购买的共享家庭计算机报告说,只有1.97GB的2GB安装可用:

推动Windows的限制:物理内存

物理地址范围从7E700000到FFFFFFFF由PCI总线和设备保留,物理地址空间的理论最大值为7E700000字节(1.976GB),但有一部分保留给设备内存,这就解释了为什么Windows报告1.97GB。

推动Windows的限制:物理内存

由于设备供应商现在必须向Microsoft的Windows硬件质量实验室(WHQL)提交32位和64位驱动程序以获得驱动程序签名证书,目前大多数设备驱动程序可能处理高于4GB的物理地址。但是,32位Windows将继续忽略它之上的内存,因为还有一些难以衡量的风险,而OEM(至少应该是)转向64位Windows,这不是问题。

底线是,无论数量多少,您都可以充分利用系统内存(高于SKU的限制),如果您正在购买高端游戏系统,则应该要求OEM将64位它在工厂的Windows。

你有足够的记忆吗?

不管你的系统有多少内存,问题是,这足够吗?不幸的是,没有硬性规定可以让你确切地知道。您可以使用基于一段时间监视系统“可用”内存的一般指导原则,特别是在运行内存密集型工作负载时。Windows将可用内存定义为未分配给进程,内核或设备驱动程序的物理内存。顾名思义,如果需要,可用内存可用于分配到进程或系统。内存管理器当然试图通过使用它作为一个文件缓存(备用列表),以及为零内存(零页列表),Vista的“

如果可用的内存变得稀少,那意味着进程或系统正在使用物理内存,并且如果它在很长一段时间内保持接近于零,那么通过增加更多的内存,您可能会受益匪浅。有很多方法来跟踪可用内存。在Windows Vista上,通过观察任务管理器中的物理内存使用情况历史记录,可以间接跟踪可用内存,随着时间的推移,它将保持接近100%。这里是我的8GB桌面系统上的任务管理器的截图(嗯,我想我可能有太多的内存!):

推动Windows的限制:物理内存

在所有版本的Windows上,可以使用性能监视器通过添加内存性能计数器组中的可用字节计数器来绘制可用内存:

推动Windows的限制:物理内存 

您可以在“任务管理器”的“性能”页面上看到Process Explorer的“系统信息”对话框中的即时值,或者在Vista之前的Windows版本中。

推动Windows的极限

在CPU,内存和磁盘之外,内存通常是整个系统性能最重要的部分。越多越好。64位Windows是确保你充分利用它的好方法,64位Windows可以在将来谈论的其他性能优势,当我说话的时候推动限制博客文章关于虚拟内存的限制。

 

相关文章:

  • 2022-12-23
  • 2021-09-11
  • 2021-10-22
  • 2021-12-25
  • 2022-12-23
  • 2021-04-03
猜你喜欢
  • 2021-06-09
  • 2022-12-23
  • 2021-06-05
  • 2022-01-30
  • 2022-12-23
  • 2021-11-12
  • 2021-12-07
相关资源
相似解决方案