Debugging performance issues in production can be a pain and, in some cases, impossible without the right tools. A criação de perfis Java existe desde sempre, mas os profilers java que a maioria dos desenvolvedores pensa são apenas um tipo: profilers JVM padrão.
No entanto, usar um tipo de profiler não é suficiente.
Suponha que você esteja analisando o desempenho da sua aplicação. Existem múltiplas atividades de criação de perfil que você pode executar. Geralmente, os profilers padrão tratam de perfis de memória, perfis de CPU e perfis de thread.
Mas mesmo com toda essa cobertura, usando uma combinação de vários profilers, você encontrará mais problemas de desempenho. Isto porque cada profiler é melhor em um certo aspecto para perseguir um bug de performance.
Neste post, vamos discutir sobre os três tipos de profilers Java e porque precisamos de todos eles enquanto desenvolvemos a aplicação. Vamos começar com os tipos e mergulhar fundo em cada um deles.
Vamos dar uma olhada nos três diferentes tipos de profilers Java:
- Perfilers JVM padrão que rastreiam cada detalhe do JVM (CPU, thread, memória, coleta de lixo, etc).
- Perfilers leves que destacam sua aplicação com um pouco de abstração.
- Ferramentas de gerenciamento de desempenho de aplicativos (APM) usadas para monitorar aplicativos ao vivo em ambientes de produção.
Profiler JVM padrão
Produtos como VisualVM, JProfiler, YourKit e Java Mission Control.
Um profiler Java padrão certamente fornece a maioria dos dados, mas não necessariamente as informações mais úteis. Isto depende do tipo de tarefa de depuração.
JVM profiler irá rastrear todas as chamadas de método e uso de memória. Isto permite que um desenvolvedor mergulhe na estrutura de chamadas em qualquer ângulo que escolher.
Pros:
- Great para rastrear vazamentos de memória, os profilers padrão detalham todo o uso de memória pelo JVM e quais classes/objetos são responsáveis. A capacidade de executar manualmente a coleta de lixo e, em seguida, rever o consumo de memória pode facilmente dar destaque às classes e processos que estão segurando a memória em erro.
- Bom para rastrear o uso da CPU, um profiler Java normalmente fornece um recurso de amostragem da CPU para rastrear e agregar o tempo da CPU por classe e método para ajudar a zerar nos pontos quentes.
Cons:
- Requer uma conexão direta com a JVM monitorada; isto acaba limitando o uso aos ambientes de desenvolvimento na maioria dos casos. (Nota: alguns profilers podem trabalhar fora de thread e despejos de memória de forma limitada.)
- Diminuem a velocidade da sua aplicação; uma boa parte do poder de processamento é necessária para o alto nível de detalhe fornecido.
Perfiles de Transação Java Leve
Produtos como XRebel e Stackify Prefix.
Profileradores de peso leve têm uma abordagem diferente ao rastrear sua aplicação, injetando-se diretamente no código.
- Aspect Profiler usa uma programação orientada a especificações (AOP) para injetar o código no início e no fim dos métodos especificados. O código injetado pode iniciar um timer e então relatar o tempo decorrido quando o método terminar. Estes profilers são simples de configurar, mas você precisa saber o que fazer com o perfil. Para um exemplo, veja Spring AOP Method Profiling.
- Java Agent profilers use o Java Instrumentation API para injetar código em sua aplicação. Este método tem maior acesso à sua aplicação uma vez que o código está sendo reescrito no nível de bytecode. Isto permite que qualquer código em execução na sua aplicação seja instrumentado – seja o código que você escreveu ou bibliotecas de terceiros das quais sua aplicação depende. Veja esta introdução aos Agentes Java para ver como tudo isto funciona.
Aspect profilers são bastante fáceis de configurar, mas são limitados no que eles podem monitorar e estão sobrecarregados por detalhar tudo o que você quer que seja rastreado. Agentes Java têm uma grande vantagem em sua profundidade de rastreamento, mas são muito mais complicados de escrever.
Stackify Prefix é um profiler Java orientado ao desenvolvedor usando o método Java Agent profiler nos bastidores.
O legal é que o Prefix já conhece as classes mais desejadas e desenvolvedores de bibliotecas de terceiros querem ser instrumentados – para que você não tenha que detalhá-las todas. Além disso, ele pega todas as estatísticas da instrumentação e as exibe de forma simples e compreensível.
Como exemplo, ao executar uma aplicação usando Hibernate, o Prefix não apenas detalha o tempo decorrido para consultas, mas também exibe os valores dos parâmetros para o SQL gerado. Quando sua aplicação chama para uma API SOAP/REST, Prefix fornece a requisição e o conteúdo da resposta.
Low Overhead, Java JVM Profiling in Production (APM)
Todos os profilers até agora têm sido ótimos para o desenvolvimento, mas rastrear como o seu sistema funciona na produção é fundamental.
Produção é sempre um desenvolvimento paisagístico diferente e as configurações de encenação tipicamente não têm os mesmos conjuntos de dados e carga.
Ferramentas Java APM tipicamente usam o método Java Agent profiler mas com diferentes regras de instrumentação para permitir que elas funcionem sem afetar o desempenho em produções. O truque com estes profilers é fornecer a informação certa de uma forma inteligente para não assumir ciclos de CPU.
Stackify’s Retrace é uma ferramenta APM que usa a mesma tecnologia do Prefixo Stackify com alguns ajustes para rodar suavemente em ambientes de preparação e produção.
Isto é feito agregando estatísticas de tempo e traços de amostragem. Isto lhe dá visibilidade em nível de método ao código da sua aplicação que está rodando em produção.
Então quando você tem uma requisição web lenta, isso se traduzirá em um traço que aparecerá no Retrace. De lá você pode mergulhar e ver quais métodos são os culpados.
Retrace Screenshot: Web Request Aggregation over 4 hours
Por que você precisa de todos os 3 perfis para sua aplicação?
Profileradores padrão são bons em encontrar problemas de desempenho na fase de desenvolvimento. Mas a produção é um cenário diferente. O comportamento da sua aplicação pode mudar com base no tráfego de entrada, solicitação do servidor, resposta e muitas outras coisas.
Então, qual é a solução para o ambiente de produção? As ferramentas APM são a resposta. As ferramentas APM visam o ambiente de produção e fornecem um relatório sobre o desempenho da sua aplicação.
Então, as ferramentas de perfil padrão ajudam no desenvolvimento e as ferramentas APM ajudam na produção. Você pode estar se perguntando qual é a necessidade de perfis leves de transação.
Bem, os perfis leves seguem uma abordagem diferente para a criação de perfis de código. Eles se injetam diretamente no código – especialmente no início e no final de um método.
Eles também são fáceis de configurar e consomem relativamente menos recursos. Isto é altamente útil para aplicações que utilizam memória de transação de hardware. Essas aplicações exigem ferramentas de análise refinadas que apontam exatamente qual método ou função está causando problemas de desempenho.
Sem dúvida, podemos dizer que se você estiver desenvolvendo uma aplicação complexa, você precisará dos três profilers. Cada tipo de profiler tem uma abordagem única verificando um aplicativo para problemas de desempenho.
A pesquisa do RebelLab também mostrou que a maioria das empresas usa múltiplos profilers de código para encontrar problemas de desempenho em seu aplicativo.
Por que alguns Profilers Java são tão caros?
XRebel é uma ferramenta legal, mas custa $365 por ano. Stackify Prefix é gratuito e fornece muito da mesma funcionalidade.
O maior problema com as soluções APM é definitivamente o seu preço. Elas têm sido tradicionalmente tão caras que apenas as maiores empresas poderiam pagá-las.
Não faz muito sentido gastar aproximadamente $100 por mês em um servidor no Azure ou AWS e depois gastar quase $200 por mês para um produto como o New Relic.
As ferramentas de monitoramento não devem custar mais do que os servidores!
Ler mais: APM Pricing Is Now Affordable for All Developers, and Why They Should Care
Wrapping It Up
Now that you have learned about the three types of Java code profilers, it’s time to decide se você realmente precisa de todos eles.
The answer lies in your application’s nature.
If it’s small like a local business or shop’s expense management system, profiling is very simple. Um profiler padrão fará o trabalho.
Se você estiver desenvolvendo uma aplicação web como um sistema de rastreamento de um courier, sua aplicação pode ser acessada por milhares de usuários. Nesse caso, você também precisará de ferramentas APM para o ambiente de produção.
Finalmente, se sua aplicação for para sistemas embarcados, você precisará dos três.
Escolha bem, e divirta-se desenvolvendo uma aplicação que ofereça ótima performance.