Understanding Pool Resources - Memory Management

A discussion of Pool Resources and Pool Resource Depletion.  First of all - what are Pool Resources?  When a machine boots up, the Memory Manager creates two dynamically sized memory pools that kernel-mode components use to allocate system memory. These two pools are known as the Paged Pool and NonPaged Pool.  Each of these pools […]

A discussion of Pool Resources and Pool Resource Depletion.  First of all - what are Pool Resources?  When a machine boots up, the Memory Manager creates two dynamically sized memory pools that kernel-mode components use to allocate system memory. These two pools are known as the Paged Pool and NonPaged Pool.  Each of these pools start at an initial size that is based upon the amount of physical memory present in the system.  Pool memory is a subset of available memory and is not necessarily contiguous.  If necessary, these pools can grow up to a maximum size that is determined by the system at boot time.

So - what distinguishes Paged Pool and NonPaged Pool memory?  The first difference is that Paged Pool is exactly what its name implies - it can be paged out.  The NonPaged Pool cannot be paged out.  Drivers use the NonPaged Pool for many of their requirements because they can be accessed at any Interrupt Request Level (IRQL).  The IRQL defines the hardware priority at which a processor operates at any given time (there's a link to a document covering Scheduling, Thread Context and IRQL's in the Additional Resources section at the end of this post).

Getting back to our Pool Resources, it is important to remember that these resources are finite.  The table below outlines some sample maximum values for Paged / NonPaged Pool on x86 systems that are not configured with the /3GB switch in the system's boot.ini file.  We'll cover /3GB and its effects on memory in a future post.  We'll also cover Kernel Changes to Windows Vista separately.  It's important to note that x64 systems don't suffer from these limitations! 

Windows 2000

System RAMNonPaged MaxPaged MaxPaged Max (TS)
512 MB131 MB264 MB160 MB *
1024 MB212 MB268 MB160 MB *
1536 MB256 MB340 MB160 MB *
2048 MB256 MB340 MB160 MB *

 * If Terminal Services is installed on Windows 2000, Paged Pool is lowered down to 160 MB unless a registry change is made to the server to set the Paged Pool Size to its maximum value (see below).

Windows 2003 SP1

System RAMNonPaged MaxPaged Max
512 MB125 MB184 MB
1024 MB202 MB168 MB
1536 MB254 MB352 MB
2048 MB252 MB352 MB

On Windows 2003 systems, Terminal Services are enabled by default. 

On both Windows 2000 and Windows 2003, the HKLM\System\CurrentControlSet\Control\Session Management\Memory Management\PagedPoolSize value can be set to 0xFFFFFFFF (or resetting the value to 0) to ensure that the Virtual Address Space used for Paged Pool is maximized.

Also - here's the theoretical maximums for pre-Vista Operating Systems:

RegionIA-64x64x86
Process Address Space7152 GB8192 GB2 to 3 GB*
Paged Pool128 GB128 GB470 to 650 MB
NonPaged Pool128 GB128 GB256 MB

 * depends on whether or not /3GB is enabled

Now that we know what the maximum value ranges should look like, here's how to verify what those values look like on your own system using Process Explorer:

View: Full post

Microsot, Windows, Memory management, Pool Resources, Pool Resource Depletion, Optimization, Performance, Leak, Troubleshooting, Tips, Tweaks, Tricks