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.
– 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.
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.
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”.
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.
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.
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:
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.
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.
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.
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.
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.
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://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://www.informit.com/articles/article.aspx?p=25359
http://www.microsoft.com/en-my/download/details.aspx?id=38184
[…] ← Profiling de Aplicações .NET […]
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é
[…] a cada release ou update (a propósito, aproveito para abrir um parênteses aqui e indicar este excelente artigo do Fernando Henrique Ferreira sobre profiling de aplicações .NET com o Visual Stu…). No Visual Studio 2013 Update 2, o time adicionou uma ferramenta ao hub de performance e […]