Solucionando 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 o uso da CPU aumentar à medida que um aplicativo Web atende solicitações. No entanto, se você observar que a CPU permanece consistentemente em um nível de uso alto (cerca de 80% ou mais) por períodos prolongados, o desempenho do aplicativo será afetado. Por esse motivo, é importante entender a causa da alta CPU sustentada para que ela possa ser abordada e corrigida, se possível.
Cenário
Um pool de aplicativos no IIS está passando por um período prolongado de alto uso de CPU que excede 90%. Quando o aplicativo é testado, nenhum problema é encontrado. No entanto, quando ele passa por uma carga de usuário real, o uso da CPU sobe para uma porcentagem alta e permanece dessa forma. Para a recuperação, o pool de aplicativos deve ser reiniciado. No entanto, o uso da CPU sobe novamente depois disso para um nível alto.
Ferramentas
- Diagnóstico de depuração (DebugDiag)
- Monitor de desempenho (Perfmon)
Coleta de dados
A primeira coisa que você deve fazer quando encontrar problemas de alto uso da CPU é determinar o processo que está consumindo a CPU. Você pode usar a guia Processos no Gerenciador de Tarefas para fazer isso. Certifique-se de marcar 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 do IIS) consumindo um alto nível de CPU.
Você também pode usar o Monitor de Desempenho para determinar qual processo está usando a CPU. Para obter mais informações sobre como usar o Monitor de Desempenho, consulte Analisando dados de desempenho.
Dica
Se você precisar identificar qual pool de aplicativos está associado a um processo w3wp.exe específico, abra um Prompt de Comando Administrativo, alterne para a %windir%\System32\inetsrv
pasta cd %windir%\System32\inetsrv
e execute appcmd list wp
o . Isso mostrará o PID (identificador do processo) do processo w3wp.exe entre aspas. É possível corresponder esse PID com o PID disponível no Gerenciador de Tarefas.
Depois de confirmar que um processo w3wp.exe está com CPU alta, você precisará coletar as seguintes informações para determinar o que está causando o problema:
- Um conjunto de coletores de dados do Monitor de Desempenho.
- Um despejo de memória de modo de usuário do processo w3wp.exe.
Ambos precisarão ser coletados durante o evento de alto uso de CPU.
Coletando um conjunto de coletores de dados do Monitor de Desempenho
Os dados do Monitor de Desempenho geralmente são críticos para determinar a causa de problemas de alta CPU. Eles também podem ser extremamente úteis para obter uma visão geral do desempenho do aplicativo.
Os dados do Perfmon podem ser visualizados em tempo real ou ser coletados em um conjunto de coletores de dados que pode ser analisado posteriormente. Para solucionar um problema de alto uso de CPU, é necessário coletar um conjunto de coletores de dados. Para criar um conjunto de coletores de dados a fim de solucionar problemas de alto uso de CPU, siga estas etapas.
- Abra “Ferramentas Administrativas” no Painel de Controle do Windows.
- Clique duas vezes em Monitor de desempenho.
- Expanda o nó Conjuntos de coletores de dados.
- Clique com o botão direito do mouse em Definido pelo usuário e selecione Novo -> Conjunto de coletores de dados.
- Insira Alta CPU como o nome do conjunto de coletores de dados.
- Selecione Criar manualmente (avançado).
- Selecione Avançar.
- Selecione Criar logs de dados.
- Marque a caixa de seleção Contador de desempenho .
- Selecione Avançar.
- Selecione Adicionar. Se o seu aplicativo não for um aplicativo ASP.NET, vá para a Etapa 19.
- Role até a parte superior da lista de contadores e selecione Memória CLR do .NET.
- Na lista de instâncias, selecione <todas as instâncias>.
- Selecione Adicionar para adicionar os contadores à lista de contadores adicionados.
- Selecione ASP.NET na lista de contadores e, em seguida, selecione Adicionar.
- Selecione ASP.NET Aplicativos na lista de contadores.
- Selecione <todas as instâncias> na lista de instâncias.
- Selecione Adicionar.
- Expanda Processo na lista de contadores. (Certifique-se de expandir Processo e não Processador.)
- Selecione % Tempo do Processador no objeto Processo .
- Selecione <todas as instâncias> na lista de instâncias.
- Selecione Adicionar.
- Expanda Thread na lista de contadores.
- Selecione % Tempo do Processador no objeto Thread .
- Selecione <todas as instâncias> na lista de instâncias.
- Selecione Adicionar.
- Selecione ID Thread na lista de instâncias.
- Selecione Adicionar.
Sua caixa de diálogo agora deve ser semelhante à imagem a seguir.
Selecione OK ->Avançar. Anote onde o conjunto de coletores de dados será 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 em Alta CPU 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 no modo de usuário quando ocorre uma condição de CPU alta é usar o Diagnóstico de Depuração.
Baixe o DebugDiag, instale-o em seu servidor e execute-o. (Você o encontrará no Menu Iniciar após a instalação.) Quando você executar o 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:
- Selecione Desempenho ->Avançar.
- Selecione Contadores de Desempenho ->Avançar.
- Selecione Adicionar gatilhos de desempenho.
- Expanda o objeto Processador (não o Processo) e selecione % Tempo do 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 .
- Na lista de instâncias, selecione _Total.
- Selecione Adicionar ->OK.
- Selecione o gatilho recém-adicionado e, em seguida, selecione Editar limites.
- Selecione Acima no menu suspenso.
- Altere o limite para 80.
- Digite 20 para o número de segundos. (Se necessário, ajuste esse valor. No entanto, tenha cuidado para não especificar um número de segundos muito pequeno a fim de evitar falsos gatilhos.)
- Selecione OK.
- Selecione Avançar.
- Selecione Adicionar Destino de Despejo.
- Selecione Pool de Aplicativos Web na lista suspensa.
- Selecione o pool de aplicativos na lista de pools de aplicativos.
- Selecione OK.
- Selecione Avançar.
- Selecione Avançar novamente.
- Insira um nome para a regra, se desejar, e anote o local em que os despejos serão salvos. É possível alterar esse local, se desejado.
- Selecione Avançar.
- Selecione Ativar a regra agora e, em seguida, selecione Concluir.
Dica
É possível criar despejos de vários pools de aplicativos adicionando vários destinos de despejo com a mesma técnica que foi usada nas etapas 13 a 15.
Esta regra criará 11 arquivos de despejo. Os primeiros 10 serão “mini despejos”, de tamanho bastante pequeno. O despejo final será muito maior e terá memória cheia.
Depois que o problema de alto uso da CPU ocorrer, interrompa a coleta de dados do conjunto de coletores de dados do Perfmon. Para fazer isso, clique com o botão direito do mouse no conjunto de coletores de dados de alta CPU listado no nó Definido pelo usuário e selecione Parar.
Análise de dados
Depois do evento de alto uso de CPU, você terá dois conjuntos de dados para analisar: o conjunto de coletores de dados do Perfmon e os despejos de memória. Para começar, analise os dados do Perfmon.
Analisando dados de desempenho
Para revisar os dados do Perfmon para o problema, clique com o botão direito do mouse no conjunto de coletores de dados de CPU alta listado no nó Definido pelo usuário e selecione Relatório mais recente. Você verá um relatório semelhante à captura de tela a seguir.
A primeira coisa é remover todos os contadores atuais para que você possa adicionar os explícitos que deseja revisar. Selecione o primeiro contador na lista. Em seguida, role até o final da lista e selecione no último contador enquanto mantém pressionada a tecla SHIFT. Depois de selecionar todos os contadores, pressione a tecla Delete para removê-los.
Agora, adicione o contador Process / % Processor Time com estas etapas:
- Clique com o botão direito do mouse em qualquer lugar no painel direito do Perfmon e selecione Adicionar contadores.
- Expanda o objeto Processo .
- Selecione % Tempo do processador na lista.
- Selecione <todas as instâncias> na lista de instâncias.
- Selecione Adicionar.
- Selecione OK.
Agora a exibição mostrará um gráfico de 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 o processo com uso mais alto da CPU é habilitar o recurso de realce do Perfmon.
Para fazer isso, selecione o primeiro contador da lista e pressione Ctrl + H. Depois de fazer isso, o processo selecionado será exibido como uma linha preta em negrito no gráfico.
Use a seta para baixo no teclado para percorrer a lista de processos até encontrar o processo que mostra o maior uso da CPU. Na captura de tela a seguir, você pode ver claramente que o processo w3wp.exe estava usando uma grande quantidade de CPU na máquina. Isso confirma que o pool de aplicativos do IIS está causando o alto uso da CPU no computador.
Dica
O Perfmon pode ser muito útil na determinação de problemas de desempenho no aplicativo. Os dados coletados no log do Perfmon podem mostrar quantas solicitações estão sendo executadas (usando os objetos ASP.NET e Aplicativos ASP.NET) e outros dados importantes sobre o desempenho do aplicativo.
Para chegar à raiz do que está causando o problema de alto uso da CPU, é necessário analisar os despejos criados usando o DebugDiag.
Análise de despejo com DebugDiag
O DebugDiag é capaz de reconhecer muitos problemas por meio de uma análise de despejos automatizada. Nesse problema específico, os analisadores de desempenho do DebugDiag são adequados para ajudar a identificar a causa raiz do problema de alto uso de CPU. Para usar o analisador, siga estas etapas:
- Selecione a guia Análise Avançada em DebugDiag.
- Selecione os Analisadores de Desempenho.
- Selecione Adicionar arquivos de dados.
- Navegue para o local em que os despejos foram criados. Por padrão, essa será uma subpasta da pasta C:\Arquivos de Programas\DebugDiag\Logs .
- Selecione um dos despejos e pressione Ctrl + A para selecionar todos os despejos nessa pasta.
- Selecione Abrir.
- Selecione Iniciar Análise.
O 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.
Observe que a parte superior do relatório informa que foi detectada alta CPU. Na coluna da direita, serão exibidas recomendações que incluem um link para os sete principais threads por tempo médio de uso de 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.
Neste exemplo, a página default.aspx no aplicativo FastApp está em execução. Se você olhar mais abaixo na pilha de chamadas (na parte inferior da página), poderá ver que esse thread está fazendo a concatenação de strings. (Observe a chamada para System.String.Concat
na pilha de chamadas.) Se você analisar os outros threads principais da CPU, verá o mesmo padrão.
A próxima etapa é revisar o Page_Load
evento na página default.aspx do aplicativo FastApp. Ao fazer isso, é possível encontrar 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 certamente causará alto uso da CPU.
Conclusão
Com o Perfmon e o DebugDiag, é possível coletar facilmente dados que podem ser úteis para determinar a causa do alto uso de CPU em pools de aplicativos. Se você não conseguir encontrar a causa raiz usando essas técnicas, entre em contato com o suporte da Microsoft para obter mais assistência. Os engenheiros de suporte da Microsoft podem ajudá-lo a determinar a causa do problema. Ao ter os dados e despejos do Perfmon prontos quando você abrir um caso, você reduzirá drasticamente o tempo necessário para os engenheiros ajudá-lo.