Someone installed the 32-bit version of MS SQL Server 2005 on a 64-bit OS with 16GB of RAM. Two instances of SQL Server are running, but each process is only using about 1.7GB of RAM. Combined, this equals about 3.2GB, or the hard limit of 32-bit applications.
I'm trying to figure out why each instance isn't using it's own 3.2GB max address space?
SQL Server will use more RAM depending on load. Maybe the load these instances are under is insufficient to drive more memory use? Or maybe someone has set a maximum memory limit within the instances?
Firstly there is no 3.2GB memory limit for any processes on Windows. Process memory address space is not limited by hardware RAM limits (which a figure like 3.2GB sounds more like: details of hardware, including devices needing memory mapped IO, take from the basic 4GB limit).
The maximum available address space for a 32bit process in Windows depends on three things: the host's bitness, the "/3G"
boot.ini
flag1 and whether the executable has been built with the "Large Addresse Aware" flag (SQL Server 2008 certainly has based on a quick check here):In your case: each 32bit SQL Server instance can use 4GB of address space if it needs it and is not otherwise limited.
1Depending on the option switch this can be set to various values between 2GB and 3GB, but that just changes that one case.
Each 32 bit process under windows 64 bit should be able to access 4GB of ram (64 bit windows doesn't divide up the address space for user and kernal since kernal is 64 bit) . See how-do-i-tell-if-my-windows-server-is-swapping For more details on windows memory.