SOLUTION: There's a lot of stuff to read in this thread, so i'll just summarize here to help.
The problem is the VMWare ESX balloon driver which "inflates" the amount of memory "in use" that the OS sees in order to force the OS to dump caches and reduce working set size. This creates a large amount of "in use" physical ram that you can't account for by looking at the processes. You can look at the VMWare console performance graph for the VM's and see the balloon driver in use.
The solution to the performance was to raise the amount of reserved memory for the server, which limits the amount of memory the balloon driver can steal from you.
Eu tenho um Windows 2003 Terminal Server de 32 bits que está executando uma cópia local do SQL Server (versão completa, não expressa) e hospeda um ambiente de desenvolvimento do Visual Studio 2008 para vários desenvolvedores. As máquinas são uma máquina virtual executada no vSphere 4, com 4 GB de memória alocada para ela.
Quando tenho 2 ou 3 usuários conectados, estou usando mais de 4 GB de memória confirmada, mas não consigo encontrar onde a maior parte dessa memória está sendo usada. Quando eu adiciono toda a memória no Gerenciador de Tarefas para todos os usuários, ela é responsável por apenas 2 GB no máximo. O que está usando o resto?
Eu tentei dar um ciclo no servidor SQL, que leva apenas a memória que vejo alocada para o SQL servr. O mesmo acontece com o visual studio, se eu desligá-lo, leva apenas a quantia que vejo alocada no Gerenciador de Tarefas do conjunto de memórias confirmadas. Eu também configurei as opções de memória para o SQL Server para usar apenas 512 MB no máximo.
Não acredito que seja um problema de sistema ou cache de arquivos, já que o Windows não inclui essa memória nas estatísticas confirmadas AFAIK.
Isso está me deixando louca. Deve haver memória mais que suficiente para todas essas coisas, com base nos valores que elas parecem estar usando. Como faço para localizar onde esta memória extra está sendo usada?
Atualizar
Em relação a quais estatísticas de memória eu estou olhando, nenhuma delas se soma.
Por exemplo, agora com 1 usuário logado e executando apenas o Visual Studio e o servidor WebDev, e SQL Server e IIS em segundo plano. Eu adiciono bytes particulares e recebo cerca de 1049740K de memória, mas o gerenciador de tarefas diz carga de compromisso é de 1146M, deixando cerca de 150Mb não contabilizados.
Quando três usuários estão logados, são apenas cerca de 2 GB de bytes privados (muita memória é compartilhada porque os usuários estão apenas executando o Visual Studio).
O tamanho da VM também não aumenta, já que normalmente não é muito diferente dos bytes particulares. Embora, curiosamente, o número seja muito diferente no Process Explorer para memória virtual do que no Gerenciador de Tarefas. O PE mostra a memória virtual do SQL Server em 1.791.444K para o SQL Server e 1.251.432K para o Visual Studio, mas a taxa de confirmação é de apenas 1146M total para a máquina.
Não há coluna para o Tamanho do WS no Gerenciador de Tarefas, mas no PE ele lista o WS como Privado e Compartilhável, e esses números são significativamente menores do que a carga de Confirmação, mesmo que seja somada.
ATUALIZAÇÃO:
Eu sei que essa pergunta tem muitos detalhes, então talvez a pergunta não esteja clara.
Como descubro quais processos estão usando toda a memória comprometida em meu sistema? A memória fornecida pelo TaskManager e pelo Process Explorer não se soma adequadamente, e mostra apenas 2GB de memória confirmada, embora 4GB está comprometido.