O principal objetivo de qualquer aplicação é satisfazer plenamente as necessidades dos seus utilizadores finais.
Espera-se que seja rápida, ágil, intuitiva e fiável, entre outras características desejáveis.
No entanto, manter o software a operar com um desempenho de excelência não é uma tarefa simples.
Quando o código começa a executar funções desnecessárias, a encontrar erros ou a entrar em ciclos repetitivos, isso pode levar a ineficiências. A aplicação pode ficar lenta, deixar de responder ou ter um comportamento irregular.
Se estes problemas não forem corrigidos, o desempenho geral da aplicação será afetado negativamente.
Como consequência, os utilizadores podem ficar frustrados ou deixar de usar a aplicação devido ao seu desempenho e lentidão. Isto não só prejudica a reputação da aplicação, como também tem um impacto negativo nas receitas e nos lucros. Por conseguinte, é essencial analisar, rever e depurar o código para atingir um desempenho ótimo. Uma forma rápida de o fazer é através de uma ferramenta de criação de perfis de software, que permite monitorizar e depurar o código, identificando e eliminando os gargalos de desempenho.
Neste artigo, exploraremos o conceito de criação de perfis de software e como esta prática pode ser útil. Em seguida, apresentaremos algumas das melhores ferramentas de criação de perfis para depurar aplicações e otimizar o seu desempenho.
O que é Criação de Perfis de Software?
A criação de perfis de software é uma técnica de análise dinâmica de código que examina o comportamento de um programa através dos dados recolhidos durante a sua execução. O objetivo é identificar as áreas do programa que necessitam de otimização para melhorar a velocidade da aplicação, a sua capacidade de resposta e reduzir o consumo de memória e recursos.
Um criador de perfis de software normalmente mede a duração e a frequência das chamadas de função, juntamente com a complexidade de memória ou tempo associada a um programa. Existem também criadores de perfis específicos, como os criadores de perfis de memória.
A criação de perfis é geralmente realizada através da instrumentação do código fonte do programa. Os criadores de perfis podem utilizar diversas técnicas, como métodos instrumentados, baseados em eventos, estatísticos ou de simulação.
Por que a Criação de Perfis de Software é Importante?
A criação de perfis de software é essencial para avaliar o consumo de recursos e o tempo de execução associados a uma função específica. Isto ajuda a otimizar a velocidade do programa, garantindo ao mesmo tempo que ele utiliza o mínimo de recursos possível.
Adicionalmente, é importante para monitorizar e otimizar a utilização da CPU e o tempo de execução dos comandos.
Portanto, é crucial escolher a ferramenta de criação de perfis de software correta para garantir que os problemas de desempenho possam ser depurados de forma rápida, melhorando a eficiência e proporcionando uma melhor experiência ao utilizador final. Muitos criadores de perfis também incluem relatórios detalhados, gráficos interativos e visualizações que auxiliam na identificação da causa-raiz dos problemas, facilitando a sua resolução.
Apresentamos, então, uma lista de alguns dos melhores criadores de perfis de software que pode experimentar. Partilhe connosco quais as ferramentas que melhor funcionaram para si.
py-spy
py-spy é um excelente criador de perfis de amostragem para Python. Permite analisar detalhadamente as áreas onde a sua aplicação baseada em Python está a gastar mais tempo.
Não é necessário modificar o código ou reiniciar completamente o programa para o utilizar. O py-spy possui uma baixa sobrecarga e é desenvolvido em Rust para garantir uma maior velocidade de execução. A ferramenta não opera no mesmo processo em que o seu programa Python está a ser executado, o que a torna altamente segura para utilizar em ambientes de produção.
O py-spy permite gravar perfis, gerar gráficos de chama (flame graphs) para criar ficheiros SVG interativos. Também é possível visualizar outras opções, como alterar as taxas de amostragem, criação de perfis de extensões C nativas, subprocessos, IDs de thread e muito mais. Pode-se obter uma visualização em tempo real das funções em execução nos programas usando o comando ‘top’ e exibir a pilha de chamadas atual usando o comando ‘dump’ para cada thread Python.
A ferramenta suporta todas as versões do interpretador CPython, incluindo 2.3 – 2.7 e 3.3 – 3.8. O py-spy pode ser instalado a partir do PyPI ou do GitHub.
Pyroscope
O software de criação de perfis contínuo de código aberto Pyroscope auxilia na depuração de problemas de desempenho em aplicações em questão de minutos.
Basta iniciar o servidor e o agente, independentemente do ambiente utilizado (Docker, Linux) ou da linguagem (Ruby ou Go). O Pyroscope oferece suporte abrangente. O seu motor de armazenamento personalizado permite efetuar consultas rápidas, mesmo que pretenda analisar dados de perfil de dez segundos ou dez meses.
Não há necessidade de preocupações com a sobrecarga ou o desempenho da aplicação, pois o Pyroscope utiliza tecnologia de criação de perfis de amostragem que não afeta o seu funcionamento. O Pyroscope armazena os dados de perfil de forma eficiente, o que o torna uma solução económica, mesmo se pretender guardar dados de perfil de várias aplicações durante anos.
O Pyroscope opera em macOS, Linux e Docker e suporta programas escritos em Python, Go e Ruby.
Bubbleprof
Bubbleprof, da Clinic.js, oferece uma forma inovadora de criar perfis de software desenvolvido em Node.js. Utiliza uma interface de utilizador em formato de ‘bolha’ que facilita a identificação do tempo assíncrono gasto na aplicação, tanto para especialistas como para principiantes.
O Bubbleprof visualiza o funcionamento dos processos Node.js através da observação das operações assíncronas, agrupando-as, calculando os atrasos e mapeando-as.
O Bubbleprof determina os tempos de operação observando o tamanho das bolhas dentro de um grupo específico de operações, que pode ser o seu código, um núcleo Node ou um módulo. Também agrupa os grupos adjacentes para reduzir a confusão.
Para calcular os atrasos à medida que uma operação flui de um grupo para outro, o Bubbleprof mede o comprimento da seta que conecta as bolhas. Adicionalmente, são utilizadas diferentes cores nos processos de medição. Simultaneamente, as linhas coloridas internas representam uma mistura de tipos de operação assíncrona, identificando as causas do atraso.
Pyinstrument
Otimize os seus códigos Python com Pyinstrument.
Esta ferramenta revela as razões para a lentidão do seu código Python, facilitando o diagnóstico dos problemas e permitindo-lhe alcançar um desempenho extremamente rápido.
Não é necessário escrever um script Python para utilizar o Pyinstrument. Basta chamar a ferramenta diretamente a partir da linha de comando. O seu script será executado normalmente e o Pyinstrument produzirá um resumo colorido das áreas onde a aplicação gastou mais tempo. A ferramenta também inclui uma API Python que simplifica ainda mais o processo.
O Pyinstrument também permite criar perfis de pedidos web em Flask e Django, para os quais disponibiliza documentação detalhada. É importante notar que o Pyinstrument utiliza perfis estatísticos que registam a pilha de chamadas a cada 1 ms, em vez de rastrear cada chamada de função realizada pelo programa.
Isto é vantajoso, pois os criadores de perfis estatísticos envolvem uma menor sobrecarga em comparação com os criadores de perfis de rastreamento. Dado que o Pyinstrument regista toda a pilha, é fácil identificar as chamadas de funções que são dispendiosas. Além disso, o Pyinstrument oculta (por padrão) os quadros de biblioteca, permitindo que se concentre nas aplicações ou módulos que estão a afetar o desempenho.
A depuração de problemas de desempenho é facilitada porque o Pyinstrument regista o tempo gasto utilizando o tempo do ‘relógio’. A ferramenta rastreia todo o tempo de execução do programa, incluindo o tempo gasto a ler ficheiros, descarregar dados, comunicar com uma base de dados, etc.
Xdebug
Para melhorar o desempenho do seu código e tornar a sua experiência de desenvolvimento mais agradável, o Xdebug oferece recursos abrangentes para criação de perfis e depuração.
Trata-se, na realidade, de uma extensão PHP que permite identificar os gargalos na sua aplicação PHP e analisar o seu desempenho utilizando ferramentas de visualização externas, que geram gráficos de desempenho.
O Xdebug gera informações detalhadas que mostram o caminho percorrido pela aplicação para chegar a um erro, incluindo os parâmetros passados para uma determinada função. Isto facilita o rastreamento de erros. Para ajudar os programadores a entender os problemas com maior clareza, o Xdebug gera informações codificadas por cores, juntamente com visualizações estruturadas.
O Xdebug também inclui um depurador remoto que permite conectar a ferramenta com um código em execução, IDE ou navegador para visualizar os pontos de interrupção do código e executar o código linha por linha. Outro recurso disponibilizado é a cobertura de código, que mostra a quantidade de código do seu programa que foi executada, auxiliando na realização de testes unitários.
SPX
Simple Profiling Extension (SPX) é uma extensão de criação de perfis concebida para PHP. Possui propriedades únicas que a diferenciam de outras extensões de criação de perfis. É totalmente GRATUITA e restrita à sua infraestrutura, o que significa que não existe risco de fuga de dados.
A simplicidade do SPX torna a sua utilização muito fácil. Basta definir uma linha de comando ou uma variável de ambiente para criar o perfil de um script. Em alternativa, também é possível ativar o botão de opção numa página web para criar o perfil do script. Não é necessário instrumentar o código manualmente.
O SPX também suporta a execução de um script de linha de comando – Ctrl-C. Além disso, o processo elimina a necessidade de usar um iniciador de linha de comando ou uma extensão de navegador dedicada. O SPX oferece suporte a várias métricas, cerca de 22, incluindo diversas métricas de tempo e memória, objetos, ficheiros em uso, E/S, etc.
A ferramenta consegue recolher dados sem sair do contexto. A sua interface de utilizador web permite configurar/ativar a criação de perfis para a sessão do navegador em uso, listando todos os detalhes e relatórios do script com perfil. A interface de utilizador web permite selecionar um relatório específico para uma análise mais aprofundada e apresenta visualizações interativas, como Flamegraph, perfil plano e linha do tempo, que podem ser dimensionadas para chamadas de função em milhões.
Prefix
Prefix, da Stackify, é um criador de perfis de código leve e fácil de instalar que muitos programadores apreciam. Esta ferramenta ajuda a eliminar os gargalos no desempenho da sua aplicação para a otimizar e melhorar a experiência do utilizador.
Os recursos de rastreamento e criação de perfis superiores do Prefix permitem identificar rapidamente exceções ocultas, consultas SQL lentas e muito mais. O Prefix proporciona aos programadores o poder real do APM (monitorização de desempenho de aplicações). Para tal, o Prefix valida o desempenho do código tal como foi escrito, permitindo que envie códigos com melhor desempenho para teste.
Desta forma, recebe menos pedidos de suporte da produção e ajuda os gestores de desenvolvimento a atingir as metas mais rapidamente. Descubra todas as consultas de baixo desempenho, gargalos desconhecidos e consultas geradas pelo ORM.
O Prefix permite rastrear todos os parâmetros de cada chamada SQL, analisar os tempos e visualizar os registos afetados. A ferramenta também facilita a identificação de padrões N+1. Esqueça a classificação de todos aqueles registos confusos; reúna-os para localizar facilmente os problemas.
O Prefix permite localizar o contexto de um registo suspeito diretamente num pedido de consulta e saltar de um registo para um rastreamento para depuração sem esforço. O Prefix revela dependências de baixo desempenho, o que é útil para encontrar exceções ocultas e trabalhar com código legado ou secções da estrutura. Estas dependências podem ser serviços web, serviços de terceiros, serviços de cache e outros.
O Prefix funciona em Windows e Mac e suporta .Net, Ruby, Java, PHP, Python e Node.js.
Scalene
Scalene é um criador de perfis de GPU, CPU e memória de alta precisão e alto desempenho para programas baseados em Python. Oferece diversas vantagens em relação a outros criadores de perfis, como a execução de ordens de grandeza mais rápidas e o fornecimento de informações mais detalhadas.
O Scalene é incrivelmente rápido e utiliza amostragem em vez de instrumentação. A ferramenta nem sequer depende dos recursos de rastreamento do Python. Além disso, a sua sobrecarga geralmente fica abaixo de 10-20%. O Scalene executa a criação de perfis de software no nível da linha, apontando para as linhas de código responsáveis pelo tempo de execução do programa.
Estes detalhes são mais valiosos do que aqueles na criação de perfis em nível de função. O Scalene separa o tempo gasto em código Python do código nativo, incluindo bibliotecas. Dado que a maioria dos programadores Python não otimiza o desempenho do código nativo, os programadores podem concentrar os seus esforços na otimização dos códigos que podem efetivamente ser melhorados.
O Scalene destaca os pontos de acesso em vermelho, o que facilita a identificação do tempo de CPU/alocação de memória e a separação do tempo do sistema para identificar problemas de E/S. O Scalene pode relatar o tempo da GPU, criar perfis de uso de memória e rastrear o uso da CPU. O Scalene também consegue identificar possíveis fugas de memória, volume de cópia de perfil e gerar perfis reduzidos para linhas de código que consomem mais de 1% da CPU.
VisualVM
A ferramenta abrangente de resolução de problemas para Java, VisualVM, foi projetada para utilização nas fases de produção e desenvolvimento. Trata-se de um software visual que integra funcionalidades leves de criação de perfis e ferramentas JDK de linha de comando.
O VisualVM monitoriza as aplicações em execução no Java 1.4+ e soluciona problemas utilizando diversas tecnologias como JMX, jvmstat, Attach API e Serviceability Agent. Esta ferramenta é ideal para as diversas necessidades de engenheiros de qualidade, administradores de sistemas e utilizadores finais.
A ferramenta deteta automaticamente as aplicações baseadas em Java que estão em execução local e remotamente e lista-as. Também permite definir programas manualmente utilizando a conexão JMX. Para cada processo, o VisualVM apresenta dados de tempo de execução típicos, como PID, argumentos passados, início do JDK, classe principal, sinalizadores da JVM, versão da JVM e propriedades do sistema e do argumento.
O VisualVM monitoriza a utilização da CPU, pilha e metaespaço ou memória de geração permanente, threads em execução e classes carregadas numa aplicação. Exibe todos os threads em execução numa linha do tempo com tempos agregados de suspensão, execução, estacionamento, monitorização e espera.
Os perfis de instrumentação e amostragem podem ser executados utilizando o VisualVM para gestão de memória e desempenho da aplicação. Apresenta despejos de threads para fornecer informações rápidas sobre os processos. Também exibe e cria instantâneos .hprof sob demanda para ajudar a identificar ineficiências de utilização de heap e depurar fugas de memória.
Além disso, o VisualVM consegue ler dados básicos num processo baseado em Java que tenha deixado de responder, juntamente com o seu ambiente. Pode analisar as suas aplicações offline. A ferramenta permite guardar o ambiente de tempo de execução da aplicação e a configuração com despejos de pilha, despejos de threads e instantâneos de criação de perfis, que pode processar offline numa fase posterior.
O VisualVM funciona em Windows, Linux e Unix.
Orbit Profiler
Visualize a sua aplicação C/C++ e identifique rapidamente os problemas de desempenho utilizando o Orbit Profiler. Esta é uma ferramenta autónoma de depuração e criação de perfis que visa ajudar os programadores a visualizar e compreender o fluxo de execução de aplicações complexas.
O Orbit Profiler proporciona uma visão clara de tudo o que acontece dentro da aplicação, o que permite eliminar rapidamente os gargalos de desempenho e restaurar o bom desempenho da sua aplicação.
O Orbit Profiler funciona de forma eficiente em qualquer aplicação C ou C++, desde que possa aceder ao ficheiro PDB. Em seguida, inicia a criação de perfis assim que concluir o descarregamento do programa. A ferramenta salta para o processo de destino, liga-se às funções selecionadas e executa a criação de perfis.
O Orbit Profiler funciona mesmo nas compilações finais ou otimizadas. Além da instrumentação dinâmica, a ferramenta também oferece recursos de amostragem ‘sempre ativos’, que são rápidos, disponíveis em todos os momentos e robustos.
O Orbit Profiler funciona em Windows e Linux.
Uber JVM Profiler
O Uber JVM Profiler é uma excelente alternativa para as suas aplicações baseadas em Java, que oferece funcionalidades avançadas de criação de perfis.
Esta ferramenta inclui um agente Java que recolhe vários rastreamentos de pilha e métricas para processos Spark/Hadoop JVM de forma distribuída, por exemplo, métricas de memória/CPU/IO.
O Uber JVM Profiler permite rastrear argumentos e métodos Java em códigos de utilizador sem os alterar. Também pode ser usado para rastrear a latência de chamada de nós de nome HDFS para todas as aplicações Spark e identificar problemas. A ferramenta consegue inclusive rastrear os caminhos de ficheiros HDFS da aplicação Spark para descobrir ficheiros importantes e realizar uma otimização adicional.
O Uber JVM Profiler foi criado originalmente para criar perfis de aplicações Spark que geralmente incluem diversas máquinas ou processos numa aplicação. Desta forma, os programadores conseguem correlacionar as métricas para essas máquinas ou processos com facilidade.
No entanto, a ferramenta funciona como um agente Java típico e pode ser utilizada para qualquer um dos seus processos JVM. As suas características incluem:
- Depuração da utilização de memória de executores de aplicações Spark, como memória heap java, memória nativa, memória não heap, buffer pool e pool de memória
- Depuração da utilização da CPU e do tempo de recolha de lixo
- Depuração de métodos de classe Java para frequência e tempo, ou criação de perfis de duração
- Criação de perfis de argumentos (depuração e rastreamento de chamada de método de classe Java e do seu valor de argumento)
- Criação de perfis Stacktrack e geração de Flamegraphs para tempo de CPU
- Depuração de métricas de I/O e métricas de JVM Thread
Tracy
Tracy é uma ferramenta útil para ajudar os programadores a depurar programas PHP com facilidade. Possui um design intuitivo e funcionalidades avançadas, como suporte a CLI, depuração de chamadas AJAX e muito mais.
Com o Tracy, é possível localizar e corrigir erros rapidamente, apresentar variáveis, registar erros, visualizar o consumo de memória e determinar o tempo de execução de consultas ou scripts. A utilização de codificação de cores e o destaque de problemas em vermelho com explicações claras facilitam a visualização de exceções e erros e a sua compreensão.
O Tracy inclui funcionalidades de registo e deteção automática de ambiente. Armazena dados em ficheiros de registo e apresenta mensagens de erro do servidor a um visitante durante períodos de inatividade. O Tracy também se integra com Drupal 7, OpenCart, WordPress e muito mais.
vprof
vprof é um criador de perfis visual para aplicações Python. Fornece visualizações ricas e interativas para as diferentes características do seu programa Python, como utilização de memória e tempo de execução.
O vprof está disponível sob uma licença BSD e suporta Python 3.4 e superior.
Conclusão
O desempenho da aplicação é um fator crucial para atender às expectativas dos utilizadores finais. Se ocorrerem problemas de desempenho, é importante estar preparado para diagnosticar o problema antes que ele afete a experiência do utilizador final.
Por conseguinte, é fundamental continuar a otimizar as suas aplicações e corrigir os problemas de imediato, para continuar a oferecer um desempenho de aplicação extremamente rápido aos seus utilizadores. Utilize as ferramentas que mencionamos neste artigo para atingir esse objetivo.
Abaixo, apresentamos uma tabela de comparação rápida dos criadores de perfis acima e os seus principais usos:
Nome | Linguagens |
py-spy | Python |
Pyroscope | Python, Ruby, Go |
Bubbleprof | Node.js |
Pyinstrument | Python |
Xdebug | PHP |
SPX | PHP |
Prefix | Python, .NET, Java, Node.js, Ruby, PHP |
Scalene | Python |
VisualVM | Java |
Orbit Profiler | C, C++ |
Uber JVM Profiler | Java |
Tracy | PHP |
vprof | Python |