Como você pode saber o que está fazendo w3wp.exe? (ou como diagnosticar um problema de desempenho)

42

Estou com um problema de desempenho em um site que criamos e não sei exatamente como começar a diagnosticá-lo.

A descrição resumida é: Temos um site muito pequeno ( http://hearablog.com ) com muito pouco tráfego, em um servidor dedicado de baixa qualidade, a CPU é sempre muito alta, às vezes permanece em 100% por minutos e w3wp.exe está tomando a maior parte. Um cenário típico é o w3wp.exe leva 60% e o SQL Server leva cerca de 30%. Nosso banco de dados também é bem pequeno.

Descrição longa e mais detalhes:

  • O site está hospedado em um servidor muito ruim por Cari.Net. Desde o início, tínhamos a sensação de que o servidor não se comportava corretamente, como algumas coisas levariam muito tempo, então isso poderia ser um problema de configuração desde o início. Também pode ser que tenhamos um servidor virtual enquanto deveríamos ter um servidor dedicado, embora não tenhamos evidências que indiquem isso, exceto pelo fato de o servidor tender a ser bastante lento.

  • O servidor é o Windows 2008 Standard de 64 bits, com o SQL 2008 Express

  • O hardware é uma Celeron de 2,80 GHz, 1 Gb de RAM

  • O site é desenvolvido no ASP.Net MVC, usando o Entity Framework para acesso a dados.

  • Agora, este é um hardware bastante ruim, mas já tive outros servidores com esses caras, com HW equivalente (ou pior), e o desempenho é muito melhor que este. Dito isto, os outros servidores têm W2003 e SQL2005, e estou usando o ASP.Net "WebForms" 2.0, sem MVC, sem LINQ, sem EF; portanto, não tenho certeza se ir para 2008 / outras coisas significa uma grande penalidade de desempenho.

  • Estou servindo arquivos MP3 (5-20 Mb) regularmente, o que é uma carga um pouco incomum, talvez isso esteja causando algum tipo de problema?
    Isso faria com que o w3wp usasse muita CPU?

  • O uso do disco parece muito baixo. A memória geralmente fica em torno de 90%, mas o uso do disco parece indicar que não está paginando muito.

  • Recebo toneladas de e-mails todos os dias sobre o tempo limite do SQL, para consultas com duração superior a 30 segundos, embora todas as nossas consultas sejam bastante diretas (ou devam ser, mas a EF pode estar estragando tudo).

É assim que o monitor de recursos se parece em um desses "sprints" de 100% da CPU, caso haja algo útil lá.

texto alternativo

E um instantâneo de alguns contadores de desempenho: texto alternativo

Agora, o que me confunde muito é que o uso da CPU do w3wp é tão alto. Na verdade, não deveria estar fazendo muito ... Então, minhas perguntas são ...

  • Existe alguma maneira de descobrir "o que" está fazendo? Talvez até o perfil?
  • Algum contador de desempenho que eu deveria estar olhando?
  • Isso é esperado devido a essa configuração de hardware / software?
  • Isso pode ser causado por algum tipo de falha de configuração, onde você começaria a procurar?

Muito obrigado.
Daniel Magliola

Daniel Magliola
fonte

Respostas:

42

Você também pode usar a interface do usuário Processos de Trabalho no Gerenciador do IIS e inspecionar as solicitações que estão em execução no momento e ver onde elas estão bloqueadas, se houver. Abra o Gerenciador do IIS-> clique no servidor na árvore-> clique duas vezes no ícone Processos de trabalho-> clique duas vezes no processo de trabalho que está consumindo CPU para ver as solicitações atualmente em execução em tempo real, para que você possa ver qual módulo está demorando.

Considere também usar o Rastreamento de solicitação com falha para rastrear parte do tempo por solicitação para ver onde eles estão demorando.

Carlos Aguilar Mares
fonte
2
Isso é promissor, parece exatamente o que eu quero ver, mas, na verdade, essas telas aparecem vazias. Aparentemente, está mostrando apenas solicitações que estão demorando mais de um segundo, de acordo com o grande sinal no topo, e nenhuma de nossas solicitações está evidente, porque a lista está vazia. Alguma idéia de como fazê-lo mostrar mais solicitações? Como abaixar o filtro 1s? Obrigado!
Daniel Magliola
1
Você pode digitar 0 no filtro e clicar em Ir, que o definirá em 0 segundos. Além disso, você pode executar a partir de um prompt de comando elevado "% windir% \ system32 \ inetsrv \ appcmd.exe solicitações de lista"
Carlos Aguilar Mares
1
Muito obrigado Carlos! Foi o que acabei fazendo para encontrar a única solicitação (um cron que temos) que estava matando meu servidor a cada 5 minutos (demorava 3,5 minutos para ser executado, por isso estava quase sempre com 100% da CPU). Obrigado!!!
Daniel Magliola
1
Essa interface me disse qual URL havia sido acessada; infelizmente, é um POST para um serviço da web asmx e esses dados não estão disponíveis. (Headbang)
Ross Presser
5

Ok, para começar - o servidor é realmente ruim. Mas isso deve ser suficiente.

  • Para virtualização, verifique seus drivers. Não conheço nenhuma plataforma de virutalização que oculte a CPU (e eu acho que alguém coloca um hyper-v ou esx em um celeron), mas os drivers do disco etc. são uma indicação.

  • CPU não deve ser tão alta. Infelizmente, com essa memória RAM, você é praticamente um brinde - se você começar a adicionar um criador de perfil, irá praticamente explodir a memória que você tem.

Eu gostaria:

  • Verifique os logs em busca de coisas em execução neste momento.
  • Atualize o sistema operacional para o 2008 R2 - há muito mais informações disponíveis lá.

Para teste:

  • No seu ambiente de desenvolvimento, faça uma cópia do site e execute alguns testes de desempenho.
  • Faça o perfil lá.
  • Use o Failed REquest Tracking para descobrir quais solicitações falham.

http://learn.iis.net/page.aspx/266/trou Troubleshooting-failed-requests-using-tracing-in-iis-7/

tem algum começo por aí. Isso pode lhe dar uma dica caso os problemas sejam mais - hm - "categorizáveis".

Eu também manteria registros de desempenho de longo prazo. Cuidado com o IO (segundos / leitura, segundos / gravação são praticamente os únicos relevantes). Todo o resto é IO muito vago - mas quando o seu IO começa a demorar mais do que deveria, os discos ficam para trás.

Eu descartaria um problema de configuração neste momento - pelo menos como indicador principal. Algo usa seus recursos do W3p, agora você precisa descobrir o que é.

Em geral, este não é um servidor que eu adoraria ter físico - é tão pequeno que não faz sentido IMHO ter uma máquina lá. Virtual seria melhor;)

TomTom
fonte
Muito obrigado pela sua resposta. algumas perguntas: Quais logs você verificaria para executar coisas neste momento? (desculpe se esta é uma pergunta para iniciantes) - Upgrade OS: Podemos tentar isso, mas temo que possa quebrar coisas, talvez, quão seguro é isso? - Ambiente de desenvolvimento: o problema é que, no meu ambiente de desenvolvimento, ele funciona bem. A CPU é insignificante, as solicitações não falham, etc. #
Daniel Magliola
Quanto aos logs de E / S: acabei de adicionar os contadores mencionados e todos estão em 0 enquanto a CPU está alta. Acabei de adicionar uma captura de tela de alguns contadores de desempenho que estou vendo. Eu sei que um instantâneo não conta a história toda, mas esses valores tendem a ser bastante estáveis. Você acha que o número de conexões atuais (para as quais não tenho explicação) poderia ser um problema? Alguma idéia de como descobrir o que essas conexões estão solicitando / fazendo? Quaisquer outros contadores que considere úteis para diagnosticar algo assim?
Daniel Magliola
Bem, o R2 é bastante seguro. Atualizei tudo e nunca tive problemas. De qualquer forma .... este é um problema de CPU e pode ser terrível, especialmente se você não possui RAM suficiente para instalar um criador de perfil. Na verdade, eu tentaria uma reinstalação completa. Sim, é péssimo, mas isso significa que você pode instalar o R2 fresco e ver se o problema persiste. O ruim é que você não possui um sistema de reservas, portanto não consegue identificar se o problema é "local" ou mais geral. Como alternativa: pare o IIS, limpe todas as pastas temporárias em uso também
TomTom
para compilação e veja o que acontece quando você reinicia. Com o R2, você pode ver se / quais arquivos são mantidos abertos pelo IIS. É local para um aplicativo Web ou também está presente se todos os sites forem parados? Próxima coisa a tentar - desative todos os sites e descubra qual deles quebra as coisas.
TomTom
Por fim, o problema com os servidores virtuais é que, até onde eu descobri, acabamos pagando mais ou o mesmo pelo mesmo hardware, além disso, a conta da largura de banda é excelente (lembre-se de que servimos arquivos de áudio). Estaremos mudando para um servidor maior, se for necessário, mas, honestamente, com o tráfego que temos, deve haver algum problema, não devemos usar 100% da CPU de todos os tempos. #
Daniel Magliola
4

Você pode tentar usar um programa chamado Process Explorer para monitorar segmentos individuais em execução no processo w3wp. Deve permitir que você veja qual thread está causando todo o dano.

Joe Phillips
fonte
3

Tive muita sorte usando a Ferramenta de Diagnóstico de Depuração da Microsoft para despejar meu processo w3wp e depois verificar os threads e rastrear os rastreamentos quanto a coisas que estavam travando. Dirá até a página solicitada que gerou o tópico, o que é SUPER legal .

http://www.microsoft.com/en-us/download/details.aspx?id=26798

jocull
fonte
1

Eu concordo com a TomTom na linha, especialmente sobre como obter uma melhor quilometragem de um Virtual neste momento. Depurar / criar um perfil localmente para diminuir o problema é a coisa certa a fazer.

Vou colocar meu chapéu e capa Karnak The Magnificent e pedir o primeiro envelope. Rebelião Ram. O que você ganha quando coloca o SO, ASP.NET e um SQL Server Express ganancioso em 1 GB.

Acredito que o seu problema é que o SQL Server Express está atraindo toda a RAM disponível para um Buffer Pool e demorando para liberá-lo. Consulte http://support.microsoft.com/kb/321363 para obter mais informações. Além disso, o IIS possui um cache padrão de 256 MB, que pode ser necessário ajustar ( https://stackoverflow.com/questions/2853135/controlling-asp-net-output-cache-memory-usage ). O Debug Diagnostics é uma ótima ferramenta para solucionar isso (ok, provavelmente uma marreta).

http://technet.microsoft.com/en-us/library/bb742546.aspx é um artigo bastante decente para se olhar. http://social.technet.microsoft.com/forums/en-US/sharepointadmin/thread/706c653a-16b0-4696-85ee-9ae3552a582e aponta para a reciclagem do pool de aplicativos enlouquecida como outro problema possível.

Larry Smithmier
fonte
1

Use o contador "Processo" do Perfmon para ver os atributos individuais do processo w3wp.exe. Quanto tempo de CPU para o processo de trabalho é tempo de kernel? Os tempos altos do kernel podem ser indicativos de paginação, mas você diz que não está convencido. Outras possibilidades são duff drivers. O processo de trabalho tem 23 threads ativos, o que é bom, mas o que eles estão fazendo? Experimente o ProcessExplorer da SysInternals para pesquisar um pouco mais; você também pode ver quais conexões TCP / IP estão em jogo. Não usei o SQL Express, mas ele possui parâmetros de ajuste de memória, como seu irmão mais velho. O SQL está com fome no IIS de memória, causando paginação excessiva?

Simon Catlin
fonte
Vamos ver se estou fazendo isso direito ... Adicionei os contadores% de tempo do processador e% de tempo do usuário, ambos para o processo w3wp, e ambos se combinam perfeitamente o tempo todo. Isso significa que não há tempo de kernel, ou estou vendo isso da maneira errada? (desculpe, eu sou um novato nisso) #
1019 Daniel Magliola
0

Pode não estar totalmente relacionado, mas verifique se você está usando NOLOCK em suas consultas. Pode ajudar no caso de tempos limite do SQL.

Rodrigo Hahn
fonte