• Sign in
 

LATAM Team blog

Search Blogs
Tags
  • Cloud
  • Cluster
  • Crash
  • Desarrollo
  • Desenvolvimento
  • Directory Services
  • DST
  • Español
  • Exchange/Outlook
  • Hang
  • High Availability
  • IIS
  • Networking
  • Office
  • People
  • Performance
  • Português
  • PowerShell Scripts
  • Security
  • Setup
  • Sharepoint
  • SQL
  • Virtualization
  • Windbg Scripts
  • Windows
Blog - News

Where Are You Coming From Today?

Where are you now?

Follow us on:

Options
  • Blog Home
  • About
  • Share this
  • RSS for posts
  • Atom
  • RSS for comments
Archive
Archives
  • May 2013 (4)
  • April 2013 (5)
  • March 2013 (6)
  • February 2013 (3)
  • January 2013 (3)
  • December 2012 (2)
  • November 2012 (1)
  • October 2012 (4)
  • September 2012 (5)
  • August 2012 (2)
  • July 2012 (2)
  • June 2012 (3)
  • May 2012 (13)
  • April 2012 (6)
  • March 2012 (6)
  • February 2012 (4)
  • January 2012 (7)
  • December 2011 (11)
  • October 2011 (6)
  • September 2011 (1)
  • August 2011 (3)
  • July 2011 (7)
  • June 2011 (6)
  • May 2011 (5)
  • April 2011 (2)
  • March 2011 (13)
  • February 2011 (1)
  • January 2011 (5)
  • December 2010 (6)
  • November 2010 (1)
  • October 2010 (6)
  • September 2010 (2)
  • August 2010 (3)
  • July 2010 (3)
  • June 2010 (5)
  • May 2010 (1)
  • April 2010 (10)
  • March 2010 (21)
  • February 2010 (8)
  • January 2010 (3)
  • December 2009 (5)
  • November 2009 (5)
  • October 2009 (6)
  • September 2009 (8)
  • August 2009 (9)
  • July 2009 (1)
  • June 2009 (3)
  • May 2009 (2)
  • April 2009 (7)
  • March 2009 (4)
  • February 2009 (7)
  • January 2009 (7)
  • December 2008 (8)
  • November 2008 (7)
  • October 2008 (22)
  • September 2008 (17)
  • August 2008 (13)
  • July 2008 (11)
  • June 2008 (7)
  • May 2008 (3)
  • April 2008 (2)
  • March 2008 (6)
  • January 2008 (4)
  • December 2007 (9)
  • November 2007 (4)
  • October 2007 (3)
  • September 2007 (8)
  • August 2007 (4)
  • July 2007 (2)
  • June 2007 (5)
  • May 2007 (7)
  • April 2007 (9)
  • March 2007 (7)
  • February 2007 (6)
  • January 2007 (4)
  • December 2006 (14)
  • November 2006 (10)
  • October 2006 (10)
  • September 2006 (11)
  • August 2006 (15)
  • July 2006 (7)
  • June 2006 (14)
  • May 2006 (22)
  • April 2006 (16)
  • March 2006 (20)
  • January 2006 (1)

Desafio da Semana #11

TechNet Blogs > LATAM Team blog > Desafio da Semana #11

Desafio da Semana #11

LatamBlog
29 Sep 2006 2:22 PM
  • Comments 3

DESAFIO DA SEMANA #11

 

 

Por: Roberto Alexis Farah

 

Olá pessoal!

O desafio dessa semana se baseia num incidente de suporte real que trabalhei recentemente.

 

Primeiro um pouco de história: o incidente era um sintoma de hang (100% de cpu) em quatro servidores IIS, três IIS 5 rodando em Windows 2000 e um IIS 6 rodando em Windows 2003. Todos os servidores acessavam quatro servidores SQL Server 2000 Enterprise rodando em máquinas Windows 2000 Advanced Server.

Como sempre a parte desafiante e que tomou tempo é de se isolar o problema. Uma vez isolado achar a solução é um desafio menor, muitas vezes é algo direto. Ainda algumas vezes alguém menciona algo do tipo: “Ah! Não acredito que era isso!”.

 

Nesse caso em específico o sintoma de alta CPU nos servidores IIS foi isolado para uma determinada página ASP e, posteriormente, para um fragmento de código nessa página ASP. Portanto, partindo-se de vários executáveis cheguei em um fragmento de código fonte; comprovadamente o culpado, embora aparentemente pareça um inofensivo fragmento de código. J

 

Durante a investigação me baseei, num primeiro instante, nos únicos dumps que tínhamos, que não foram coletados durante a ocorrência do sintoma. Ainda assim foi possível se criar uma hipótese inicial, onde suspeitei do banco de dados após a análise do dump. Entretanto, uma nova coleta de dumps durante a ocorrência do sintoma mostrou que as threads não seguiam um padrão quando comparadas com o dump anterior, com isso descartei a primeira hipótese e elaborei outra que se mostrou correta, uma vez que a informação, na segunda vez, foi coletada no momento do sintoma.

 

Aqui vale uma explicação sobre hipóteses: criar uma hipótese e tentar comprová-la é um modo de nos mantermos focados em uma direção. A grande vantagem disso é justamente de evitar força-bruta durante a investigação e agir estrategicamente, com um objetivo em mente. Quando a hipótese é comprovada isso significa muitas vezes que o problema foi isolado ou que estamos muito perto disso. Entretanto, quando a hipótese é descartada isso também é um bom resultado! Explico: quando você coleta informação suficiente para descartar uma hipótese baseada em fatos isso permite que você elimine um potencial problema que poderia explicar os sintomas , reduzindo a complexidade do seu problema já que algumas variáveis podem ser seguramente descartadas.

 

Outro fator importante é a percepção do cliente. Um engenheiro que tenta isolar um problema com base em ações sem propósito definido, ações aleatórias sem uma estratégia que faça sentido certamente não será bem visto pelo cliente, além de comprometer o tempo de resolução do problema. Qualquer cliente espera que o engenheiro saiba conduzir a investigação, portanto, é fundamental usar um (eu diria entre vários) ensinamento do xadrez: “todo movimento deve ter um propósito”, ou seja, toda ação deve ter um propósito, para isso as ações devem fazer parte de uma estratégia cujo objetivo é comprovar uma hipótese.

 

Voltando ao nosso problema, durante o início da investigação fiz várias perguntas que usualmente faço antes de tomar qualquer tipo de ação. Em situações reais adiciono outras relacionadas ao ambiente do cliente e as vezes removo algumas caso já tenha a informação. Eis algumas delas:

 

1- Por favor, descreva todos os sintomas que conseguiu identificar.

 

2- Qual o sistema operacional e service pack sendo utilizado?

 

3- Qual a versão de IIS, SQL Server e outros e os respectivos Service Pack?

 

4- Há componentes na solução?

 

5- Qual a linguagem de desenvolvimento utilizada?

 

6- Há alguma particularidade durante os sintomas?

 

7- O sintoma é facilmente reprodutível?

 

8- A ocorrência do sintoma obedece algum padrão?

 

9- O sintoma ocorre nos ambientes de desenvolvimento, homologação e produção?

 

10- O sintoma sempre ocorreu ou passou a ocorrer após alguma mudança?

 

11- Qual a frequência do sintoma? Ela tem se mantido estável?

 

12- O que foi tentado de modo a eliminar o sintoma ou para amenizar os sintomas?

 

13- Quais as mensagens de erro que ocorrem durante o sintoma?

 

 

Muitas vezes com as respostas das perguntas acima é possível se elaborar uma hipótese muito forte, digo, uma hipótese que na maioria das vezes se mostra verdadeira. Nesse incidente em particular me chamou a atenção o fato da aplicação ter funcionado bem desde aproximadamente 2 anos atrás quando foi criada e não ter sofrido alterações recentemente. Entretanto, gradativamente o sintoma de performance baixa e alta CPU começou a se manifestar.

 

Dica: Geralmente sintomas que não existiam algum tempo atrás e gradativamente passaram a se manifestar sem mudanças na aplicação deveriam colocar em True seu flag mental de bProblemasDeEscalabilidade. ;)

 

Abaixo apresento o código ASP causador do sintoma de alta CPU e algumas informações para que você possa deduzir o que poderia ter ocasionado o sintoma de alta CPU e resolver o problema.

 

 

CENÁRIO

 

Aplicação web feita em ASP apresenta alta CPU sempre que o fragmento script abaixo é executado:

 

Set objFso   = Server.CreateObject("Scripting.FileSystemObject")

Set objPasta = objFso.GetFolder(Server.MapPath("/imagens/grande/" & left(rsProduto("codigo"), 2)))

 

imagemGrande = false

 

For Each objArq in objPasta.Files

 

If ucase(objArq.Name) = ucase(rsProduto("codigo") & ".jpg") then

imagemGrande = true

end if

Next

 

 

Sim… esse códigozinho acima foi o responsável por impactar severamente todos os servidores web do meu cliente! E justamente por isso resolvi criar esse desafio. Desse modo, temos mais exemplo de um problema simples que escapa de desenvolvimento/testes para produção tornando-se um monstro difícil de ser localizado e capaz de criar um impacto enorme nos usuários!

 

Várias threads estavam consumindo 100% de CPU há vários minutos quando executando o loop acima.

 

As imagens JPG de produtos ficavam em um diretório. Basicamente cada produto tinha várias imagens no mesmo diretório. Durante o passar dos anos a quantidade de produtos aumentou bastante... após algum tempo os sintomas começaram. (opa, bProblemasDeEscalabilidade = True J)

O loop não estava travado em uma única linha mas executando continuamente...

 

Nota: A rede estava ok. O diretório de imagens era local e o I/O também estava ok conforme comprovado por logs de Performance Monitor.

 

 

SINTOMA

 

100% de CPU em várias threads sempre quando executavam o fragmento de código acima. O sintoma persistia durante vários minutos.

 

 

OBJETIVO

 

Identifique o PROBLEMA e proponha uma SOLUÇÃO.

 

Dica: Se achar melhor crie um código VBScript ou JavaScript e tente criar a condição que causa o sintoma de alta cpu. Baseado no cenário acima será fácil deduzir…

 

 

Até semana que vem.

  • 3 Comments
Desenvolvimento , Português
Comments
Comments
  • Rodrigo Strauss
    29 Sep 2006 3:47 PM
    1 - O mapeamento de arquivos poderia estar no banco, pra ele não varrer o diretório toda vez. Quando o número de arquivos aumenta muito não existe Cache Manager que resolva
    2 - Precisa colocar um Exit For dentro de If, já que ele continua varrendo os arquivos mesmo se a condição foi encontrada.

    Ele poderia colocar um job de X em X minutos que varre a pasta e colocar em uma tabela com índice. Aí ele busca no banco. Até um Collection VB acho que melhoraria, mas só dá pra saber mensurando. Ele tb poderia separar os arquivos em pastas de acordo com um critério como os primeiros algarismos do código, pra reduzir o escopo da procura.
  • Ricardo Bánffy
    29 Sep 2006 4:28 PM
    O que esse código está fazendo? Não seria mais fácil simplesmente verificar se o arquivo existe diretamente em vez de loopar e comparar o nome de cada arquivo? Dúzias de threads loopando por milhares de arquivos arriariam qualquer servidor.

    Randal Schwartz disse certa vez que o PHP é um útil pára-raios, que evita que aqueles que não deviam programar progridam para linguagens "de verdade", permitindo que os programadores "de verdade" vivam mais tranquilos e felizes em suas listas de discussão e canais de IRC.

    O ASP/VBScript cumpre mais ou menos a mesma função.

    Cá pra nós, isso é material para um http://thedailywtf.com/
  • Roberto A. Farah
    4 Oct 2006 12:50 PM
    Olá Rodrigo e Ricardo, Nessa sexta colocarei a solução que utilizei. Continuem participando e se vocês tiverem sugestões de artigos nós adoraríamos saber! Obrigado
Page 1 of 1 (3 items)
  • © 2013 Microsoft Corporation.
  • Terms of Use
  • Trademarks
  • Privacy & Cookies
  • 5.6.426.415
  • TechNet
  • Products
  • IT Resources
  • Downloads
  • Training
  • Support
Products
  • Windows
  • Windows
    Server
  • System
    Center
  • Internet
    Explorer
 
  • Office
  • Office 365
  • Exchange
    Server
 
  • SQL Server
  • SharePoint
    Products
  • Lync
  • See all products »
Resources
  • Evaluation Center
  • Learning Resources
  • Microsoft IT Camps
  • Microsoft Technical Communities
  • Microsoft Virtual Academy
  • Script Center
  • Server and Tools Blogs
  • Solution Accelerators
  • TechNet Blogs
 
  • TechNet Flash Newsletter
  • TechNet Gallery
  • TechNet Library
  • TechNet Magazine
  • TechNet Subscriptions
  • TechNet Video
  • TechNet Wiki
  • Windows Sysinternals
  • Virtual Labs
Solutions
  • Networking
  • Cloud and Datacenter
  • Security
  • Virtualization
Updates
  • Service Packs
  • Security Bulletins
  • Microsoft Update
Trials
  • Windows Server 2012
  • System Center 2012 SP1
  • Microsoft SQL Server 2012 SP1
  • Windows 8 Enterprise
  • See all trials »
Related Sites
  • Microsoft Download Center
  • TechNet Evaluation Center
  • Drivers
  • Compatability & Converters
  • Windows Sysinternals
  • TechNet Gallery
Training
  • Training Catalog
  • Class Locator
  • Microsoft Virtual Academy
  • Free Windows Server 2012 courses
  • Free Windows 8 courses
  • SQL Server training
  • e-Learning overview
Certifications
  • Certification overview
  • MCSA: Windows 8
  • Windows Server Certification (MCSE)
  • Private Cloud Certification (MCSE)
  • SQL Server Certification (MCSE)
Other resources
  • TechNet Events
  • Second shot for certification
  • Born To Learn blog
  • IT Camps
Support by product
  • Exchange Server
  • Forefront Server
  • Forefront Edge Security
  • Forefront Server Security
  • Internet Explorer
  • Office
  • SharePoint
 
  • SQL Server
  • System Center
  • Windows Server
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
Other support links
  • Microsoft Premier Online
  • Microsoft Fix It Center
  • TechNet Forums
  • MSDN Forums
  • Security Bulletins & Advisories
  • International support solutions
  • Log a support ticket
  • Look up event IDs and error codes
Not an IT pro?
  • Microsoft Customer Support
  • Microsoft Community Forums