2013-11-12 01:10:06 +0000 2013-11-12 01:10:06 +0000
75
75
Advertisement

Janelas que utilizam demasiada RAM, como diagnosticar o porco dos recursos

Advertisement

Tenho 16GB de RAM de sistema. Ao arrancar sem aplicações abertas, excepto o gestor de tarefas Windows está a utilizar cerca de 3gb de RAM. Procurei no separador dos processos, mas nada parece estar fora do normal. Como posso descobrir porque é que o meu Windows está a usar tanta memória RAM.

todos os processos de todos os utilizadores


Leitura a partir do poolmon parece que o meu controlador de banda larga sem fios está a utilizar cerca de 0,4GB de RAM. Mesmo que o removesse, ainda estaria a usar 2,6GB no arranque, o que ainda é demasiado.


Depois de reinstalar o driver sem fios associado com a fuga de memória. Tenho uma nova imagem do ecrã e gostaria de confirmar que se tratou de facto de uma fuga de memória.

Advertisement

Respostas (4)

85
85
85
2013-11-12 04:54:18 +0000

Tem uma fuga de memória causada por um condutor. Veja o elevado valor da memória não-paginada do kernel. No seu caso, este valor é superior a 3,7 GB. Pode usar poolmon para ver qual o driver que está a causar a utilização elevada.

Instale o Windows WDK , execute poolmon, classifique-o através do tipo P após pool de modo a que o não paginado esteja no topo e através de B após bytes para ver a etiqueta que utiliza a maior parte da memória. Execute poolmon indo à pasta onde WDK está instalado, vá a Tools (ou C:\Program Files (x86)\Windows Kits\10\Tools\x64) e clique em poolmon.exe.

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

Agora abra um prompt cmd e execute o comando findstr. Para o fazer, abra um prompt cmd e escreva “cd C:\System32drivers”, sem aspas. Depois digite “findstr /s __ .”, onde __ é a etiqueta (nome mais à esquerda em poolmon). Faça isto para ver qual o condutor que utiliza esta etiqueta:

Agora, vá para a pasta drivers (C:\Windows\System32\drivers) e clique com o botão direito do rato no driver em questão (intmsd.sys no exemplo de imagem acima). Clique em Propriedades, vá para o separador de detalhes para encontrar o Nome do Produto. Procure por uma actualização para esse produto.

Se o pooltag apenas mostrar drivers do Windows ou estiver listado no pooltag.txt ("C:\Program Files (x86)\Windows Kits.1\Debuggers\x64\triage\pooltag.txt")

tem utilizado xperf para rastrear o que causa o uso . Instale o WPT a partir do Windows SDK , abra um cmd.exe como admin e execute-o:

xperf -on 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 of the grow. Abrir o ETL com WPA.exe, adicionar os gráficos Pool ao painel de análise.

coloque a coluna Pooltag em primeiro lugar e adicione a coluna stack. Agora carregue os símbolos dentro de WPA.exe e expanda a pilha da etiqueta que viu em poolmon.

Agora encontre outros condutores de terceiros que possa ver na pilha. Aqui a tag Thre (Thread) é utilizada por AVKCl.exe da G-Data. Procure por actualizações de drivers/programas para o corrigir.

15
15
15
2013-11-12 05:41:48 +0000

Bem, primeiro, antes de entrar numa resposta mais detalhada. Na sua primeira captura de ecrã, o seu Non-Paged Pool (um tipo de utilização de memória kernel) está a 1,3GB. Isto parece-me invulgarmente elevado, especialmente durante apenas 30 minutos após o arranque. Acho que consegui ver o NP Pool a ficar tão alto após uma quantidade prolongada de utilização ou com um programa que estava a vazar como uma peneira. Para contrastar, o meu NP Pool está normalmente entre 100 e 200 megabytes, e o meu pool paginado pode atingir 400 ou 500 (e isto depois de ter o meu sistema a funcionar sem reiniciar durante semanas.)


Pode activar algumas colunas adicionais no Task Manager clicando com o botão direito do rato nos cabeçalhos das colunas, e escolhendo seleccionar colunas. Deve adicionar Working Set (private), Working Set (shared), Commit, NP Pool, e 0x6&. Eu faria um scan a todos os seus processos de todos os utilizadores, e ver se algum deles tem um NP Pool mais do que cerca de 256KB. Se vir algum, especialmente algum que seja consideravelmente superior, que possa ser a fonte do problema, ou pelo menos parte dele.

O seu conjunto de trabalho total, a quantidade de memória física em uso por um processo, é a combinação dos conjuntos de trabalho privado e partilhado (WS). O privado é normalmente maior para a maioria dos processos, contudo pode haver alguns que utilizam uma maior quantidade de WS partilhada. Os dois devem normalmente somar-se ao total de WS. Compromisso é a quantidade do seu conjunto de trabalho que foi comprometida com a loja de apoio (na maioria dos casos, o ficheiro de página do Windows). As aplicações de fundo terão frequentemente um Commit maior do que a WS, indicando que grande parte do seu conjunto de paginação foi trocado para fora da memória e para o seu ficheiro de paginação (o que é bastante normal para aplicações de fundo que foram minimizadas e não foram utilizadas durante algum tempo).

O Non-Paged Pool é memória que não pode, e nunca será, trocada para fora da memória física…que é efectivamente a sua utilização mínima permanente de memória física. A memória NP Pool contém frequentemente o código do programa e secções críticas que devem estar na memória física para se comportarem correctamente ou com segurança, pilhas especiais, etc. De 60 processos, se todos eles tiverem 256KB de memória NP Pool, então a sua utilização mínima absoluta de memória física seria de cerca de 15,360KB. Na maioria dos casos, uma ou duas aplicações podem ter um Pool NP de 256KB, enquanto a maioria tem menos, muitas vezes consideravelmente menos (ou nenhuma). É altamente improvável que o sistema alguma vez paginasse a totalidade de todos os processos a funcionar, por isso nunca espere que a utilização da memória seja tão baixa.


Finalmente, o objectivo de ter mais memória é evitar ter de paginar dados de e para o espaço de memória alargado (swap, ficheiro de página) num disco físico. Paging é um processo que envolve mover blocos de memória física atribuída, empurrando alguns para o disco, e trazer outros para a memória física a partir do disco. Paging é, para o manter simples, altamente indesejável. Não é “mau” por si só, mas pode ser um verdadeiro arrastamento no desempenho quando ocorre com demasiada frequência. O ponto final de aumentar a RAM física total num sistema é permitir mais processos para manter mais do seu compromisso na memória física (conjunto de trabalho maior). Consumir memória não é um problema, e quando mais processos de execução utilizam mais memória, o desempenho total do sistema e o desempenho activo do processo serão normalmente mais elevados, uma vez que a actividade física do disco relacionada com os acessos à memória (falhas de página, especificamente) será menor.

O Windows gere a memória para si, e automaticamente coloca e retira dados da memória de e para o ficheiro (swap) da página para si. Se executar um processo que necessita de 9GB de memória e o seu sistema já estiver a usar 4GB (de 12GB), então o sistema irá automaticamente descobrir quais os processos que não necessitam de acesso imediato a todo o seu conjunto de trabalho, e irá pagear parte ou a totalidade do seu pool de paginação para trocar, de modo a libertar esse 1GB extra. Se o seu grande processo eventualmente necessitar de mais memória, as janelas irão reduzir ainda mais o conjunto de trabalho de outros processos até que tenha espaço livre suficiente para atribuir o bloco recentemente solicitado. O seu grande processo poderá eventualmente consumir toda a memória disponível excepto o NP Pool e talvez alguma sobrecarga mínima adicional para executar periodicamente processos que não permitem ao Windows libertar mais do seu conjunto de trabalho (ou seja, têm falhas de página pendentes que o Windows trocaria de outra forma da memória física, mas porque estão a ser solicitados, não podem ser movidos).

Se um processo necessita de mais memória do que aquela a que é permitido aceder (processos de 32bit podem normalmente aceder a 2Gb, e alguns um pouco menos de 4Gb com técnicas melhoradas, enquanto processos de 64bit podem normalmente aceder a cerca de 48Gb de memória, cada um), então o Windows tentará por vezes virtualizar a sua memória com espaço de troca. Se uma aplicação de 32bit quiser utilizar o seu espaço máximo permitido de 2Gb, mas apenas 1.2Gb estiver disponível, o windows reservará os 2Gb completos no ficheiro de página, e moverá os próprios dados dos processos para dentro e para fora do ficheiro de página, conforme necessário, a fim de suportar a utilização da memória da aplicação. O uso total de “memória” neste caso pode parecer ser maior do que a memória física disponível, quando se passa por Compromisso total. O Compromisso Total será normalmente máximo no tamanho total do ficheiro da página, que quando gerido pelo sistema, é normalmente 2-3x a quantidade de memória física. No seu caso, a Compromisso Total seria cerca de 24Gb, ou 2x a sua memória física de 12Gb (e isto é indicado na sua primeira captura de ecrã, onde declara: Commit (GB) 3 / 23).


Um ponto final. Disse na sua resposta que tinha 16Gb de RAM, onde, como Gestor de Tarefas, só vê 12Gb de RAM. Uma de duas coisas aqui. Ou o seu sistema realmente só tem 12Gb de RAM, ou um dos seus paus não está a registar-se correctamente. Se um pau de carneiro (estou a assumir 4x 4Gb sticks), pode ser mau, pode não estar sentado totalmente correctamente na sua placa-mãe, ou a sua placa-mãe pode ter um problema de detecção de memória.

Para verificar se é a última, deve primeiro actualizar a BIOS da sua placa-mãe para a versão mais recente. Tive um problema semelhante…os meus seis paus de carneiro Tripple-Channel DDR3 (6x 2Gb) eram todos bons baseados em testes individuais de cada um…mas a minha placa-mãe decidiu aleatoriamente não contar um ou dois de vez em quando, deixando-me muitas vezes com apenas 8Gb de carneiro. Uma actualização da BIOS resolveu o problema, e agora tenho acesso fiável a todos os 12Gb da minha memória.

12
Advertisement
12
12
2013-11-12 01:35:00 +0000

Como posso descobrir porque é que o meu Windows está a usar tanta RAM.

Está a usar tanta RAM porque é desenhado para o fazer. Não há absolutamente nenhum custo associado à utilização de RAM. Na verdade, a RAM usada é melhor do que a RAM gratuita porque o sistema operativo não tem de fazer nada para a usar. A utilização de RAM gratuita requer que seja utilizada, o que exige esforço.

Se está a pensar “Quero a minha RAM livre agora para a poder usar mais tarde”, esqueça. A RAM não tem de ser gratuita agora para ser usada mais tarde. Pode utilizá-la agora e utilizá-la mais tarde. Há aqui uma troca não de troca – não há absolutamente nenhuma desvantagem em usar a RAM.

RAM é mantida utilizada e directamente transferida de uma utilização para outra sem ter de passar pelo esforço de a tornar gratuita apenas para ter de a utilizar novamente. Os sistemas operativos modernos só deixam a RAM livre quando não têm outra escolha.

2
2
2
2017-01-14 12:37:08 +0000

Uma razão não mencionada acima é Hyper-V.

consegui identificá-lo com a excelente utilidade RamMap :

A imagem do ecrã é de depois. Antes de a memória “Driver Locked” ser superior a 6GB, mais de 80% da RAM desta máquina em particular. Tive de ir ao Hyper-V Manager e desactivar a “Memória Dinâmica”. Curiosamente, mesmo depois de a ter reactivado, a memória “Driver Locked” permaneceu baixa - só posso presumir que as instâncias anteriores a aumentaram e que o Hyper-V não reduz automaticamente a memória atribuída:

Advertisement
Advertisement