Por que o uso total de RAM do Monitor de Recursos e do Gerenciador de Tarefas nem remotamente se soma ao uso total de Memória Física? [duplicado]

30

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:

Monitor de recursos
Clique para ampliar

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:

Gerenciador de tarefas
Clique para ampliar

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:

Uso do RamMap
Clique para ampliar

EDIT 2: Em resposta à resposta de James, aqui está uma imagem dos processos não paginados poolmon.exe, classificados por tamanho:

insira a descrição da imagem aqui

Esses resultados me confundem. poolmonafirma 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á poolmonfalhando em detectar alguns dos processos usando o pool não paginado?

DumpsterDoofus
fonte
Você pode publicar uma imagem da guia Monitor de recursos> Memória (apenas a parte inferior com as cores e os números). Isso seria mais revelador.
WHS
2
@ Ramhound: Obrigado por me indicar esse link! Infelizmente, conforme solicitado, enviei uma imagem do mapa gráfico da Memória Física do Resource Monitor, e a parte Em espera da Memória Física é inferior a 2% do uso total de RAM. A resposta de David Schwartz sugere que o uso de RAM "oculto" vem da RAM em espera (ou seja, RAM usada para dados e código em cache que não estão em uso), e esse não é o caso aqui. Como tal, não acho que a resposta de David explique o que está acontecendo.
DumpsterDoofus
Use o programa RamMap e explore mais com ele. Até agora, pode haver algum motorista enlouquecendo? mas, na verdade, não é o modo de espera (cache). Você executa algum programa especial que consiga consertar a memória RAM ou que supostamente acelere o computador? Algum item de driver estranho que seria especial para seus computadores?
precisa saber é o seguinte
2
O link para o "respondido antes" não cobre este caso.
Jamie Hanrahan

Respostas:

30

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:

insira a descrição da imagem aqui

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:

c:\windows\system32> findstr /s Leak *.sys

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.

Jamie Hanrahan
fonte
Obrigado por investigar mais do que os outros! Vou procurar um vazamento usando poolmonhoje, 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.
precisa
@DumpsterDoofus: Sim. Provavelmente há um vazamento de memória em um driver no modo kernel. Isso é diferente de um vazamento de memória em um aplicativo.
Jamie Hanrahan
Por fim, comecei a rodar poolmon.exeno servidor em questão e editei minha pergunta para incluir uma captura de tela. poolmonafirma 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 que poolmonnão está detectando a maior parte do uso de pool não paginado?
DumpsterDoofus
2
Ah ... o problema aqui está na palavra "uso". Portanto, você tem um pool não paginado de 6 GB, mas parece que apenas uma fração dele está em uso no momento. Infelizmente, nada que eu saiba (nem TM, nem poolmon, nem RAMmap) mostra quanto do pool está realmente em uso. Meu palpite é que havia um usuário pesado do pool ao mesmo tempo, então o pool foi expandido para acomodá-lo e o usuário pesado foi embora. Devido à maneira como o pool é tratado, não é fácil liberar a RAM uma vez alocada a ele, a menos que a alocação esteja em grandes pedaços contíguos. Eu sugeriria assistir isso após uma nova inicialização do sistema.
Jamie Hanrahan
Há uma versão do poolmon.exe disponível nas Ferramentas de suporte para Server 2003 ( serverfault.com/questions/84479/… ) - um pouco antiga, mas com apenas um download de 5,2 MB e ainda é executada no (pelo menos) Server 2016.
mwfearnley 23/04