虚拟内存碎片的检测和EXCHANGE的内存优化

12/3/2006来源:Exchange Server人气:5880

本文部分内容参考自KB.

一、概述:
什么是虚拟内存?我们使用的计算机都是基于X86的32位操作系统,而计算机是以二进制来描述的。因此2^32=4096MB=4GB。也就是说,一个32位计算机上运行的进程,最大寻址空间为4GB,这就是我们说的虚拟地址空间。它和实际的物理内存空间并无关联。
当某一进程将属于它的虚拟内存用完后,即使你有再多的物理内存空闲,也将出现无内存可分配的情况。遗憾的是,我们不能通过增加物理内存的方法来增加虚拟内存。

什么是虚拟内存碎片?由于内存的分配和管理是由操作系统的内存管理器来完成的。其是一个动态变化的过程。内存的分配和使用以及释放都是动态的。因此,在计算机运行一段时间后,就会因为频繁的内存分配和释放,产生一段一段不连续的小块内存块,称为虚拟内存碎片。

内存碎片的危害。服务器产生大量的内存碎片后,就会导致EXCHANGE的STORE进程(此进程为最耗用内存的进程且该进程是依据虚拟内存来设计的)在使用中不能获得可用的虚拟内存空间块,时间长了,就会发生虚拟内存不足以分配的现象,严重的虚拟内存不足,将影响系统对邮件的处理工作。

二、虚拟内存和9582日志
我们经常在一个负载很高的服务器上发现事件里记录着一些9582的警告或错误日志,并且发现STORE长时间的占用大量的内存空间,这种现象几乎无法改变,只有重新启动计算机才能得以暂时的缓解。

出现9582日志表明STORE进程已经遇到了一个虚拟内存不足问题。随着虚拟内存不足的情况的加剧,9582日志将由警告转变为错误。一般来说,当最大的可用虚拟内存的空闲块大小少于32MB时,将记录9582的警告错误,
Source:MSExchangeIS
Category:Performance
ID:9582
Type:Warning
Description:
The virtual memory necessary to run your Exchange server is fragmented in such
a way that performance may be affected.It is highly recommended that you restart
all Exchange services to correct this issue.

For more information, click
当小于16MB时,将记录9582的错误日志。
Source:MSExchangeIS
Category:Performance
ID:9582
Type:Error
Description:
The virtual memory necessary to run your Exchange server is fragmented in such
a way that performance may be affected.It is highly recommended that you restart
all Exchange services to correct this issue.

For more information, click
出现该警告错误后,你应根据情况,安排在未来的36-72小时内执行预定的停机维护计划,出现错误日志后,你应尽快的在工作空闲时间重新启动你的服务器,以缓解虚拟内存不足问题。因为出现9582错误日志后,STORE进程既不能创建额外的堆,也将无法正确的安装和卸载存储组,当虚拟内存的最大空闲继续减少到小于10MB时,STORE将无法安装存储组。所以出现9582的错误日志,应尽可能的立即执行关机维护工作,以避免在高峰时间带来的性能问题。

三、虚拟内存和12800日志
当虚拟内存的不足现象继续加剧时,系统将出现在邮件处理过程中出现虚拟内存不足而导致的错误,这时系统将记录12800错误日志
Source: MSExchangeIS
Category:Content Engine
ID: 12800
Type: Error
Description:
Message PRocessing failed because there is not enough available memory (8007000E-82000387).
在没有足够的可用虚拟内存处理邮件,或者由于邮件格式问题的情况下,您可能会在应用程序事件日志中看到此事件。此事件单独出现并不表示存在虚拟内存碎片问题。但是,在短时间内多次出现此事件则说明服务器上的虚拟内存碎片问题已经相当严重了。

四、内存最优配置检测
在EX2003里,在STORE进程启动时,系统会自动进行内存最优配置检测工作,如果你的内存不是最优配置的,9665事件将记录在你的日志中。以下情况之一将记录9665警告日志:
1、Exchange 安装在基于 Microsoft Windows 2000 的计算机上,并且 SystemPages 注册表值没有设置在 24000 31000 之间。
2、服务器安装了 1 GB 或更大的物理 RAM,但没有在 Boot.ini 文件中设置 /3GB 选项。
3、Exchange 安装在基于 Windows Server 2003 的计算机上,此计算机安装了 1 GB 或更大的物理 RAM,并且在 Boot.ini 文件中设置了 /3GB 选项,但 Boot.ini 文件中没有 /userva 选项或此选项没有设置在 3030 2970 之间。
当记录事件 ID 9665 警告信息时,请按照以下步骤操作:
1、检查注册表中的 SystemPages 设置和 HeapDeCommitFreeBlockThreshold 设置。
2、检查 Boot.ini 文件中的 /3GB 选项和 /userva 选项。
如果要关闭内存配置检查,请将 Suppress Memory Configuration Notification DWord 值添加到以下注册表项中,然后将该值设置为 1:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\Parameterssystem

五、性能日志和警告
以下计数器是最重要的计数器,用于监视 Exchange 2003 Exchange 2000 中的 Store.exe 进程中的虚拟内存碎片:
性能对象:MSExchangeIS
计数器:VM 最大块大小

此计数器显示最大空闲虚拟内存块的大小(以字节为单位)。此计数器显示为一条随着虚拟内存的使用而向下倾斜的线。如果此计数器低于 32 MB,Exchange 就在应用程序事件日志中记录事件 ID 9582 警告信息。如果此计数器低于 16 MB,Exchange 就在应用程序事件日志中记录事件 ID 9582 错误信息。如果最大空闲块很小(小于 10 MB),则服务器进入一种临界状态,在此状态下,邮件操作可能开始失败并且重复记录事件 ID 12800 错误信息。
还可以使用以下计数器监视 Store.exe 进程中的虚拟内存:
性能对象:MSExchangeIS
计数器:VM 空闲块总数

此计数器显示空闲虚拟内存块的总数(与它们的大小无关)。当您监视虚拟内存时,此计数器显示为一条呈金字塔形状的线。可以使用此计数器衡量可用虚拟内存出现碎片的速度。要计算块大小的平均值,请使用以下计数器:
性能对象:进程
计数器:虚拟字节
实例:存储

性能对象:MSExchangeIS
计数器:VM 空闲块总数

要计算块大小的平均值,用“Process”性能对象的“虚拟字节”计数器的“STORE”实例除以“MSExchangeIS”性能对象的“VM 空闲块总数”。
性能对象:MSExchangeIS
计数器:VM 大空闲块总字节数

此计数器显示所有大于或等于 16 MB 的空闲虚拟内存块大小的总数(以字节为单位)。此计数器显示为一条随着虚拟内存的使用而向下倾斜的线。可以使用此计数器和“VM 16 MB 空闲块总数”计数器监视服务器上虚拟内存碎片化的速率以及日常的虚拟内存状态。

六、如何发现内存碎片问题
要发现 Exchange 2003 Exchange 2000 中的虚拟内存碎片问题,请按照以下步骤操作:
查看事件查看器的应用程序事件日志的内容,确定其中是否记录了事件 ID 9582 警告信息或事件 ID 9582 错误信息。

注意:虚拟内存在峰值活动期间低于 32 MB 阈值,在活动较少期间显著增加,这种现象在有些用户很多的环境中可能很常见。
使用性能日志和警报工具监视以下计数器:
性能对象:MSExchangeIS
计数器:VM 最大块大小



密切注意此计数器的值。要查看虚拟内存使用趋势,请在 18 24 小时的一段时间内每隔 1 分钟对此计数器进行一次记录,然后查看“最小”值以记录最低级别。如果此计数器指示虚拟地址空间不足,请按照本文的“如何优化虚拟内存使用” 一节中的步骤操作。
确定其他与信息存储有关的进程(如防病毒程序)是否正在将虚拟内存降至低于 32 MB 阈值或低于 16 MB 阈值的级别。例如,如果一个被配置为扫描邮件数据库的防病毒程序将虚拟内存块降至小于 32 MB,则应用程序事件日志中记录事件 ID 9582 警告信息。虚拟内存级别可能仅稍小于 32 MB 阈值,不会影响性能。在没有用户活动的时间内(例如正常工作时间后),虚拟内存将增加并且不再记录事件 ID 9582 警告信息。

如果性能可以让人接受,并且虚拟内存是在用户活动较少时增加,您可能不必执行相应的步骤来解决虚拟内存问题。但是,如果您预计用户负载将会增加,您可能需要考虑执行相应的步骤来减小服务器上的虚拟内存消耗,以使 Exchange 2003 Exchange 2000 可以处理较大的负载。

七、如何优化虚拟内存使用
警告:注册表编辑器使用不当可导致严重问题,可能需要重新安装操作系统。Microsoft 不能保证您可以解决因注册表编辑器使用不当而导致的问题。使用注册表编辑器需要您自担风险。
要优化虚拟内存使用并帮助减少虚拟内存碎片问题,请按照以下步骤操作:
安装可用于 Microsoft Windows Server 2003 Windows 2000 以及可用于 Exchange 2003 Exchange 2000 的最新的 Service Pack。

注意:Exchange 2000 Server Service Pack 3 (SP3) 中引入了行为改动,以便从较高的内存位置分配“扩展存储引擎 (ESE)”对象。实现这种“从高到低”的分配方式有助于减少虚拟内存碎片。
Boot.ini 文件中设置 /3GB 选项。

如果 Exchange 2003 Exchange 2000 安装在以下任何一种操作系统上,并且计算机上安装了大于 1 GB 的物理 RAM,请在 Boot.ini 文件中设置 /3GB 选项:
Microsoft Windows Server 2003, Standard Edition
Microsoft Windows Server 2003, Enterprise Edition
Microsoft Windows Server 2003, Datacenter Edition
Microsoft Windows 2000 Advanced Server
Microsoft Windows 2000 Server Datacenter Server
此配置选项可以增加虚拟地址空间。

重要说明:如果 Exchange 2003 Exchange 2000 在基于 Windows 2000 Server 的计算机上运行,则不要在 Boot.ini 文件中设置 /3GB 选项。此操作系统不支持该选项。

使用 /3GB 选项的作用之一是显著减少可用于内核的系统页面数。Microsoft 建议在 Exchange 服务器上的 Boot.ini 文件中设置 /3GB 选项,以修改默认设置并增加可以分配的系统页面数。
在基于 Windows 2000 的计算机上的 Boot.ini 文件中设置 /3GB 选项时,Microsoft 建议同时将 SystemPages 注册表项设置为介于 24000 31000 之间的值。推荐值是 30000。如果 SystemPages 值没有设置为 24000 31000 之间的值并且设置了/3GB 选项,Exchange 2003 将在应用程序事件日志中记录事件 ID 9665 信息,以表示服务器上的虚拟内存没有配置为使用最优内存设置。

在基于 Windows Server 2003 的计算机上的 Boot.ini 文件中设置 /3GB 选项时,请将 Boot.ini 文件中的 /userva 选项设置为介于 2970 3030 之间的值。推荐值是 3030(此值等效于注册表设置 31000)。如果 /userva 选项的值在 SystemPages 注册表项中没有设置在 2970 3030 之间,并且设置了 /3GB 选项,Exchange 2003 将在应用程序事件日志中记录事件 ID 9665 信息,以表示服务器上的虚拟内存没有配置为使用最优内存设置。

要在基于 Windows 2000 Server 的计算机上设置 SystemPages 注册表值,请按照以下步骤操作:
单击“开始”,然后单击“运行”。
在“打开”框中,键入 regedit,然后单击“确定”。
找到并单击以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\session Manager\Memory Management

在右窗格中,双击“SystemPages”。
在“数值数据”框中,键入一个介于 24000 31000 之间的数值,然后单击“确定”。
退出注册表编辑器。
注意:为了使虚拟内存设置更明显,如果内存设置不是最优的,Exchange 2003 将记录事件 ID 9665 信息。
尽量减少服务器上存储组的数目。

安装存储组时会使用额外的虚拟内存,而现有存储组中的额外数据库对使用的虚拟内存量的影响很小。因此,在服务器上创建额外的存储组之前,可能需要先填满一个存储组。
在下面的注册表项中设置 HeapDeCommitFreeBlockThreshold DWORD 值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager



HeapDeCommitFreeBlockThreshold 注册表值是堆可以收回的空闲块的最小大小。默认值是 0(零)。这表示堆管理器可以收回每个可用的 4 KB 页面。收回操作可能会造成额外的虚拟内存碎片。可以在以下注册表项中将 HeapDeCommitFreeBlockThreshold 注册表项设置为更高的值,以帮助减少虚拟内存碎片:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

HeapDeCommitFreeBlockThreshold 注册表项的推荐值是“0x00040000”(十六进制格式)。

注意:HeapDeCommitFreeBlockThreshold 注册表项与 /3GB 选项无关。
调整存储数据库缓存大小。

警告:当您使用的是“ADSI 编辑”管理单元、LDP 实用工具或任何其他 LDAP 版本 3 的客户端时,如果对 Active Directory 对象的属性修改不当,可能会导致严重问题。要解决这些问题,您可能需要重新安装 Microsoft Windows 2000 Server、Microsoft Windows Server 2003、Microsoft Exchange 2000 Server Microsoft Exchange Server 2003,或者同时安装 Windows Exchange。Microsoft 不保证能够解决因为 Active Directory 对象属性修改不当而导致的问题。修改这些属性需要您自担风险。

要调整存储数据库缓存大小,请使用“ADSI 编辑”修改 msExchESEParamCacheSizeMax 属性的值。

存储数据库缓存也称为 ESE 缓冲区,在数据库页面被提交到存储区之前,该缓冲区为这些数据库页面提供较大的缓存区域(每个页面 4 KB)。默认情况下,Exchange 2000 将最多 229376 字节 (896 MB) 的内存用于数据库缓存。默认情况下,Exchange 2003 首先查询计算机的内存配置,然后,如果服务器中设置了 /3GB 选项,就使用最多 229376 字节 (896 MB) 的内存;如果服务器中没有设置 /3GB 选项,就使用最多 147456 字节 (576 MB) 的内存。在具有 2 GB 以上内存的服务器中,可能需要增加 ESE 缓冲区的大小。但是,这样做可能会产生内存碎片,因为可用于其余存储功能的地址空间减少了。Microsoft 建议不要将此值设置为大于 307200 字节 (1200 MB)。

如果应用程序事件日志中记录了事件 ID 9582 信息,通过减小数据库缓存大小,也许能够解决导致出现这些事件的问题。为此,Microsoft 建议您指定一个值,该值要小于 msExchESEParamCacheSizeMax 属性的默认值并且是 8192 字节的倍数。但是减小数据库缓存大小后,Store.exe 进程会更加频繁地向磁盘执行读写操作,这可能会影响服务器的性能。

增加最大数据库缓存大小之前,在正常负载情况下,使用性能日志和警报监视“Process”对象的“虚拟字节”计数器的“STORE”实例。此计数器报告 Store.exe 进程所使用的虚拟地址空间的当前大小(以字节为单位)。 注意:确保给 msExchESEParamCacheSizeMax 属性指定的值在 32 MB 边界上结束(即是 32 MB 的倍数)。
减少 ESE 打开表的最大数目。

警告:当您使用的是“ADSI 编辑”管理单元、LDP 实用工具或任何其他 LDAP 版本 3 的客户端时,如果对 Active Directory 对象的属性修改不当,可能会导致严重问题。要解决这些问题,您可能需要重新安装 Microsoft Windows 2000 Server、Microsoft Windows Server 2003、Microsoft Exchange 2000 Server Microsoft Exchange Server 2003,或者同时安装 Windows Exchange。Microsoft 不保证能够解决因为 Active Directory 对象属性修改不当而导致的问题。修改这些属性需要您自担风险。
Exchange 2000 使用的存储引擎缓存有关当前没有被访问的文件夹的数据。在有些情况下,这可能会导致虚拟内存碎片。缓解这种情况的一种方法是减少 Exchange 允许打开的表的最大数目。8 路服务器上的默认设置是每个存储组 27600 个表。如果降低此值,可能会减少虚拟内存碎片问题。但是,降低此值也可能会导致其他情况,如可能由于打开的表过多而使操作失败,并且可能会收到以下错误信息:

Error -1311
JET_errTooManyOpenTables
重要说明:仅当 Microsoft 产品支持服务的支持人员建议您修改此设置时才应这么做。

Exchange 2003 使用不同的方法缓存有关当前没有被访问的文件夹的数据。因此,不要认为减少打开表的最大数目对于减少虚拟内存碎片问题是必需的或有效的。

要减少 ESE 维护的打开表的最大数目,将每个存储组对象的 msExchESEParamMaxOpenTables 属性设置为“27600”。为此,请按照以下步骤操作:
启动“ADSI 编辑”。

注意:“ADSI 编辑”包括在 Windows 2000 支持工具中。要安装 Windows 2000 支持工具,右键单击 Windows 2000 CD-ROM Support\Tools 文件夹中的“Suptools.msi”文件,然后单击“安装”。
展开“配置容器 [ServerName.DomainName.com]”,展开“CN=Configuration,DC=DomainName,DC=com”,展开“CN=Services”,展开“CN=Microsoft Exchange”,展开“CN=OrganizationName”,展开“CN=Administrative Groups”,展开“CN=Administrative Group”(其中 Administrative Group 是包含要修改的存储组的管理组),展开“CN=Servers”,展开“CN=ServerName”,然后展开“CN=InformationStore”。
右键单击“CN=Storage Group”(其中 Storage Group 是要修改的存储组),然后单击“属性”。
在“选择要查看哪些属性”列表中,单击“两者”。
在“选择要查看的属性”列表中,单击“msExchESEParamMaxOpenTables”。
在“编辑属性”框中,键入 27600,然后单击“设置”。
单击“应用”,单击“确定”,然后退出“ADSI 编辑”。

八、参考KB资源
有关如何解决 Exchange 2000 中的虚拟内存碎片问题的更多信息,请查看支持网络发布“Troubleshooting Virtual Memory Fragmentation on Microsoft Exchange 2000 Servers”。为此,请访问下面的 Microsoft Web 站点:
http://support.microsoft.com/default.aspx?scid=kb;en-us;329864

有关如何解决 Exchange 2000 中的性能问题的更多信息,请查看支持网络发布“Microsoft Exchange 2000 Server:Troubleshooting Performance Issues”。为此,请访问下面的 Microsoft Web 站点:
http://support.microsoft.com/default.aspx?scid=kb;en-us;816893

有关虚拟内存碎片的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
823150 如何收集数据以解决 Exchange Server 2003 虚拟内存问题

822180 Exchange Server 2003 和虚拟内存碎片

815372 如何在 Exchange Server 2003 中优化内存使用

317411 XADM:How to Gather Data to Troubleshoot Exchange Virtual Memory Issues

296073 XADM:Monitoring for Exchange 2000 Memory Fragmentation

279615 XADM:Lack of Available Virtual Memory Affects Server Performance

266768 XSTR:How to Modify the Store Database Maximum Cache Size

286350 HOW TO:Use ADPlus to Troubleshoot "Hangs" and "Crashes"

有关 3 /GB 选项的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
291988 A Description of the 4 GB RAM Tuning Feature and the Physical Address Extension Switch

266096 XGEN:Exchange 2000 Requires /3GB Switch with More Than 1 Gigabyte of Physical RAM

313707 XADM:An Exchange 2000 Server with the /3GB Switch in the Boot.ini File May
Lose Network Connectivity Under a Heavy Messaging Load

328882 Exchange 内存使用和 /3GB 开关

有关如何解决特定虚拟内存碎片问题的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
272537 XADM:Virtual Memory Notification Is Calculated Incorrectly

306860 XADM:Incorrect Memory Status When Monitoring Status for Available Virtual Memory

313084 XADM:The Memory Status Is Incorrect When You Monitor the Status for Available Virtual Memory

319682 XGEN:The Exchange 2000 Information Store Reports an Event ID 327 Warning Message and Virtual Memory
May Be Fragmented

324118 XADM:The Extensible Storage Engine Database Engine Contributes to Virtual Memory Fragmentation

331524 XADM:Virtual Memory Performance Monitor Counters Do Not Work on the Passive Node of a Cluster

810985 XADM:Virtual Memory Fragmentation Occurs When You Fail Over an Exchange 2000 Virtual Server

325467 XADM:Event ID 9582 Occurs Immediately After Cluster Failover

314736 XADM:Event Viewer Log Entries Cite Virtual-Memory Fragmentation on an Exchange 2000 Server

315771 XADM:The Information Store Stops on a Cluster Because of the IsAlive Check

311901 The Effects of 4GT Tuning on System Page Table Entries

,