Windows usando muita RAM, como diagnosticar recursos hog


73

Eu tenho 16 GB de RAM do sistema. Na inicialização, sem aplicativos abertos, exceto o gerenciador de tarefas do Windows está usando cerca de 3 GB de RAM. Eu olhei na guia processos, mas nada parece estar fora do comum. Como posso descobrir por que meu Windows está usando tanta memória RAM?

insira a descrição da imagem aqui

todos os processos de todos os usuários

insira a descrição da imagem aqui


Lendo no poolmon, parece que meu driver de banda larga sem fio está usando cerca de 0,4 GB de RAM. Mesmo se eu removê-lo, ainda estaria usando 2,6 GB na inicialização, o que ainda é demais.

insira a descrição da imagem aqui


Depois de reinstalar o driver sem fio associado ao vazamento de memória. Eu tenho uma nova captura de tela e gostaria de confirmar que foi realmente um vazamento de memória.

insira a descrição da imagem aqui


3
Primeiro de tudo, você tem apenas 12 GB. Qualquer um dos seus quatro sticks de 4 GB está ruim ou mal encaixado, ou sua placa-mãe não suporta 16 GB. Segundo, você já tentou executar algum programa de segurança para verificar a existência de malware? O Security Essentials é interno, portanto, atualize suas definições e execute uma verificação. Tente também alguns programas anti-rootkit, já que os rootkits ocultam especificamente (embora eles geralmente também tentem manter um perfil baixo para passar despercebido, e o uso de alguns gigabytes de RAM dificilmente se mistura).
Synetech

Você pode querer olhar para o desempenho -> monitor de recursos
Journeyman Geek

Tente executar o comando tasklist redirecionando sua saída para um arquivo, C: \ blah> tasklist> aa, abra o arquivo aa, veja totais para cada processo, por exemplo, 15.100K, remova o K após eles e some o total com o Excel. Veja se o total corresponde à figura usada que o gerenciador de tarefas fornece perto do gráfico usado. Para mim, o total da lista de tarefas é de 4 GB e o gerenciador de tarefas diz 4,5 GB. Não consigo explicar a discrepância que tenho, mas não é enorme. seria interessante se você tiver uma enorme discrepância.
barlop

Não tenho excel
Vader

11
As tags NDxx são ndis.sys. Eu acho que o BRCM era Broadcom. Isso indicaria o problema do seu adaptador de rede.
David Marshall

Respostas:


82

Você tem um vazamento de memória causado por um driver. Veja o alto valor da memória não-paginável do kernel. No seu caso, esse valor é superior a 3,7 GB. Você pode usar o poolmon para ver qual driver está causando o alto uso.

Instale o Windows WDK , execute poolmon, classifique-o Papós o tipo de pool, para que não seja paginado no topo e Bapós bytes, para ver a marca que consome mais memória. Execute o poolmon indo para a pasta em que o WDK está instalado, vá em Ferramentas (ou C: \ Arquivos de Programas (x86) \ Windows Kits \ 10 \ Tools \ x64) e clique em poolmon.exe.

Agora veja qual pooltag usa mais memória, como mostrado aqui:

insira a descrição da imagem aqui

Agora abra um prompt do cmd e execute o comando findstr. Para fazer isso, abra o prompt do cmd e digite "cd C: \ Windows \ System32 \ drivers", sem aspas. Em seguida, digite "findstr / s __ . ", Onde __ é a tag (nome mais à esquerda em poolmon). Faça isso para ver qual driver usa essa tag:

insira a descrição da imagem aqui

Agora, vá para a pasta drivers (C: \ Windows \ System32 \ drivers) e clique com o botão direito do mouse no driver em questão (intmsd.sys no exemplo da imagem acima). Clique em Propriedades, vá para a guia Detalhes para encontrar o Nome do Produto. Procure uma atualização para esse produto.

Se a tag pool mostrar apenas drivers do Windows ou estiver listada no pooltag.txt ( "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\triage\pooltag.txt")

você usa o xperf para rastrear o que causa o uso . Instale o WPT a partir do Windows SDK , abra um cmd.exe como administrador e execute:

xperf -em PROC_THREAD + LOADER + POOL -stackwalk PoolAlloc + PoolFree + PoolAllocSession + PoolFreeSession -BufferSize 2048 -MaxFile 1024 -FileMode Circular && timeout -1 && xperf -d C: \ pool.etl

capture 30 -60s do crescimento. Abra o ETL com WPA.exe, adicione os gráficos de pool ao painel de análise.

Coloque a coluna pooltag em primeiro lugar e adicione a coluna stack. Agora carregue os símbolos dentro do WPA.exe e expanda a pilha da tag que você viu no poolmon.

insira a descrição da imagem aqui

Agora encontre outros drivers de terceiros que você pode ver na pilha. Aqui, a Thretag (Thread) é usada pelo AVKCl.exe do G-Data. Procure atualizações de driver / programa para corrigi-lo.


11
Oh, desculpe. @Jebediah Kerman, você executou o comando findstr? Pelo nome, pode estar relacionado ao driver da placa de rede. Se você ainda tiver problemas, execute o RAMMap, armazene os dados como RMP, comprima o arquivo RMP e faça o upload do zip.
magicandre1981

isso pode parecer estúpido. Mas como começo o poolmon. Eu costumava ser capaz de procurar por "poolmon.exe" e iniciar
Vader

@JebediahKerman Acho que você já fez isso e encontrou as tags. A foto da sua postagem não é sua piscina?
magicandre1981

A foto é minha. por alguma razão, o índice de pesquisa estava incompleto.
Vader

@JebediahKerman você já olhou o que é esse NDFT? Você também pode usar XPerf para rastrear o uso de piscina: channel9.msdn.com/Shows/Defrag-Tools/...
magicandre1981

15

Bem, primeira coisa, antes de entrar em uma resposta mais detalhada. Na sua primeira captura de tela, seu pool não paginado (um tipo de uso de memória do kernel) é de 1,3 GB. Isso me parece extraordinariamente alto, especialmente por apenas 30 minutos após a inicialização. Acho que pude ver o NP Pool ficando tão alto depois de uma quantidade prolongada de uso ou com um programa que vazava como uma peneira. Por outro lado, meu pool de NP geralmente tem entre 100 e 200 megabytes e meu pool de paginação pode chegar a 400 ou 500 (e isso ocorre depois de meu sistema funcionar sem reinicialização por semanas).


Você pode ativar algumas colunas adicionais no Gerenciador de Tarefas clicando com o botão direito do mouse nos cabeçalhos das colunas e escolhendo selecionar colunas. Você deve adicionar Working Set (private), Working Set (shared), Commit, e NP Pool. Eu examinava todos os seus processos de todos os usuários e veria se algum deles tem um NP Pool com mais de 256 KB. Se você vir algum, especialmente qualquer um que seja consideravelmente mais alto, isso pode ser a fonte do problema, ou pelo menos parte dele.

Seu conjunto de trabalho total, a quantidade de memória física em uso por um processo, é a combinação dos conjuntos de trabalho privados e compartilhados (WS). Privado geralmente é maior para a maioria dos processos, no entanto, pode haver alguns que usam uma quantidade maior de WS compartilhados. Os dois normalmente devem somar ao total de WS. Confirmar é a quantidade do seu conjunto de trabalho que foi confirmada no armazenamento de backup (na maioria dos casos, o arquivo de paginação do Windows). Os aplicativos em segundo plano geralmente têm uma Confirmação maior que o WS, indicando que grande parte do pool paginável foi trocado de memória e em seu arquivo de paginação (o que é bastante normal para aplicativos de desktop minimizados e não utilizados por um tempo).

O pool não paginado é uma memória que não pode e nunca será trocada da memória física ... que é efetivamente seu uso mínimo permanente de memória física. A memória do NP Pool geralmente contém código de programa e seções críticas que devem estar na memória física para se comportar corretamente ou com segurança, pilhas especiais etc. Entre 60 processos, se todos eles tiverem 256KB de memória do NP Pool, seu uso mínimo absoluto de memória física seria em torno de 15.360 KB. Na maioria dos casos, um ou dois aplicativos podem ter um pool de 256 KB de NP, enquanto a maioria possui menos, geralmente consideravelmente menos (ou nenhum). É altamente improvável que o sistema pagine a totalidade de todos os processos definidos, portanto, nunca espere que o uso da memória seja tão baixo.


Finalmente, o objetivo de ter mais memória é evitar a necessidade de paginar os dados de e para o espaço de memória estendido (troca, arquivo de paginação) em um disco físico. A paginação é um processo que envolve mover blocos de memória física alocada, empurrar alguns para o disco e trazer outros para a memória física do disco. A paginação é, para mantê-lo simples, altamente indesejável. Não é "ruim" por si só, mas pode ser um empecilho real para o desempenho quando ocorre com muita frequência. O ponto final de aumentar a RAM física total em um sistema é permitir que mais processos mantenham mais sua confirmação na memória física (conjunto de trabalho maior). Consumir memória não é um problema e, quando mais processos de execução usam mais memória, o desempenho total do sistema e o desempenho do processo ativo geralmente são mais altos,

O Windows gerencia a memória para você e automaticamente pagina os dados para dentro e para fora da memória de e para o arquivo de página (swap) para você. Se você executar um processo que precisa de 9 GB de memória e seu sistema já estiver usando 4 GB (de 12 GB), o sistema descobrirá automaticamente quais processos não precisam de acesso imediato a todo o conjunto de trabalho e paginará alguns ou todos do pool paginável para trocar para liberar 1 GB extra. Se o seu grande processo eventualmente precisar de mais memória, o Windows reduzirá ainda mais o conjunto de trabalho de outros processos até que tenha espaço livre suficiente para alocar o bloco recém-solicitado. Seu grande processo pode eventualmente consumir toda a memória disponível, exceto o NP Pool e talvez alguma sobrecarga mínima adicional para a execução periódica de processos que não estão permitindo que o Windows libere mais do seu conjunto de trabalho (i. e eles têm falhas de página pendentes que o Windows trocaria de memória física, mas, como estão sendo solicitadas, não podem ser movidas.)

Se um processo precisar de mais memória do que é permitido acessar (processos de 32 bits geralmente podem acessar 2Gb e alguns pouco menos de 4Gb com técnicas aprimoradas, enquanto processos de 64 bits geralmente podem acessar cerca de 48Gb de memória, cada um), as janelas às vezes tentam virtualizar sua memória com espaço de troca. Se um aplicativo de 32 bits quiser usar seu espaço máximo permitido de 2 GB, mas apenas 1,2 GB estiverem disponíveis, o Windows reservará 2 GB completos no arquivo de paginação e moverá os próprios dados do processo para dentro e para fora do arquivo de paginação, conforme necessário. suporta o uso de memória do aplicativo. O uso total de "memória" nesse caso pode parecer maior que a memória física disponível, ao passar pelo Total Commit. A Confirmação total geralmente atinge o tamanho máximo do arquivo de paginação total, que quando gerenciado pelo sistema, geralmente é de 2 a 3 vezes a quantidade de memória física. No seu caso,


Um ponto final. Você disse em sua resposta que tinha 16 GB de RAM, enquanto o Gerenciador de Tarefas vê apenas 12 GB de RAM. Uma de duas coisas aqui. Seu sistema realmente tem apenas 12 GB de RAM ou um dos seus sticks não está sendo registrado corretamente. Se um bastão de memória ram (suponho 4x bastões de 4Gb), pode ser ruim, pode não estar totalmente encaixado corretamente na sua placa-mãe ou sua placa-mãe pode ter um problema de detecção de memória.

Para verificar se é o último, atualize o BIOS da placa-mãe para a versão mais recente. Eu tive um problema semelhante ... meus seis bastões de ram DDR3 de canal tripple (6x 2Gb) eram bons com base em testes individuais de cada um ... mas minha placa-mãe decidiu aleatoriamente não contar um ou dois deles de vez em quando, muitas vezes me deixando com apenas 8 GB de RAM. Uma atualização do BIOS corrigiu o problema e agora tenho acesso confiável a todos os 12 GB de memória.


interessante .. e eu só notei que sua memória não paginada é muito grande ... o meu é 539MB paginado, 139MB não paginado. Você claramente sabe mais do que eu sobre isso .. Mas, você está errado no total commit.U escreva "O total de confirmação normalmente atingirá o tamanho máximo máximo do arquivo de paginação total" Minha RAM é de 12 GB. Eu defino meu arquivo de paginação como 4000 MB (3,8 GB?) de mínimo e 1,5-2x de memória como max. Meu máximo de confirmação é de 15 GB (commit = 7 / 15 atualmente), meu arquivo de paginação é de cerca de 4 GB ou, provavelmente, um pouco menos como 3,8 GB.O Max Commit é mais parecido com o tamanho do arquivo de paginação + o tamanho da RAM.Quando meu arquivo de paginação tinha 12 GB, meu commit máximo era de 24 GB. Pagefile quase 3.8GB ou 4GB max cometer é 15GB
barlop

@ Barlop: Bem, você entendeu um pouco o que é commit. Tecnicamente falando, a carga de confirmação é o "espaço de memória praticamente endereçável" total, incluindo o espaço suportado por gerenciadores de memória estendidos e grande reconhecimento de endereço. A confirmação máxima não seria arquivo de paginação + RAM, mas seria descrito como o espaço total de endereço virtual gerenciado pelo sistema. O arquivo de página geralmente deve cobrir, no mínimo, o tamanho total da memória física e estendê-lo além do tamanho total da memória física. Comprometer no seu caso, eu teria esperado para ser de pelo menos 18GB (1,5x) ou 24 GB (2x), no entanto, que ...
jrista

... seria o caso de um arquivo de página gerenciado pelo sistema. Parece que você ajustou manualmente as configurações do arquivo de paginação. Nesse caso, eu precisaria saber mais sobre sua configuração específica para saber por que o seu commit atual é 15Gb (como o arquivo de página 3.8 / 4Gb indicaria um commit de 16Gb, não 15Gb .) É totalmente possível configurar manualmente nenhum arquivo de paginação ou um arquivo de paginação muito pequeno e que pode levar a problemas estranhos de desempenho e alocação de memória. A melhor recomendação, a menos que você tenha uma configuração de servidor (banco de dados) altamente específica, é permitir que o Windows gerencie seu arquivo de paginação.
jrista

Uma nota final. Para obter desempenho máximo, é melhor permitir que o Windows aloque o tamanho máximo do arquivo de paginação antecipadamente. Isso geralmente é feito em configurações de servidor como um banco de dados do SQL Server, onde você pode pré-alocar 64 GB ou mais (geralmente 2x o tamanho físico da ram, talvez até 128 GB ou 256 GB) para um arquivo de paginação distribuído igualmente entre vários discos físicos para obter o máximo desempenho . Os arquivos de página distribuídos, especialmente quando pré-alocados no tamanho máximo, permitem leituras / gravações intercaladas em todos os discos participantes, permitindo assim um desempenho aprimorado de paginação via E / S paralela.
jrista

Como exemplo de uma carga pesada de memória, meu sistema atualmente possui: uso de memória física de 7,5 / 12Gb; Commit de 14,7 / 23,3Gb; Piscina paginada de 491mb; 145mb np pool. Isso é para 146 processos, pool paginado máximo 2276k pool np máximo 263k. O maior tamanho de confirmação 696.396k e, para o mesmo processo, o WS é 714.256k (um processo da guia Opera.) (Minha alta contagem de processos é devido ao navegador da Web ... eles isolam as guias pelo processo nos dias de hoje, e eu sou um hipertabber ... dezenas abertas ao mesmo tempo, assim dezenas de processos adicionais).
jrista

12

Como posso descobrir por que meu Windows está usando tanta memória RAM?

Está usando muita memória RAM, porque foi projetado para isso. Não há absolutamente nenhum custo associado ao uso da RAM. De fato, a RAM usada é melhor que a RAM livre, porque o sistema operacional não precisa fazer nada para usá-lo. O uso de RAM livre exige que seja usado, o que exige esforço.

Se você está pensando "Quero minha RAM livre agora para poder usá-la mais tarde", esqueça. A RAM não precisa estar livre agora para uso posterior. Você pode usá-lo agora e depois. Não trocas aqui - não há absolutamente nenhuma desvantagem em usar a RAM.

A RAM é mantida usada e alternada diretamente de um uso para outro sem ter que passar pelo esforço de liberá-lo, apenas para usá-lo novamente. Os sistemas operacionais modernos deixam a RAM livre apenas quando não têm outra opção.


12
Se o meu sistema windows7 estiver usando 3 GB de RAM na inicialização, sem aplicativos abertos,
211 Vader

5
@JebediahKerman Por que você diz isso? Esforço-me ao tentar explicar por que esse não é o caso e por que o Windows foi projetado para fazer isso. Você não entendeu minha explicação? Ou, se você não concorda, pode explicar onde acha que estou errado?
David Schwartz

11
@DavidSchwartz resposta totalmente errada. Ele tem um vazamento de memória por um motorista
magicandre1981

9
@ David David: O comportamento que você descreve (alocações de RAM que podem ser reutilizadas) deve necessariamente ser feito a partir da memória paginável. O número preocupante é de 1,3 GB de memória não paginável. Você não pode liberar apenas isso para outros recursos, para onde iriam esses 1,3 GBbyte? Ser "não-paginado" significa que o proprietário disse "esses bytes são tão importantes que você não pode nem colocá-los em disco, muito menos descartá-los".
MSalters

25
Por que essa "resposta" é tão votada? É completamente perde o ponto. Independentemente das palavras específicas usadas (que eram perfeitamente claras para começar), a questão não é “Why is Windows using RAM?”: a questão é “Why do the RAM usage numbers not add up; why is one part reporting a higher usage than another part?”Este post deve ser um comentário, na melhor das hipóteses, porque não aborda a questão real ou mesmo tenta respondê-la; ele apenas concorda com um pouco de conselho, e péssimo conselho, já que, se o OP o ignorasse conforme sugerido, o vazamento de memória não seria descoberto.
21313 Synetech

2

Um motivo não mencionado acima é o Hyper-V.

Consegui identificá-lo com o excelente utilitário RamMap :

insira a descrição da imagem aqui

A captura de tela é de depois. Antes de a memória "Driver Locked" ter mais de 6 GB, mais de 80% da RAM dessa máquina específica. Eu tive que entrar no Gerenciador Hyper-V e desativar a "Memória dinâmica". Curiosamente, mesmo após a reativação, a memória "Driver Locked" permaneceu baixa - só posso presumir que instâncias anteriores a aumentaram e que o Hyper-V não reduz automaticamente sua memória alocada:

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.