Profiling de Aplicações .NET

Mesmo com o melhor desempenho e os melhores profissionais, problemas relacionados a performance podem surgir. Fazer com que uma aplicação execute de forma performática pode parecer uma tarefa fácil, mas isso pode se tornar uma arte oculta.

Ferramentas de profiling monitoram a execução de uma aplicação com o objetivo de medir os recursos computacionais (tempo, processamento e memória) gastos por um método por toda a sua execução. Seu objetivo é identificar pontos na aplicação que causem problemas em sua execução.

O profiling de aplicações .NET é mais complexo do que aplicações em código de máquina, pois o .NET faz uso de recursos como Application Domains, Garbage Collection, Exception Handling e Just-in-Time Compilation, recursos que tornam o processo de captura dos métodos em execução mais complexo.

Vantagens do uso de profiling

As vantagens do uso de profiling são claras, mas podemos destacar os fatos a seguir como base para motivação de sua adoção:

– Identificar blocos de código com problemas de performance.

– Indicar pontos da aplicação que merecem atenção.

– Comparar abordagens alternativas.

– Visualizar a melhoria do código de sua aplicação.

 

Pré-requisitos para execução de profiling

Algumas tarefas são necessárias para execução do profiling, sendo elas:

– Execute o Visual Studio como administrador.

clip_image002

– Antes do profiling, defina a configuração de build como RELEASE. A configuração de build DEBUG insere instruções adicionais para debug da aplicação e não adiciona otimizações adicionais que o compilador utilizada no modo RELEASE. O profiling de aplicações no modo RELEASE fornece dados mais próximos ao ambiente no qual a aplicação executará.

– O profiling faz uso de símbolos para acessar nomes de funções, nomes de parâmetros, nomes de arquivos, número de linhas, etc. Certifique-se que existe acesso à internet durante o processo de análise do profiling, pois o download de símbolos é necessário durante a análise dos dados coletados. Existem duas formas de configurar os símbolos, sendo elas:

1 – Crie uma variável de ambiente chamada “_NT_SYMBOL_PATH” (sem as aspas duplas) com o valor “srv*c:\symbols*http://msdl.microsoft.com/download/symbols” (sem as aspas duplas). É preciso reiniciar a máquina depois de configurada a variável ambiente.

clip_image003

2 – Dentro das opções do Visual Studio, acesse a guia de Symbols dentro da categoria Debugging. Na janela de configuração marque a opção “Microsoft Symbol Servers” e defina um diretório para o armazenamento dos símbolos.

clip_image005

Mais detalhes sobre símbolos

Quando aplicações, bibliotecas, drivers ou sistemas operacionais são compilados são criados executáveis, DLLs e outros binários. Os símbolos contém uma variedade de dados que não são necessários durante a execução destes artefatos, mas que se fazem necessários durante o processo de debug dos mesmos.

Os símbolos contém nomes e endereços de variáveis e métodos, além de suas assinaturas, nomes de arquivos e números de linhas.

Existem dois tipos de símbolos, sendo eles: public symbol e private symbol. Os public symbols não expõe a estrutura interna, os parâmetros das funções e as variáveis locais dos binários. Em contrapartida os private symbols contém todas as informações do assembly. Por motivos de proteção a direitos de propriedade as empresas podem fornecer apenas os public symbols de seus binários, tornando o uso dos private symbols limitado a atividades internas da corporação.

Alguns exemplos de símbolos:

– PDB – Program Database Format
– CV – Codeview Format
– COFF – Common Object File Format

Tipos de Profilings

Existem diferentes tipos de profiling, cada tipo é recomendado para um cenário diferente a ser monitorado. Os tipos existentes são:

1) CPU Sampling: monitora o consumo de CPU da aplicação. Este é o tipo de profiling indicado para iniciar a análise de uma aplicação. Com o CPU Sampling podemos identificar os pontos da aplicação que mais consomem recursos computacionais e assim resolvermos a issue de performance ou usarmos os demais tipos de profiling para detalharmos a issue em destaque.

2) Instrumentation: avalia a quantidade de chamadas a uma função e o tempo consumido por ela. Este tipo de profiling é ideal para avaliar o tempo gasto para acessar um recurso na rede, ou medir o tempo gasto na escrita de um arquivo em disco.

3) .NET Memory Allocation: rastreia o consumo de memória gerenciada.

4) Resource contention data: concorrência entre threads. Este tipo de profiling é ideal quando temos uma rotina que contém threads executando em paralelo e cuja concorrência tem afetado a performance da aplicação.

CPU Sampling

O CPU Sampling é o tipo de profiling recomendado para iniciar a análise de qualquer aplicação. Ele é o modelo mais recomendado por ser bastante genérico e indicar pontos relevantes da aplicação que merecem nossa atenção. Se for necessário investigar mais profundamente algum cenário, os demais tipos de profiling podem ser adotados. Mas, recomendo que a análise sempre comece a partir do CPU Sampling.

Com o uso de CPU Sampling a aplicação é monitorada durante toda a sua execução para identificar qual método está no topo do stack (pilha de execução). Com os dados resultantes desta monitoração é construída uma análise estatística sobre todo o período de execução.

Ao contrário de outros tipos de profiling, o CPU Sampling possui pouco impacto sobre a execução da aplicação.

Para iniciar o profiling de uma aplicação faça os seguintes passos:

1 – Iniciando o processo de profiling

No Visual Studio, com seu projeto aberto, clique no menu “Analyze” e depois em “Performance and Diagnostics”.

clip_image007

Por padrão, o projeto alvo será o “Startup Project, mas você pode escolher outro projeto clicando em “Change Target. Clique em “Start” para iniciar o wizard do processo de profiling.

2 – Escolhendo o tipo de profiling.

clip_image009

Como faremos o profiling utilizando CPU Sampling, mantenha esta opção selecionada. Mas, caso esteja em uma fase mais avançada de profiling ou deseja validar outro tipo de problema de performance, escolha o tipo de profiling desejado.

3 – Definindo o projeto alvo do profiling.

clip_image011

Novamente o Visual Studio irá requisitar o projeto a sofrer profiling. Nesta tela também é possível selecionar um executável para ser attachado durante o profiling ou uma aplicação ASP.NET que contém código JavaScript a ser avaliado. Mantenha o projeto que foi selecionado na primeira janela do wizard.

4 – Clique em Next / Finish e comece o profiling.

Depois de terminado o wizard o profiling será iniciado. O Visual Studio irá fazer o start de sua aplicação e você deverá ver uma tela como a seguinte:

clip_image013

Com o profiling executando basta manipular a sua aplicação ou navegar por dentre o seu site para que o profiling analise o que está sendo executado e faça a captura dos recursos computacionais consumidos pela sua aplicação.

Após executada a sua aplicação, volte a esta janela do Visual Studio e clique em “Stop Profiling”, para que o Visual Studio termine o profiling e comece a processar os dados que foram coletados.

Neste momento, note que a janela Output começa a processar os dados, fazer o download de símbolos, gerar o arquivo VSPX e montar o relatório com os dados coletados durante o profiling.

clip_image015

5 – Iniciando o processo de análise dos dados

Depois de processados, os dados são apresentados no formato do relatório apresentado a seguir.

clip_image017

Após o término do profiling e do processamento do relatório de execução, são apresentados hot paths. Estes hot paths são os pontos por onde devemos começar nossa análise, pois estes são os principais candidatos a sofrerem melhorias devido ao seu alto grau de impacto na execução da aplicação. O gráfico no alto do relatório apresenta o uso de CPU consumido pelo processo da aplicação durante o profiling. Note que os hot paths possuem dois valores associados, Inclusive Samples e Exclusive Samples. Os Inclusive Samples indicam que uma determinada rotina possui um alto custo computacional como um todo, incluindo os métodos que são invocados por este método e o código existente em seu corpo. Os Exclusive Samples apresentam apenas o consumo de CPU do código existente no corpo do método. O desenho abaixo detalha o escopo de Inclusive Samples e Exclusive Samples.

clip_image019

Clicando nos hot paths passamos a navegar por dentre o código, até chegarmos na linha de código que consome mais recursos computacionais. As imagens a seguir demonstram o processo de navegação por dentre o código a partir dos hot paths.

clip_image021

clip_image023

clip_image025

Perceba que as linhas em vermelho são as linhas com maior consumo de CPU, veja que existe uma porcentagem associada sendo exibida no lado esquerdo da tela. Esta porcentagem corresponde ao consumo geral de recursos desta funcionalidade dentro da execução da aplicação.

 

O ciclo de avaliação

O profiling por si só não corrige o problema de performance, ele apenas indica quais pontos consomem mais recursos. Desta forma, é preciso adotar um processo de melhoria para que as issues indicadas pelo profiling sejam de fato corrigidas e assim a melhora na aplicação seja implementada.

O desenho abaixo indica qual o processo básico que pode ser adotado para melhora da performance da aplicação. Este processo inicia no profiling da aplicação, passa pela análise dos pontos indicados como issues de performance, segue para a correção das issues alertadas, e retorna ao início do ciclo com o profiling da aplicação, para que assim possa-se verifica se as correções foram realmente efetivas. Este é um processo cíclico, desta forma cada etapa pode ser executada N vezes, até que o problema de performance seja sanado.

clip_image027

FH

 

Referências

http://msdn.microsoft.com/en-us/library/hh974575.aspx

http://msdn.microsoft.com/en-us/library/dd264994.aspx

http://msdn.microsoft.com/en-us/library/2s0xxa1d.aspx

http://msdn.microsoft.com/en-us/library/ms182372.aspx

http://msdn.microsoft.com/en-us/library/dd255391.aspx

http://msdn.microsoft.com/en-us/library/89axdy6y.aspx

http://msdn.microsoft.com/en-us/library/bb384493(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/ms182398(v=vs.110).aspx

https://www.simple-talk.com/dotnet/performance/the-why-and-how-of-.net-profiling/

http://msdn.microsoft.com/en-us/library/dd264994.aspx

http://pt.slideshare.net/AbhijitJana1/tune-your-aspnet-application-using-visual-std

http://dotnet.dzone.com/articles/profiling-application-visual

http://beyondrelational.com/modules/2/blogs/562/posts/14319/application-performance-profiling-in-visual-studio-2010-part-1-choosing-profiling-method.aspx

http://blogs.windows.com/windows_phone/b/wpdev/archive/2012/02/01/memory-profiling-for-application-performance.aspx

http://msdn.microsoft.com/en-us/library/z9z62c29.aspx

http://msdn.microsoft.com/en-us/library/ms182374.aspx

http://msdn.microsoft.com/en-us/library/ff650691.aspx

http://blogs.msdn.com/b/dotnet/archive/2013/04/04/net-memory-allocation-profiling-with-visual-studio-2012.aspx

http://www.informit.com/articles/article.aspx?p=25359

http://www.microsoft.com/en-my/download/details.aspx?id=38184

Anúncios

3 Responses to Profiling de Aplicações .NET

  1. Pingback: Visual Studio Summit 2014 – Profiling de Aplicações .NET | Fernando Henrique Ferreira

  2. Olá Fernando.. Estive trabalhando com profiling semana passada e nessa situação utilizei o profiler da JetBrains (dotTrace – que por sinal é muito bom).. Ainda não tive a oportunidade de experimentar o profiler do Visual Studio 2013, mas, pelo que você mostrou ele está bem legal.. Parabéns pelo artigo!
    Abs,
    André

  3. Pingback: Novidades relacionadas ao XAML no Visual Studio 2013 Update 2 André Alves de Lima

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: