Percebi isso em muitas máquinas Windows diferentes, em diversas ocasiões: o uso de RAM relatado pelo Gerenciador de Tarefas ou pelo Monitor de Recursos geralmente parece adicionar uma quantidade significativamente menor que a quantidade real em uso.
Por exemplo, muitas vezes no meu laptop ou desktop, vi algo em torno de 7 GB em uso e, no entanto, o total do conjunto de RAM de trabalho é mais parecido com 3 GB. Eu simplesmente não consigo descobrir onde está sendo usado!
Aqui está um exemplo extremo que notei hoje no Monitor de Recursos em um servidor:
Se você clicar com o botão direito do mouse na imagem, abrir em uma nova guia e visualizar os números, perceberá que o Conjunto de Trabalho (que não inclui memória virtual não física) soma cerca de 1,7 GB. Recebo números semelhantes adicionando o uso de RAM no Gerenciador de Tarefas quando a opção "Mostrar processos de todos os usuários" está ativada.
Agora, veja uma captura de tela da guia Desempenho do gerenciador de tarefas:
Isso indica que 7,6 GB de memória física estão em uso.
Eu vejo isso o tempo todo, em computadores pessoais, laptops e servidores agora: o uso total de RAM relatado pelas ferramentas do sistema representa apenas cerca de 1/4 do uso de RAM que observo. WTF está acontecendo ???
Existe alguma explicação satisfatória de onde está toda a minha RAM? O que está engolindo tudo e por que não deixa vestígios?
EDIT: Aqui está uma imagem do uso gráfico da RAM, como o usuário solicitou:
EDIT 2: Em resposta à resposta de James, aqui está uma imagem dos processos não paginados poolmon.exe
, classificados por tamanho:
Esses resultados me confundem. poolmon
afirma corretamente que tenho 6 GB de pool não paginado em uso, mas todos os processos de pool não paginado têm tamanho inferior a 8 MB.
O que isso poderia significar? Está poolmon
falhando em detectar alguns dos processos usando o pool não paginado?
fonte
Respostas:
Sinto muito, eu sei que isso soa como uma resposta irreverente ... mas a resposta para a pergunta em seu título é "porque eles não deveriam".
Ou, para ser mais educado: há muito uso de RAM que não está nos conjuntos de trabalho particulares dos processos. Parte disso está nos conjuntos de trabalho compartilhados dos processos - mas você não pode obter uma noção confiável do uso real por causa do compartilhamento; somar os números dos processos resultará em um resultado muito grande.
Outras coisas que ocupam RAM, como o pool não paginado, a parte residente do pool paginável e as partes residentes de outros usos do espaço do kernel, não aparecem na exibição de "processos" do Gerenciador de Tarefas.
Em relação ao seu problema específico:
Na tela do Gerenciador de tarefas, consulte a seção "memória do kernel"? Você tem 6 GB de "memória não paginada" (esse pool não paginado). Isso faz parte da seção "Em uso" no seu segundo gráfico. O pool não paginado não é cobrado em nenhum processo, e é por isso que a soma dos números por processo no gerenciador de tarefas não se aproxima do total em uso. Provavelmente, algum driver está sendo usado. Esta é uma quantidade totalmente excessiva; deve estar bem abaixo de 1 GB. qualquer driver que seja responsável pela parte excessiva do uso de pool não paginado é inquestionavelmente com erros.
O RAMmap pode confirmar isso (na guia "Usar contagens", veja o total de "Pool não paginado"), mas não pode ajudá-lo a descobrir qual driver está causando o problema.
Veja como encontrá-lo: Obtenha uma cópia da ferramenta Microsoft "poolmon". É uma ferramenta no modo de caractere (garoto, é alguma vez) distribuída com o Windows Driver Kit. Para o Windows 7, o WDK é um download gratuito . Você precisa baixar a coisa toda (é uma ISO) e instalá-la a partir disso, mas pode optar por instalar apenas as ferramentas, se isso é tudo o que você deseja.
Encontre poolmon nos diretórios WDK - escolha o caminho certo, 32 ou 64 bits - e execute-o em um prompt de comando do administrador. Você verá uma tela como esta:
Agora, pressione a tecla "p" (não, não estou brincando. Não há menus aqui!) Até a coluna "Tipo" mostrar apenas "Não". Em seguida, pressione "b" (duas vezes se necessário) para classificar a exibição em ordem decrescente pela coluna Bytes (que já foi feita na amostra aqui).
Então olhe a coluna "Tag" para a linha superior. No caso (obviamente artificial) mostrado aqui, é "Vazamento". (Este sistema está executando um driver que foi deliberadamente corrigido para causar esse problema - está "vazando" o pool não paginado.)
Aliás, as linhas destacadas foram as que foram alteradas desde a atualização anterior para esta tela arcaica.
Agora procure c: \ Windows \ System32 \ Drivers por um arquivo .sys que contenha essa sequência. Nesse caso, você procuraria "Leak", assim:
Em seguida, pesquise na web referências a essa sequência e / ou a esse nome de driver.
Voltar aqui e relatar o nome completo, o nome do fabricante etc. do arquivo .sys também seria útil.
(Minha aposta é que a tag encontrada será ECMC, o driver é intmsd.sys e está associado a um produto chamado ExpressCache ou IntelliMemory. Eu "desinstalaria" esse produto. Há uma atualização para corrigir o problema, mas até com a versão fixa, nunca vi o desempenho de um sistema melhorado por este produto; ele basicamente duplica a funcionalidade que já está no Windows.)
Se você não conseguir encontrar dessa maneira, o próximo passo é usar o "Windows Performance Toolkit". Pesquise neste fórum por essa sequência, com respostas de magicandre1981, para obter um tutorial. Ignore as respostas que mencionam o xperf - é uma versão mais antiga da ferramenta.
ATUALIZAÇÃO: Pelos comentários, o OP fez o acima e descobriu que, embora o poolmon tenha relatado que o tamanho total do pool não paginado era realmente enorme, todas as peças alocadas eram aparentemente pequenas. Minha conjectura (também nos comentários) é que isso se deve ao que chamarei de pool "inchado": o pool foi alocado e depois liberado, mas por algum motivo a quantidade de RAM alocada no pool não foi reduzida para refletir a "liberação" . Seguindo o procedimento descrito nesta resposta por magicandre, você pode identificar o culpado.
fonte
poolmon
hoje, se tiver tempo, e tentarei ler sua resposta mais de perto também para garantir que eu a entenda. Você está dizendo que provavelmente há um vazamento de memória? Nesse caso, isso é totalmente plausível, pois estamos trabalhando em software conhecido por ter alguns horríveis vazamentos de memória.poolmon.exe
no servidor em questão e editei minha pergunta para incluir uma captura de tela.poolmon
afirma que tenho um pool não paginado de 6 GB (como você apontou na minha captura de tela do Gerenciador de tarefas), mas quando olho apenas para os processos "Nonp" e classifico por tamanho, todos são pequenos (o maior é 8 MB). Você tem alguma idéia de por quepoolmon
não está detectando a maior parte do uso de pool não paginado?