无法从系统分页池分配内存

本文解决了无法从系统分页池分配内存的问题。

适用于: Windows Server 2012 R2
原始 KB 编号: 312362

症状

当服务器负载过大时,服务器服务可能会在系统事件日志中重复记录以下错误。 它指示服务器已用完分页池内存:

源 - SRV
类型 - 错误
事件 ID - 2020
描述-

服务器无法从系统分页池进行分配,因为该池为空。
数据-
0000:00040000 00540001 00000000 c00007e4
0010:00000000 c000009a 00000000 000000000
0020:00000000 00000000 0000000b

原因

有几个因素可能会耗尽分页池内存的供应。 启用池标记并 poolsnaps 采用不同时间间隔可能有助于了解哪个驱动程序正在消耗分页池内存。 poolsnaps如果 指示 MmSt 标记 (Mm 节对象原型 PTE) 是最大的使用者和分页池内存已耗尽,或者系统正在记录错误事件 2020 年代,则很有可能在服务器上打开大量文件。 默认情况下,当系统达到总分页池的 80% 时,内存管理器会尝试剪裁分配的分页池内存。 根据系统配置,计算机上可能的最大分页池内存可以为 343 MB,其中 80% 为 274 MB。 如果内存管理器无法足够快地剪裁以跟上需求,则可能会发生本文“症状”部分中列出的事件。 例如,通过优化内存管理器以在 (之前启动修整过程,当它达到 60%) 时,就可以在突然高峰使用期间跟上分页池需求,并避免分页池内存耗尽。

解决方案

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。 有关如何备份和还原注册表的更多信息,请单击下面的文章编号查看 Microsoft 知识库中相应的文章:
322756 如何在 Windows 中备份和还原注册表

以下优化建议有助于缓解问题:

  1. 启动注册表编辑器 (Regedt32.exe)。

  2. 找到并单击注册表中的以下项:
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management

  3. 在“编辑”菜单上,单击“添加值”,然后添加以下注册表值:
    值名称:PoolUsageMaximum
    数据类型:REG_DWORD
    Radix:Decimal
    值数据:60

    将值设置为 60 会通知内存管理器在 PagedPoolMax 的 60% 处启动剪裁过程,而不是默认设置为 80%。 如果 60% 的阈值不足以处理活动高峰,请将此设置减少到 50% 或 40%。

    值名称:PagedPoolSize
    数据类型:REG_DWORD
    基数:十六进制
    值数据:0xFFFFFFFF

    将 PagedPoolSize 设置为 0xFFFFFFFF 会将最大分页池分配给计算机,而不是其他资源。

    警告

    不建议在具有 64GB RAM 的基于 32 位 Windows Server 2003 的计算机上使用 0xFFFFFFFF PagedPoolSize 设置。 这可能会使免费系统 PTE 条目关闭,并可能导致计算机连续重新启动。 对于此配置,请根据要求和可用资源仔细选择值。

  4. 退出注册表编辑器。

  5. 重启服务器,使更改生效。

状态

Microsoft 已确认这是“适用于”部分中列出的 Microsoft 产品中的问题。