解决内存限制问题

 

上一次修改主题: 2006-07-25

根据设计,Exchange Server 是一个特别能占用内存的用户,最多能使用 3 GB 物理内存。在生产服务器上,常常会看到 Store.exe 进程占用 1.5 GB 的虚拟内存,因为此进程需要维护大量的内存缓存。

除了 Exchange 内部的各种进程使用内存以外,Exchange 的 ExIFS 内核驱动程序也会使用内核内存。尽管这种情况很少见,但是大量使用内核内存将严重降低性能并导致系统不稳定。

查看用户空间内存

当服务器使用内存且可用内存不足时,操作系统即开始整理进程的工作集,并更加主动地使用页面文件。使用页面文件会影响总体性能,因为磁盘操作比内存操作所用的时间更长。

此外,当出入磁盘的分页足够频繁时,最终将导致磁盘瓶颈,并会影响性能。在这种情况下,实际问题出在内存中,磁盘瓶颈只是一种现象。

使用下表列出的计数器,可以确定用户空间内存的当前状态。

用户空间内存的性能计数器

计数器 预期值

内存/可用兆字节数 (MB)

指示可立即分配给进程或供系统使用的物理内存量 (MB)。

可用内存量等于分配给备用(缓存)、可用和零分页列表的内存的总量。

  • 在测试期间,必须始终有 50 MB 的可用内存。

内存\页面/秒

指示从磁盘读取页面或将页面写入磁盘(以解决硬页面错误)的速率。

此计数器是一个主要指标,可以指出导致系统范围延迟的错误类型。其中包含为解决文件系统缓存中的页面错误而检索到的页面。这些页面通常是由应用程序请求的。

  • 此计数器应该始终低于 1,000。

提高用户空间内存

以下列表说明如何提高用户空间内存的性能:

  • 删除多余软件
    若要为 Exchange 释放资源,请从服务器中删除执行远程监视的所有第三方软件工具或不重要的任何类型的服务。可以使用“性能”管理单元了解每个应用程序占用的内存量。
  • 在非高峰期间运行维护任务
    在高峰期间运行维护工具(如 eseutil)或任务(如邮箱管理)可能会占用 Exchange 所需的内存。最好在非高峰期间或资源使用率较低(如周末)时运行这些工具和任务。

查看内核内存使用情况

Windows 内核内存(包含由核心操作系统或内核使用的多个内存结构)是必须监视的另一个区域,目的是确保能正常部署 Exchange Server。此部分说明如何监视影响 Exchange 服务器性能和可靠性的内核内存结构,以及如何进行故障排除。

应该在运行 Exchange 的服务器上监视三个关键的内核内存结构:

  • 页面缓冲池 页面缓冲池是共享系统内存的一部分,可以被分页到磁盘页面文件。页面缓冲池是在系统初始化期间创建的,并由内核模式组件用于分配系统内存。
  • 非页面缓冲池 非页面缓冲池包含系统虚拟地址,这些地址能保证始终驻留在物理内存中,因而可以从任何地址空间进行访问,而不会导致页面输入/输出 (I/O)。与页面缓冲池一样,非页面缓冲池也是在系统初始化期间创建的,并由内核模式组件用于分配系统内存。
  • 系统 PTE 页面文件虚拟内存地址将以页表方式映射到物理内存地址。Microsoft Exchange Server 2003 使用系统页表条目 (PTE) 缓冲池来映射系统页面(如 I/O 空间、内核堆栈和内存描述符列表)。

Boot.ini 文件设置影响内核内存空间的大小

Exchange 服务器上内核内存空间的最大大小会受到 Microsoft Windows Server™ 2003 boot.ini 文件中的设置影响。例如,如果在 boot.ini 文件中使用 /3GB 开关,则应该为用户模式进程分配 3 GB 的虚拟地址空间,而只为操作系统分配 1 GB 的虚拟地址空间。

有关使用 /3GB 开关的详细信息,请参阅下列 Microsoft 知识库文章:

下表显示了在运行 Exchange 的服务器上每个内核内存空间的大致最大大小随 boot.ini 设置变化的情况。在此示例中,Exchange Server 2003 在运行 Windows Server 2003 的多处理器服务器(含有 4 GB 的 RAM)上运行。

Boot.ini 设置和最大内核内存空间大小

内核内存空间 具有默认 boot.ini 选项的最大大小 具有 boot.ini 选项 /3GB 和 /USERVA = 3030 的最大大小

页面缓冲池

356 MB

245 MB

非页面缓冲池

256 MB

128 MB

系统 PTE

提供 300,000 个页表条目

提供 24,000 个页表条目

下表显示了 Exchange Server 的性能监视器警报设置,此 Exchange Server 在运行 Windows Server 2003 的多处理器服务器(含有 4 GB 的 RAM)上运行。在“警告”级别,服务器是稳定的,但应该调查内存分配的潜在泄露。在“紧急”级别,服务器将处于不稳定的危险状态,特别是在负载高峰时。

具有不同 Boot.ini 文件设置的性能监视器警报设置

内核内存空间 性能监视器计数器 具有默认 boot.ini 的性能监视器触发器 具有 boot.ini 选项 /3GB 和 /USERVA = 3030 的性能监视器触发器

页面缓冲池

内存\页面缓冲池字节

  • “警告”(当页面缓冲池字节计数器超过 300 MB 时)
  • “紧急”(当页面缓冲池字节计数器超过 320 MB 时)
  • “警告”(当页面缓冲池字节计数器超过 200 MB 时)
  • “紧急”(当页面缓冲池字节计数器超过 220 MB 时)

非页面缓冲池

内存\非页面缓冲池字节

  • “警告”(当非页面缓冲池字节计数器超过 200 MB 时)
  • “紧急”(当非页面缓冲池字节计数器超过 220 MB 时)
  • “警告”(当非页面缓冲池字节计数器超过 100 MB 时)
  • “紧急”(当非页面缓冲池字节计数器超过 110 MB 时)

系统 PTE

内存\可用系统页表条目 *

  • “警告”(当可用系统页表条目少于 8,000 时)
  • “紧急”(当可用系统页表条目少于 5,000 时)
  • “警告”(当可用系统页表条目少于 8000 时)
  • “紧急”(当可用系统页表条目少于 5,000 时)

* 在不带 Service Pack 1 的 Windows Server 2003 安装中,性能监视器“内存\可用系统页表条目”计数器不正确。有关此计数器的详细信息,请参阅 Microsoft 知识库文章 894067“在 Windows Server 2003 中性能工具不能正确显示可用的可用系统页表条目”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=894067)。

运行 Exchange 的服务器上的内核内存耗尽现象

对于运行 Exchange 的服务器上的内核内存耗尽现象,其表现范围可以从响应速度缓慢到彻底出现故障。

运行 Exchange 的服务器上的内核内存耗尽现象

内核内存空间 耗尽现象

页面缓冲池

  • 用户界面响应速度缓慢或不响应
  • 服务器出现邮件或客户端处理故障
  • 页面缓冲池分配故障(事件 ID 2020:“服务器无法从系统页面缓冲池中进行分配,因为缓冲池为空。”)有关详细信息,请参阅 Microsoft 知识库文章 312362“服务器无法分配系统页面缓冲池中的内存。”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=312362)。

非页面缓冲池

  • 用户界面响应速度缓慢或不响应
  • 服务器出现邮件或客户端处理故障
  • 服务器无法响应网络请求
  • 非页面缓冲池分配故障(事件 ID 2019:“服务器无法从系统非页面缓冲池中进行分配,因为缓冲池为空。”)

系统 PTE

  • 服务器无法响应 I/O 请求
  • 服务器无法响应网络请求
  • 服务器出现邮件或客户端处理故障

排除运行 Exchange 的服务器上的内核内存故障

如果上表(“具有不同 Boot.ini 文件设置的性能监视器警报设置”)中显示的性能监视器内核内存计数器超过了建议值,并且/或者出现了表“运行 Exchange 的服务器上的内核内存耗尽现象”中说明的现象,请使用以下故障排除方法确定导致内核内存耗尽的原因。

  1. 运行 Microsoft Exchange Server 最佳实践分析工具,以确定是否正确配置了 Exchange 服务器。
    有多种配置设置会影响 Exchange Server 内核内存空间(如前面讨论的 boot.ini 设置 /3GB 和 /Userva、SystemPages 注册表项以及其他设置)。在调查内核内存耗尽现象之前,应确保服务器的内核内存配置正确,这一点非常重要。运行 Microsoft Exchange 最佳实践分析工具,并仔细查看输出,以确保服务器配置正确。有关该工具的详细信息,请参阅 Microsoft 下载中心中的 Exchange Server Best Practices Analyzer Tool(英文)。
  2. 确定内核内存空间即将被耗尽。
    • 分析事件 分析事件查看器日志,以找到缓冲池和非页面缓冲池分配故障事件(事件 ID 为 2019 和 2020)的证据。
    • 分析性能 使用性能监视器创建页面缓冲池、非页面缓冲池以及可用系统 PTE 的日志,在 24 小时内每 60 秒抽样一次。将性能监视器日志结果与前面显示的表(“具有不同 Boot.ini 文件设置的性能监视器警报设置”)中的警告和紧急触发器进行比较。
      使用前面显示的三个表分析事件查看器和性能监视器日志时,可以明显看出即将耗尽的内核内存空间。
  3. 确定导致内核内存空间耗尽的原因。
    1. 确定缓冲池和/或非页面缓冲池内存中导致内存耗尽的标记。
      操作系统使用标记跟踪缓冲池和非页面缓冲池的内核内存分配。默认情况下,Windows Server 2003 将执行此操作;Microsoft Windows 2000 Server 使用全局标志编辑器实用程序 (gflags.exe) 启用缓冲池标记。有关与内存故障排除相关的标志的详细信息,请参阅 Microsoft 知识库文章 177415“如何使用内存缓冲池监视器 (Poolmon.exe) 对内核模式内存泄漏进行故障排除”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=177415) 以及知识库文章 298102“如何找到由第三方驱动程序使用的缓冲池标记”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=298102)。
      运行内存缓冲池监视器 (poolmon.exe) 或 MemSnap 内存配置文件工具(memsnap.exe,带有 /p 开关),以便将标记转储到文件,然后确定占用最多缓冲池或非页面缓冲池内存的标记。按照计划的时间间隔运行 MemSnap 内存配置文件工具可以帮助找到内核内存泄漏,并指出内存分配随时间变化的情况。有关 MemSnap 内存配置文件工具的详细信息,请参阅“Memsnap 概述”(https://go.microsoft.com/fwlink/?LinkId=50167)。

      MemSnap 内存快照示例

      标记类型 分配 释放 差异 字节 每次分配

      AGP Nonp

      1

      0

      1

      344

      344

      AGP 分页

      7

      5

      2

      384

      192

      AcdN Nonp

      2

      0

      2

      1,072

      536

      AcpA Nonp

      39

      36

      3

      192

      64

      AcpA 分页

      1

      0

      1

      504

      504

      AcpB 分页

      42

      38

      4

      576

      144

      AcpD Nonp

      315

      170

      45

      15,080

      335

      AcpF Nonp

      493

      485

      8

      320

      40

      在上表显示的示例中,可以使用“字节”列找出占用最多内存的标记。在本示例中为 AcpD Nonp。可以使用“分配”和“释放”列跟踪潜在的内存泄漏。“分配”和“释放”差值很大表明可能存在潜在的内存泄露。

    2. 使缓冲池标记或非页面缓冲池标记与应用程序或驱动程序相匹配。可以使用以下资源将有问题的标记与调用应用程序或驱动程序相匹配:
      下载并安装适用于 Windows 的 Microsoft 调试工具 (https://go.microsoft.com/fwlink/?LinkId=50168)。安装程序会将“pooltag.txt”置于 %program files%\Debugging Tools for Windows\triage 目录中,该目录提供 Microsoft 应用程序或驱动程序与其关联标记之间的映射。例如:
      Ntf?- ntfs.sys - NTFS 特定分配标记
      Ntf0 - ntfs.sys - 常规缓冲池分配
      Ntf9 - ntfs.sys - 大容量临时缓冲区
      有关标记的详细信息,请参阅 Microsoft 知识库文章 298102“如何找到由第三方驱动程序使用的缓冲池标记”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=298102)。
      对标记分配泄露执行更正操作:
      如果泄露标记是由 Microsoft 开发的应用程序或驱动程序(在前面提到的 pooltag.txt 文件中指出),请与 Microsoft 产品支持服务联系。
      如果泄露标记是由第三方开发的应用程序或驱动程序,请与第三方制造商的支持服务联系。
      在适当情况下,可以禁用或卸载有问题的应用程序和/或驱动程序,以维护系统稳定性,直到修复泄露为止。

    3. 对分配了很大内存但没有泄露证据的标记执行更正操作。
      有时,缓冲池标记或非页面缓冲池标记会占用大量的内核内存(非页面缓冲池大约为 10MB/标记,页面缓冲池为 40MB/标记),但标记没有泄露。通常,将 Exchange 邮箱服务器扩展到 4,000 或更多个邮箱时,或者正在处理的邮件传递队列超过 10,000 封邮件时,将会出现上述情况。
      以下是内存使用率很高(基于标记分配)的特殊情况:
      TOKE 页面缓冲池标记 Windows 使用此标记为服务器上打开的每个用户会话缓存安全信息。例如,为电子邮件客户端(如 Microsoft Office Outlook)生成的每个用户会话创建令牌(使用 TOKE 页面缓冲池标记分配内存)。可以为每个电子邮件客户端打开多个会话(具体取决于客户端),从而导致在服务器上为每个客户端缓存多个令牌。通常,每个令牌占用的页面缓冲池内存基于用户所属的安全组数目。用户所属的安全组越多,与该用户的会话关联的令牌所占用的页面缓冲池内存就越多。
      在下表的 MemSnap 输出中,令牌平均大小大约为 3 KB。

      MemSnap 内存快照示例

      标记类型 分配 释放 差异 字节 每次分配

      令牌分页

      4,856,027

      4,855,591

      436

      12,093,848

      2,967

      执行以下步骤,以更正页面缓冲池内存耗尽现象(TOKE 标记作为页面缓冲池内存的主要使用者):
      如果每个令牌(每次分配的 TOKE)占用的页面缓冲池内存超过 8 KB:
      •   减少组织中安全组的数目。
      •   合并安全组并消除深层嵌套。
      如果每个令牌(每次分配的 TOKE)占用的页面缓冲池内存低于 8 KB:
      •   如果页面缓冲池耗尽现象发生在邮箱服务器上,请减少服务器上的邮箱数目,并且/或者从邮箱服务器中删除公用文件夹角色。
      •   如果页面缓冲池耗尽现象发生在公用文件夹服务器上,请减少使用公用文件夹服务器作为默认公用存储的邮箱存储的数目。这将减少公用文件夹服务器上的客户端数目(最终会减少用户会话的数目)。
      •   如果广泛使用 Outlook 的日历共享,请确保所有客户端都在运行 Outlook 2003 或更高版本。日历共享通过创建额外的用户会话,从而在服务器上创建额外的令牌负载。与以前版本相比,Outlook 2003 可以更有效地执行此任务(会话数目较少)。
      MMST 页面缓冲池标记 Windows 缓存管理器使用此标记缓存文件。当页面缓冲池即将耗尽时,Windows 缓存管理器会自动减少文件缓存,以释放页面缓冲池内存。如果 Exchange 最佳实践分析工具没有报告任何与 SMTP 配置有关的警告或错误,则不需要执行任何更正操作。非默认或不正确的 SMTP 设置可能会在 Windows 缓存管理器上施加额外负载,从而可能导致占用更多的页面缓冲池内存。
      如果您遇到与 MMST 页面缓冲池标记有关的页面缓冲池耗尽现象和/或事件,请与 Microsoft 产品支持服务联系。
      AUXL 和 FLST 非页面缓冲池标记 这些标记由 exifs.sys 使用,该程序是内核模式驱动程序,Exchange 存储驱动程序使用该程序从邮件数据库读取项目或将项目写入邮件数据库。
      如果这两个标记中的任意一个标记是非页面缓冲池内存的主要使用者,请与 Microsoft 产品支持服务联系。
      IpSA 非页面缓冲池标记 主要的 IPSec(IP 安全性)设备驱动程序 IPSec.sys 使用此 Windows 标记来访问存储在页面缓冲池内存中的安全关联。在 Exchange 服务器上使用 IPSec.sys 会增加非页面缓冲池的管理开销。在非页面缓冲池耗尽的情况下,如果此标记是非页面缓冲池内存的主要使用者,请考虑执行以下更正操作:
      如果非页面缓冲池耗尽现象发生在邮箱服务器上,请减少服务器上的邮箱数目,并且/或者从邮箱服务器中删除公用文件夹角色。
      如果非页面缓冲池耗尽现象发生在公用文件夹服务器上,请减少将公用文件夹服务器设置为默认公用存储的邮箱存储的数目。这将减少公用文件夹服务器上的客户端数目(最终会减少用户会话的数目)。

    4. 找出 PTE 耗尽的原因,这不像找出页面或非页面缓冲池耗尽的原因那样容易。没有用于跟踪 PTE 占用情况的工具,如 MemSnap。只能通过执行常规的更正操作来解决 PTE 耗尽问题。
      PTE 泄露情况 可以使用性能监视器找出由泄露引起的 PTE 耗尽(使用上述与可用系统 PTE 关联的计数器)。PTE 泄露本身表现为几天内连续耗尽性能监视器内存\可用系统 PTE。有关 PTE 泄露条件诊断的信息,请与 Microsoft 产品支持服务联系。
      PTE 耗尽情况 在未发生 PTE 泄漏时,没有证据表明会发生 PTE 耗尽泄漏。通常,将 Exchange 邮箱服务器扩展到 4,000 或更多个邮箱、或者第三方驱动程序占用 PTE 时会发生这些情况。请执行以下更正操作来解决 PTE 耗尽问题:
      •   删除所有不必要的第三方驱动程序。
      •   使用 /BASEVIDEO 或常规视频驱动程序来释放系统页表条目。视频板使用系统页表条目来映射内核空间中的缓冲区。这会占用 Microsoft Exchange 所需的系统页表条目。
      •   降低 boot.ini 中的 /USERVA 设置以添加更多的可用 PTE。若要执行此操作,请按照 Microsoft 知识库文章 823440“在基于 Windows Server 2003 的系统上的 Exchange Server 2003 中使用 /3GB 开关”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=823440) 中的说明操作。
      •   如果 PTE 耗尽现象发生在邮箱服务器上,请减少服务器上的邮箱数目,并且/或者从邮箱服务器中删除公用文件夹角色。
      •    如果 PTE 耗尽现象发生在公用文件夹服务器上,请减少将公用文件夹服务器设置为默认公用存储的邮箱存储的数目。此操作将减少公用文件夹服务器上的客户端数目(最终会减少用户会话的数目)。

查看 Exchange 存储虚拟内存

服务器的每个 Store.exe 进程可以处理的内存量(称为存储虚拟内存)是有限的。扩展服务器以适应更多用户和更高使用率时,服务器可能会在虚拟内存中缓慢运行。当服务器已具有 4 GB 的 RAM 时,将无法再进一步扩展服务器内存。添加更多物理内存不能解决虚拟内存不足的错误。

当服务器在虚拟内存中缓慢运行时,如果由于内存太低而强制 Store.exe 进程使用页面文件,并且 Store.exe 进程快速启动分页,将会导致服务器的总体性能下降。

可以使用下表列出的性能计数器来确定存储的虚拟内存的当前状态。

Exchange 存储虚拟内存的性能监视器

计数器 预期值

MSExchangeIS\VM Largest Block Size

显示最大可用虚拟内存块的大小(字节)。

此计数器是一条随虚拟内存占用量增加而向下倾斜的线。当此计数器降至 32 MB 以下时,Exchange 2003 会在事件日志中记录一个警告(事件 ID=9582)。当此计数器降至 16 MB 以下时,Exchange 会记录一个错误。

  • 此值应该始终不低于 32 MB。

MSExchangeIS\VM Total 16 MB Free Blocks

显示大于或等于 16 MB 的可用虚拟内存块的总数。

此计数器显示一条可能先上升、但随后会随可用内存的碎片化程度增大而最终下降的线。它最初会显示几个大的虚拟内存块,然后可能会逐渐显示更多更小的独立块。当这些块小于 16 MB 时,此线开始下降。

  • 此值应该始终不低于 1。

MSExchangeIS\VM Total Free Blocks

显示可用虚拟内存块的总数(不考虑大小)。

此计数器显示一条线,此线可能先上升,但在可用内存被碎片化为更小的块、然后这些块被占用时可能最终会下降。

使用此计数器可以度量可用虚拟内存的碎片化程度。Process\Virtual Bytes\STORE 实例除以 MSExchangeIS\VM Total Free Blocks 即可得出平均块大小。

  • 此值应该始终不低于 1。

MSExchangeIS\VM Total Large Free Block Bytes

显示大于或等于 16 MB 的所有可用虚拟内存块大小的总和(字节)。

此计数器监视存储内存碎片,并形成一条随内存占用量增加而向下倾斜的线。在正常运行的服务器上,此线应该始终高于 50 MB。

  • 此值应该始终不低于 50 MB。

Store.exe 进程还将使用其自身的堆分配机制和结构(称为 exchmem)。Store.exe 进程将在启动时创建多个 exchmem 堆,在现有数目的堆被完全使用或碎片化(此时分配找不到足够的连续内存,因而导致失败)之前,不会增加堆的数目。

如果存在内存使用问题或内部碎片(exchmem 堆内部的碎片,其本身驻留在存储的虚拟内存空间内),Store.exe 进程将创建新的 exchmem 堆。

通常,如果 Store.exe 进程必须重复创建额外的堆,则总体存储虚拟内存将被碎片化或耗尽。通过跟踪下表列出的计数器,可以确定 exchmem 堆是否为导致问题或性能下降的根源(因为堆被碎片化)。

exchmem 堆的性能计数器

计数器 预期值

MSExchangeIS\Exchmem:包含内存错误的堆数目

指示由于可用内存不足而无法分配的 exchmem 堆的总数。

  • 此值应该始终为 0(零)。

MSExchangeIS\Exchmem:内存错误数目

指示可用内存无法满足的 exchmem 分配的总数。

  • 此指应该始终为 0(零)。

MSExchangeIS\Exchmem:额外堆的数目

指示启动后由存储创建的 exchmem 堆的数目。

  • 此值应该始终不超过 3。

提高 Exchange 存储虚拟内存

以下列表说明如何提高 Exchange 存储虚拟内存的性能:

  • 合并存储组
    对于每个存储组,Store.exe 进程都必须分配结构并占用内存。如果可能,请使用满足 SLA 的最小数目的存储组。这对于 Exchange 2000 而言比 Exchange 2003 更为重要。在 Exchange 2003 中已进行大量更改,以减少每个额外存储组多占用的虚拟内存量。因此,存储组或数据库配置几乎不可能是导致 Exchange Server 2003 上虚拟内存碎片化的根本原因。有关在 Exchange 2003 中配置存储组的详细信息,请参阅 Microsoft 知识库文章 890699“如何在 Exchange Server 2003 中配置存储组”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=890699)。
  • 减轻服务器角色的负担
    如果由于服务器正在执行多个角色(如作为公用文件夹和邮箱服务器)而导致内存使用率增加,则最好减轻专用服务器的角色负担。
  • 请阅读 Microsoft 知识库文章 815372
    有关如何优化虚拟内存使用的详细信息,请参阅 Microsoft 知识库文章 815372“如何优化 Exchange Server 2003 中的内存使用”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=815372)。