Como determino qual aplicativo está vazando memória não paginada?

8

Recentemente, tivemos um problema em nosso servidor ativo que fez com que nosso aplicativo Web parasse de responder. Tudo o que estávamos recebendo eram erros 503 até reiniciarmos o servidor, então tudo estava bem. Eventualmente, rastreei o arquivo até o activationperr.log e encontrei muitos erros 1_Connections_Refused.

Investigações posteriores pareciam indicar que atingimos o limite de pool não paginado. Desde então, monitoramos a memória de pool não paginado usando Poolmon.exe e acreditamos ter identificado a tag que está causando o problema.

Tag   Type    Allocs       Frees       Diff       Bytes      Per Alloc
Even  Nonp  51,231,806   50,633,533   684,922   32,878,688      48

Se usarmos poolmon.exe / g, ele exibirá o driver mapeado como [<unknown> Event objects].

Isso praticamente não ajuda em nada. Minha equipe passou um tempo considerável pesquisando esse problema e não conseguiu encontrar um processo para reduzi-lo a um aplicativo ou serviço específico. Tenho a sensação de que a maioria das pessoas parece resolver o problema matando processos na máquina até ver a memória não paginada sendo redefinida. Não é exatamente isso que você deseja ver ao trabalhar em uma máquina de produção.

Se eu abrir o Gerenciador de tarefas e visualizar a lista de processos. Vejo MailService.exe com um valor de NP Pool de 105K, este é 36K maior que o valor do processo listado em segundo. Como tivemos alguns problemas com nosso servidor de email no passado (que podem ou não estar relacionados a esse problema), meu pressentimento é que isso está causando o problema.

No entanto, antes de reiniciarmos os serviços, eu gostaria de ter um pouco mais de certeza do que apenas um "pressentimento".

Eu também tentei usar poolmon.exe / c, mas isso sempre retorna o erro:

unable to load msvcr70.dll/msvcp70.dll

e não cria localtag.txt. Meu colega precisou baixar o pooltag.txt da Internet porque não conseguimos descobrir onde ele está localizado. Não temos o depurador do win ou o DDK do win instalado (que eu posso ver). Talvez o erro acima tenha sido dado porque não temos nenhum deles instalado - mas eu não sei.

Finalmente tentei:

C:\windows\system32\driver\findstr /m /l Even *.sys

Isso retornou uma lista bastante considerável de arquivos .sys e novamente não ajudou em nada com o problema em questão.

Portanto, minha pergunta é a seguinte: existe outra maneira de diminuir a causa desse vazamento de memória?

ATUALIZAR:

Conforme sugerido abaixo, registrei os bytes não agrupados do pool nos últimos dias para verificar se há algum processo em alta. Na maior parte dos casos, todos os processos parecem bastante estáticos em seu uso. Dois deles parecem ter aumentado um pouco. Continuarei monitorando isso pelos próximos dias.

Também esqueci de mencionar anteriormente que nenhum dos processos parece estar usando um número excessivo de identificadores também.

ATUALIZAÇÃO 2:

Eu tenho monitorado isso nas últimas duas semanas. O pool de bytes não paginados para processos individuais e o conjunto total de bytes não paginados permaneceram relativamente estáveis ​​durante esse período. Durante esse período, o Windows foi atualizado e o servidor foi reiniciado, por isso estou pensando se isso resolveu o problema. Definitivamente, não estou vendo o crescimento consistente no pool de bytes não paginados agora que estava antes disso.

Desenvolvedor
fonte
Por que não usar perfmon para monitorar bytes não agrupados de pool para todos os processos e procurar o processo com memória de pool não paginável em fuga?
joeqwerty
Acabei de jogar um pouco com o Monitor de desempenho e configurá-lo para fazer o que você sugeriu. No entanto, isso realmente não me diz nada que eu ainda não sabia ao olhar para o Gerenciador de Tarefas. O MailService tem o uso mais alto do Pool Não Paginado, mas é apenas em 106K. Portanto, não é exatamente a arma que eu estava procurando.
Desenvolvedor
Procure aumentar o número de bytes não agrupados de pool nos processos ao longo do tempo. Pode não ser facilmente aparente, observando rapidamente o uso por processo a qualquer momento. Você pode capturar facilmente o uso ao longo do tempo configurando um log do contador para salvar em um arquivo CSV e abri-lo com o Excel para analisar o uso crescente por processo. Qualquer processo que exibe um aumento de 10% ou mais no bloco não paginado Bytes de inicialização do sistema está vazando memória e é provável que o processo de causando o problema
joeqwerty
Uma ferramenta útil para ajudar a capturar e analisar os dados relevantes do contador é a ferramenta PAL, encontrada aqui: pal.codeplex.com/releases/view/51623#ReviewsAnchor . Esta é uma versão mais recente que eu usei, mas existe uma versão x86 e parece que ela pode ser usada no W2K3.
Joeqwerty
Eu configurei um arquivo de log para registrar os NP Pool Bytes. Poolmon agora está dizendo que meu uso de memória não paginado é de 68 MB. Ele cresceu cerca de 2 a 3 MB nas duas horas em que tentei descobrir isso. Mas não há crescimento correspondente (que eu possa ver) nos valores de NP para os processos. De fato, os valores do NP Pool em relação aos processos individuais não estão nem perto desse número. Mesmo se eu adicionasse todos os valores de pool np listados, o total teria a sorte de ter 1 MB e não 68 MB. Mas talvez eu esteja perdendo alguma coisa aqui.
Desenvolvedor

Respostas:

6

Estou monitorando isso há cerca de 6 a 7 semanas e finalmente posso dar uma resposta definitiva ao problema.

Em primeiro lugar, os bytes não paginados para processos individuais não me disseram nada de útil, pois todos pareciam bastante estáticos em seu uso. Houve picos, mas o uso sempre retornou à linha de base posteriormente.

O total de memória de bytes não paginados também ficou estático por algum tempo, mas depois começou a aumentar gradualmente e a disparar. Após um pico, cerca de metade da memória foi liberada e, em seguida, permaneceu estática novamente (no nível superior) por um tempo, até que o padrão se repetisse. Olhando para o gráfico, notei que esses picos pareciam estar regularmente espaçados e, como se vê, eles aconteciam com duas semanas de intervalo e sempre no domingo.

Portanto, a próxima pergunta era: O que acontece duas vezes por semana aos domingos? Observei o Event Viewer e toda vez que ocorria um pico, a McAfee estava em execução . Também acho que ao fazer logon com frequência no servidor para monitorar o problema, inadvertidamente pioramos o problema, porque a McAfee possui um scanner em tempo real e acredito que isso estava causando os aumentos menores que estávamos vendo.

Penso que as verificações que estão sendo agendadas também explicam por que vimos o aumento da memória NP associado à marca de objetos Event no PoolMon, em vez da marca específica da McAfee. Essa foi a principal coisa que realmente nos levou pelo caminho do jardim.

Agora que finalmente sabemos o que está causando os vazamentos, podemos fazer algo a respeito. É incrível que demorou tanto tempo para encontrá-lo.

ATUALIZAÇÃO : Apenas como uma nota final. O McAfee's foi atualizado no fim de semana e isso resolveu completamente o problema de memória não paginada.

ATUALIZAÇÃO 2 : Como recebi um voto positivo, adicionarei uma atualização adicional a isso. Inicialmente, a atualização para a McAfee parecia corrigir o problema, ou seja, não vemos mais os picos maciços na NP Memory em intervalos regulares. Também notei que, desde a atualização, parece que a McAfee não grava mais logs no Visualizador de Eventos por padrão agora, que se oculta quando está sendo ativamente verificada.

Mas ainda estamos vendo aumentos graduais no uso da memória NP. Chegou ao ponto em que agora precisamos reiniciar o servidor a cada 2 semanas. É tão ruim que, recentemente, adquiriu um novo servidor na esperança de que hardware e software atualizado fará este problema desaparecer MAS nosso completamente novo servidor com apenas Windows Server 2008, SQL Server 2008 R2, e McAfee instalado foi AINDA mostrando um vazamento NP Memória . Foi só depois que removi completamente a McAfee que o vazamento parou e permaneceu estático, mesmo depois que configuramos o servidor com todo o nosso software em preparação para mudar para ele.

Desde então, li e não sei se isso é verdade, que o problema não está na McAfee, mas em alguma rotina do Windows usada pela McAfee que faz com que o NP Memory vaze. Aparentemente, a atividade de rede é a causa do vazamento, ou seja, mais atividade de rede => vazamentos maiores. Isso parece ser consistente com a nossa experiência, pois o vazamento piorou à medida que nosso servidor ficou mais ocupado.

Desenvolvedor
fonte