Solução de problemas de alta CPU em um pool de aplicativos do IIS

Aplica-se a: Serviços de Informações da Internet

Essa solução de problemas ajudará você a identificar a causa da alta CPU sustentada em um pool de aplicativos do IIS (Serviços de Informações da Internet). É importante ter em mente que é normal que o uso da CPU aumente à medida que um aplicativo Web atende às solicitações. No entanto, se você vir consistentemente a CPU permanecer em um nível alto (na área de 80% ou maior) por períodos prolongados, o desempenho do seu aplicativo sofrerá. Por esse motivo, é importante entender a causa da CPU alta sustentada para que ela possa ser tratada e corrigida, se possível.

Cenário

Um pool de aplicativos no IIS está enfrentando um período prolongado de alta CPU que excede 90%. Quando o aplicativo é testado, nenhum problema é encontrado. No entanto, depois que o aplicativo experimenta a carga real do usuário, a CPU sobe para um percentual alto e permanece. Para recuperar, o pool de aplicativos deve ser reiniciado, mas depois disso, a CPU volta a subir para um nível alto.

Ferramentas

Coleta de dados

A primeira coisa que você deve fazer ao encontrar altos problemas de uso da CPU é determinar o processo que está consumindo a CPU. Você pode usar a guia Processos no Gerenciador de Tarefas para fazer isso. Selecione a caixa de seleção Mostrar processos de todos os usuários . A imagem a seguir mostra essa caixa marcada e mostra o w3wp.exe processo (o processo que hospeda um pool de aplicativos IIS) consumindo um alto nível de CPU.

A captura de tela mostra o Gerenciador de Tarefas do Windows. Na coluna C P U, 85 é realçado na linha executável w 3 w p. Mostrar processos de todos os usuários está selecionado.

Você também pode usar Monitor de Desempenho para determinar qual processo está usando a CPU. Para obter mais informações sobre como usar Monitor de Desempenho, consulte Analisando dados de desempenho.

Dica

Se você precisar identificar qual pool de aplicativos está associado a um determinado processo w3wp.exe, abra um Prompt de Comando Administrativo, alterne para a %windir%\System32\inetsrv pasta cd %windir%\System32\inetsrv e execute appcmd list wp. Isso mostrará o PID (identificador de processo) do processo de w3wp.exe entre aspas. Você pode corresponder esse PID com o PID disponível no Gerenciador de Tarefas.

Depois de confirmar que um processo w3wp.exe está enfrentando uma CPU alta, você precisará coletar as seguintes informações para determinar o que está causando o problema:

  • Um conjunto de coletores de dados Monitor de Desempenho.
  • Um despejo de memória do modo de usuário do processo de w3wp.exe.

Ambos precisarão ser coletados durante o evento de CPU alta.

Coletando um conjunto de coletores de dados Monitor de Desempenho

Monitor de Desempenho dados geralmente são críticos na determinação da causa de altos problemas de CPU. Ele também pode ser extremamente útil para obter uma visão "geral" de como seu aplicativo funciona.

Os dados de perfmon podem ser exibidos em tempo real ou podem ser coletados em um conjunto de coletores de dados que pode ser revisto posteriormente. Para solucionar um problema alto de CPU, precisamos coletar um conjunto de coletores de dados. Para criar um conjunto de coletores de dados para solucionar problemas de CPU alta, siga estas etapas.

  1. Abra ferramentas administrativas do Windows Painel de Controle.
  2. Clique duas vezes em Monitor de Desempenho.
  3. Expanda o nó Conjuntos do Coletor de Dados .
  4. Clique com o botão direito do mouse em Definido pelo Usuário e selecione NovoConjunto de Coletores de> Dados.
  5. Insira CPU Alta como o nome do conjunto de coletores de dados.
  6. Selecione Criar Manualmente (Avançado).
  7. Selecione Avançar.
  8. Selecione Criar Logs de Dados.
  9. Selecione a caixa de seleção Contador de Desempenho .
  10. Selecione Avançar.
  11. Selecione Adicionar. Se seu aplicativo não for um aplicativo ASP.NET, vá para a Etapa 19.
  12. Role até a parte superior da lista de contadores e selecione Memória CLR do .NET.
  13. Na lista de instâncias, selecione <todas as instâncias>.
  14. Selecione Adicionar para adicionar os contadores à lista de contadores adicionados.
  15. Selecione ASP.NET na lista de contadores e selecione Adicionar.
  16. Selecione ASP.NET Aplicativos na lista de contadores.
  17. Selecione <todas as instâncias> na lista de instâncias.
  18. Selecione Adicionar.
  19. Expanda Processo da lista de contadores. (Certifique-se de expandir o Processo e não o Processador.)
  20. Selecione % Tempo do processador no objeto Process .
  21. Selecione <todas as instâncias> na lista de instâncias.
  22. Selecione Adicionar.
  23. Expanda Thread da lista de contadores.
  24. Selecione % Tempo do processador no objeto Thread .
  25. Selecione <todas as instâncias> na lista de instâncias.
  26. Selecione Adicionar.
  27. Selecione ID Thread na lista de instâncias.
  28. Selecione Adicionar.

Sua caixa de diálogo agora deve se parecer com a imagem a seguir.

Captura de tela que mostra a caixa de diálogo Propriedades da Coleção de Dados 0 1. O Thread I D está selecionado na guia Contadores de Desempenho.

Selecione OK ->Avançar. Anote onde o conjunto de coletores de dados está sendo salvo. (Você pode alterar esse local se precisar.) Em seguida, selecione Concluir.

O conjunto de coletores de dados ainda não está em execução. Para iniciá-lo, clique com o botão direito do mouse na CPU Alta no nó Definido pelo Usuário e selecione Iniciar no menu.

Criando uma regra de diagnóstico de depuração

A maneira mais fácil de coletar despejos de processo de modo de usuário quando ocorre uma condição de CPU alta é usar o Diagnóstico de Depuração.

Baixe DebugDiag, instale-o no servidor e execute-o. (Você o encontrará no menu Iniciar após a instalação.) Ao executar DebugDiag, ele exibirá a caixa de diálogo Selecionar Tipo de Regra . Siga estas etapas para criar uma regra de falha para o pool de aplicativos:

  1. Selecione Desempenho ->Próximo.
  2. Selecione Contadores de Desempenho ->Avançar.
  3. Selecione Adicionar Gatilhos de Perf.
  4. Expanda o objeto Processador (não o Processo) e selecione % Tempo de Processador. Observe que se você estiver no Windows Server 2008 R2 e tiver mais de 64 processadores, escolha o objeto Informações do Processador em vez do objeto Processador .
  5. Na lista de instâncias, selecione _Total.
  6. Selecione Adicionar ->OK.
  7. Selecione o gatilho recém-adicionado e selecione Editar Limites. Captura de tela que mostra a caixa de diálogo Selecionar Contadores de Desempenho.
  8. Selecione Acima na lista suspensa.
  9. Altere o limite para 80.
  10. Insira 20 para o número de segundos. (Você pode ajustar esse valor se necessário, mas tenha cuidado para não especificar um pequeno número de segundos para evitar gatilhos falsos.)
  11. Selecione OK.
  12. Selecione Avançar.
  13. Selecione Adicionar Destino de Despejo.
  14. Selecione Pool de Aplicativos Web na lista suspensa.
  15. Selecione seu pool de aplicativos na lista de pools de aplicativos.
  16. Selecione OK.
  17. Selecione Avançar.
  18. Selecione Avançar novamente.
  19. Insira um nome para sua regra se desejar e anote o local em que os despejos serão salvos. Você pode alterar esse local se desejar.
  20. Selecione Avançar.
  21. Selecione Ativar a Regra Agora e selecione Concluir.

Dica

Você pode criar despejos de vários pools de aplicativos adicionando vários destinos de despejo usando a mesma técnica usada nas etapas 13-15.

Essa regra criará 11 arquivos de despejo. Os primeiros 10 serão "mini despejos" que serão bastante pequenos em tamanho. O despejo final será um despejo com memória completa, e esse despejo será muito maior.

Depois que o alto problema da CPU tiver ocorrido, você deseja impedir que o conjunto de coletores de dados perfmon colete dados. Para fazer isso, clique com o botão direito do mouse no conjunto alto de coletores de dados da CPU listado no nó Definido pelo Usuário e selecione Parar.

Análise dos dados

Após o evento de CPU alta, você terá dois conjuntos de dados para examinar; o conjunto de coletores de dados Perfmon e os despejos de memória. Vamos começar examinando os dados do Perfmon.

Analisando dados de desempenho

Para examinar os dados do Perfmon para seu problema, clique com o botão direito do mouse no conjunto de coletores de dados de CPU alto listado no nó Definido pelo Usuário e selecione Relatório Mais Recente. Você verá um relatório semelhante à captura de tela a seguir.

Captura de tela que mostra a janela Monitor de Desempenho.

A primeira coisa é remover todos os contadores atuais para que você possa adicionar os explícitos que deseja examinar. Selecione o primeiro contador da lista. Em seguida, role até a parte inferior da lista e selecione no último contador enquanto mantém a chave SHIFT. Depois de selecionar todos os contadores, pressione Excluir tecla para removê-los.

Agora adicione o contador Process / % Processor Time com estas etapas:

  1. Clique com o botão direito do mouse em qualquer lugar no painel direito do Perfmon e selecione Adicionar Contadores.
  2. Expanda o objeto Process .
  3. Selecione % Tempo do processador na lista.
  4. Selecione <todas as instâncias na lista de instâncias> .
  5. Selecione Adicionar.
  6. Selecione OK.

Agora você terá uma exibição que mostra um grafo do tempo do processador usado por cada processo no computador durante o tempo em que o conjunto de coletores de dados estava em execução. A maneira mais fácil de isolar qual processo estava usando o nível mais alto da CPU é habilitar o recurso de destaque do Perfmon.

Para fazer isso, selecione o primeiro contador na lista e pressione Ctrl + H. Depois de fazer isso, o processo selecionado será exibido como uma linha preta em negrito no grafo.

Use a seta para baixo no teclado para passar pela lista de processos até encontrar o processo que mostra mais uso da CPU. Na captura de tela a seguir, você pode ver claramente que o processo de w3wp.exe estava usando uma grande quantidade de CPU no computador. Isso confirma que o pool de aplicativos do IIS está causando alta utilização da CPU no computador.

Captura de tela que mostra a janela Monitor de Desempenho. Perfmon mostra o uso do C P U do executável w 3 w p.

Dica

O perfmon pode ser muito útil para determinar problemas de desempenho em seu aplicativo. Os dados coletados no log do Perfmon podem mostrar quantas solicitações estão sendo executadas (usando os objetos ASP.NET e ASP.NET Applications) e também podem mostrar outros dados de desempenho importantes sobre como seu aplicativo está sendo executado.

Para chegar à raiz do que está causando o alto problema da CPU, vamos examinar os despejos criados usando DebugDiag.

Análise de despejo com DebugDiag

DebugDiag tem a capacidade de reconhecer muitos problemas fazendo uma análise de despejo automatizada. Para esse problema específico, os Analisadores de Desempenho do DebugDiag são adequados para ajudar a identificar a causa raiz do alto problema da CPU. Para usar o analisador, siga estas etapas

  1. Selecione a guia Análise Avançada em DepuraçãoDiag.
  2. Selecione os Analisadores de Desempenho.
  3. Selecione Adicionar Arquivos de Dados.
  4. Navegador para o local onde os despejos foram criados. Por padrão, essa será uma subpasta da pasta C:\Program Files\DebugDiag\Logs .
  5. Selecione um dos despejos e pressione Ctrl + A para selecionar todos os despejos nessa pasta.
  6. Selecione Abrir.
  7. Selecione Iniciar Análise.

DebugDiag leva alguns minutos para analisar os despejos e fornecer uma análise. Ao concluir a análise, você verá uma página semelhante à mostrada na imagem a seguir.

Captura de tela que mostra o Explorer da Internet. A página Depurar relatório de análise diag é exibida.

Observe que a parte superior do relatório informa que a CPU alta foi detectada. Na coluna à direita, você verá recomendações que incluem um link para os 7 threads principais por tempo médio da CPU. Selecione esse link e você verá informações sobre o que os principais consumidores de CPU estavam fazendo. Por exemplo, a captura de tela a seguir mostra o que esses threads estão fazendo no meu aplicativo.

Captura de tela que mostra a página Estatísticas de Funções em um navegador.

Neste exemplo, a página default.aspx no aplicativo FastApp está em execução. Se você examinar mais abaixo a pilha de chamadas (na parte inferior da página), poderá ver que esse thread está fazendo concatenação de cadeia de caracteres. (Observe a chamada para System.String.Concat na pilha de chamadas.) Se você analisar os outros threads de CPU superiores, verá o mesmo padrão.

A próxima etapa é examinar o Page_Load evento na página default.aspx do aplicativo FastApp. Quando faço isso, encontro o código a seguir.

htmlTable += "<table>";
for (int x = 0; x < 5000; x++)
{
htmlTable += "<tr>" + "<td>" + "Cell A" + x.ToString() + "</td>";
    htmlTable += "<td>" + "Cell B" + x.ToString() + "</td>" + "</tr>";
}
htmlTable += "</table>";

Esse tipo de código definitivamente causará uma CPU alta.

Conclusão

Usando Perfmon e DebugDiag, você pode coletar facilmente dados que podem ser úteis para determinar a causa da alta CPU em pools de aplicativos. Se você não conseguir encontrar a causa raiz usando essas técnicas, poderá entrar em contato com o suporte da Microsoft para obter mais assistência. Engenheiros de suporte da Microsoft podem ajudá-lo a determinar a causa do problema. Ao ter os dados perfmon e despejos prontos quando você abrir um caso, você reduzirá drasticamente o tempo necessário para os engenheiros ajudá-lo.

Outros recursos