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

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

原始 KB 数: 312362

现象

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

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

服务器无法从系统分页池分配,因为池为空。
数据 -
0000:00040000 00540001 000000000 c00007e4
0010:00000000 c000009a 00000000000000
0020: 00000000 000000000 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. 重启服务器,使更改生效。

Status

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