32-bit VMs on Azure have only 1GB of usable RAM

Solution 1:

Welcome to the quirks of Hyper-V and dynamic memory.

Hyper-V vm's in azure are all using dynamic memory (except for reserved instances). That means, Hyper-V will be constantly monitoring the demand (as reported by the local kernel) and assign the required physical RAM to the vm. Therefore you will see "1 Gb useable" [at this very moment]. That is the actual ammount of the "real" physical ram mapping (plus a buffer for fast growing apps).

enter image description here

A Windows 10 virtual machine needs (surprisingly) little RAM to function well. In your screenshot, the memory usage is idle at the moment (I would assume). The Memory "demand" is very small, so the buffer assigned to the VM (usually around 15%) to the Hyper-V Machine config is using around 1Gb of the assigned maximum.

The buffer is important: When using dynamic memory and the demand suddenly increases for example due a resource heavy application being launched, it takes time for Hyper-V to assign more RAM to the vm. It is possible that this is very slow (depending on the demand of other machines on this host). The bigger the buffer, the better the vm reacts to increased demand. You see the "minimum" buffer there.

Hint: Dynamic memory should not be used when installing Windows, it can make the time needed for installation somewhat longer. I bet you waited a lot longer for thins to complete than on your local machine.

Generally speaking, Windows 10 x32 uses max 4GB of static RAM for default applications. PAE can expand this, but the only widespread apps that do that are Exchange Server (which does not run under Windows 10) and SQL Server (Enterprise).

Solution 2:

It must be because OS is not using more than 1 GB and dynamic memory is configured for VM. As soon as you run more programs which require more RAM the size of available memory will grow. Btw, there is no need to get VMs of more than 4 GB of RAM for 32-bit OS. The operating system itself can't address more than 4 GB.

Please note that this is just an assumption. I have not tested it myself.

Sample code to allocate memory:

$dictionary = new-object "System.Collections.Generic.Dictionary[[Guid],[int]]"
while ($true) { 
    $dictionary.Add([guid]::NewGuid() , 0) 
}

Solution 3:

Microsoft added this Note to the docs:

Azure platform has a memory address space limitation imposed on VMs running 32-bit operating systems where only 1GB of memory might be made available to the VM (especially on client SKUs like Win7 or Win10), and the rest of the memory for the VM will show as reserved within the guest VM. This is a known issue and we currently do not have an ETA for a fix. We recommend moving to 64bit OS versions.

https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/support-32-bit-operating-systems-virtual-machines

Posted the suggestion to fix this issue to the Azure feedback portal. You can vote for it here https://feedback.azure.com/forums/223579-azure-portal/suggestions/42881949-fix-the-issue-with-1gb-ram-limit-for-32-bit-oses-r