Article ID: 1675, created on Jun 10, 2011, last review on May 11, 2014

  • Applies to:
  • Virtuozzo containers for Windows

症状

以下的错误出现在硬件节点上的日志查看器上:

Event ID 2020
Event Type: Error
Event Source: Srv
Event Category: None
Event ID: 2020
Description: The server was unable to allocate from the system paged pool because the pool was empty.

Event ID 2019
Event Type: Error
Event Source: Srv
Event Category: None
Event ID: 2019
Description: The server was unable to allocate from the system NonPaged pool because the pool was empty.

原因

该错误表示服务器非分页(NP)内存池不足。NP池在Windows2003 x86系统中的限制是256 MB,被用于临界的内核操作。一旦NP池超负荷,系统将会变得缓慢,反应迟钝,一些软件组件停止正常工作(例如,IIS开始拒绝连接)。
第三方软件,恶意软件或导致系统繁忙工作的操作所造成的内存泄露都有可能造成NP池的匮乏。

解决方案

这个问题可以被跟踪,方式如下:

1。打开任务管理器,进入性能选项卡,查看“内核内存”区域中的“未分页池”使用情况。数值高于220,000 KB会被视为影响了了系统的稳定性(只对x86平台)。

2。要找出消耗大部分的NP未分页内存池的进程,单击进程选项卡,选择查看->选择顶部菜单栏,并选择PID,会话ID和非分页池复选框。

3。根据“NP池”的大小对进程列表进行排序并找出占用最大NP池数值的进程。记住这个进程的PID值。

4。打开命令行提示符,并使用vzquery命令找出是哪个container在运行这个有问题的进程。

vzquery p2v <PID_found_at_previous_step>

5.然后查找出哪个服务属于这个进程:

vzctl exec CTID tasklist /svc

举例:

PID10872,进程是svchost.exe

vzquery p2v 10872
Process ID: 10872
Session ID: 7 (ROOT)

VE ID: 119

 

vzctl exec 119 tasklist /svc
Image Name PID Services
========================= ========
============================================
System Idle Process 0 N/A
System 4 N/A
smss.exe 868 N/A
csrss.exe 4388 N/A
winlogon.exe 6032 N/A
services.exe 2628 Eventlog, PlugPlay
lsass.exe 3316 Netlogon, PolicyAgent, ProtectedStorage, SamSs
svchost.exe 10104 DcomLaunch
svchost.exe 8248 RpcSs
svchost.exe 3112 Dhcp, Dnscache
svchost.exe 10440 LmHosts
svchost.exe 10872 AeLookupSvc, BITS, Browser, CryptSvc,
EventSystem, helpsvc, lanmanserver,
lanmanworkstation, Messenger, Nla,
Schedule, seclogon, SENS, winmgmt, wuauserv
spoolsv.exe 11680 Spooler
msdtc.exe 12044 MSDTC

Command 'exec' is successfully finished

 
所以可以看出是svchost.exe抢走了NP池的内存,建议禁用BITS和自动更新(suauserv)服务:

vzctl exec CTID sc config wuauserv start= disabled
vzctl exec CTID sc config bits start= disabled
vzctl restart CTID

 
注意:另一个可能的原因是这个消耗了大部分NP池内存的进程可能是一种恶意软件。在这种情况下,务必先杀死该进程,然后在container中运行杀毒软件查杀病毒。

其他信息

这个疑难解答基于以下的文章和工具:
Managing Container Memory Pools
Understanding Pool Consumption and Event ID: 2020 or 2019
http://msdn2.microsoft.com/en-us/library/ms792884.aspx
http://support.microsoft.com/kb/q177415/
Who's Using the Pool
评估内存使用情况的工具是: pooltag.exe

d02f9caf3e11b191a38179103495106f 965b49118115a610e93635d21c5694a8 2897d76d56d2010f4e3a28f864d69223

Email subscription for changes to this article