Como as máquinas virtuais podem consumir tão pouca RAM na máquina host física?

24

Estou executando o VirtualBox em uma máquina Windows XP com 2 GB de RAM. Eu criei uma máquina virtual Ubuntu e aloquei uma memória básica de 750MB.

Apenas para testar, eu executei 20 coisas ao mesmo tempo na máquina virtual. De acordo com "top" no ubuntu, 750 megs de memória estavam sendo usados, bem como espaço de troca considerável.

No entanto, de volta ao Gerenciador de Tarefas do Windows, o VitrualBox usava apenas 45.000 K de memória. Como pedi à máquina virtual para fazer cada vez mais, o uso da CPU do processo VirtualBox aumentou (no Windows), mas o uso da memória permaneceu o mesmo.

Como uma máquina virtual que usa 750 MB de memória consome apenas 45 MB de memória em uma máquina física?

Suponho que a resposta é que a máquina virtual não está usando memória real, mas sim memória (ou seja, espaço de troca), mas com certeza parece ágil como se estivesse rodando na RAM.

ATUALIZAÇÃO: Eu brinquei com perfmon como sugerido. Mesmo resumindo tudo que consigo pensar, ainda parece ocupar menos de 300 megas ... então ainda é um mistério.

Process               VirtualBox     VirtualBox#1     Total
PoolNonpagedBytes     5,840          42,552           48,392
PoolPagedBytes        119,796        166,892          286,688
PrivateBytes          8,884,224      52,719,616       61,603,840
VirtualBytes          75,939,840     161,202,176      237,142,016
Sum                   84,949,700     214,131,236      299,080,936
dggoldst
fonte

Respostas:

7

As colunas do Gerenciador de Tarefas podem fornecer números enganosos - para um uso preciso da memória por processo, você pode usar perfmon (Monitor de Desempenho no Painel de Controle) e observar as figuras de "bytes particulares".

Para mostrar isso, entre em perfmon, clique para adicionar o contador (eu sou uma pessoa do tipo Ctrl+ I). O "objeto Desempenho" seria "Processo", com "Bytes particulares" na lista de contadores - obviamente, você precisará selecionar o processo relevante na lista à direita.

Rowland Shaw
fonte
Oi. Eu tentei isso, mas não tive sorte em encontrar algo chamado Private Bytes. Você pode dar um passo a passo?
dggoldst
Adicionaram ...
Rowland Shaw
Obrigado, isso é muito útil. Eu adicionei a análise à pergunta. Ainda não consigo descobrir por que não chega a 750.
dggoldst 4/08/09
Muito estranho. Eu poderia salientar que PrivateBytes é um subconjunto de VirtualBytes (bytes virtuais é a proporção do espaço de endereço alocado, enquanto bytes privados é a memória que ainda não foi liberada - você pode obter fragmentação da memória com um pequeno vazamento de memória e ter aplicativos morrem com pouca memória, mesmo quando há bastante disponível). Pode ser que o driver de virtualização esteja alocando a memória de uma maneira que não apareça, o que faria sentido, pois a memória deveria estar imune à paginação no disco.
Rowland Shaw
Dos quatro contadores que você coloca na sua tabela, apenas "PoolNonPagedBytes" é uma contagem de memória virtual não paginável, portanto, essa quantidade de memória física será usada. Os outros são todos virtuais. Como qualquer outro tamanho de memória virtual, a RAM real que ela usa é quase sempre muito menor. Esse é um dos pontos inteiros da memória virtual.
Jamie Hanrahan 26/09
5

Com algumas soluções de virtualização no Linux, a maneira como elas alocam memória faz com que apareça no kernel host como um arquivo especial de mapeamento de memória (muito parecido com o /proc/kcorearquivo especial), por isso é contado na contagem "em cache" na saída de free, e não no contagem "usada".

Presumo que algo semelhante esteja acontecendo com o seu ambiente Windows: os 45Mb serão usados ​​pelos processos de gerenciamento do VirtualBox, e os 750 alocados à própria VM serão contados em outros lugares.

David Spillett
fonte
0

Pode ser memória virtual, arquivos mapeados na memória ou algo semelhante.

Você já tentou exibir outras colunas no Gerenciador de tarefas?

zildjohn01
fonte
0

Não acredite no Gerenciador de tarefas. Não pode ver tudo.

Esse problema é mais comum no SQL Server, por exemplo, com o SQL, nunca encontrei alguém que me desse uma maneira de obter informações precisas do Gerenciador de Tarefas, o que me levaria a acreditar que a figura não está escondida em um dos outras colunas.

sgmoore
fonte