O code hotspot do ARMS é uma ferramenta de monitoramento e diagnóstico que usa continuous profiling para capturar snapshots das pilhas de threads de requisição. Esse recurso oferece uma visão precisa e em tempo real da execução do código, facilitando a identificação de problemas de desempenho.
Casos de uso
Localize rapidamente códigos problemáticos quando ocorrerem chamadas lentas durante eventos de alto tráfego, como promoções de vendas.
Salve automaticamente o contexto de execução quando o sistema encontrar um grande volume de chamadas lentas.
Reconstrua o caminho exato de execução no nível de método para chamadas lentas complexas ou intermitentes e difíceis de reproduzir.
Determine o tempo real de execução de chamadas de método não instrumentadas (fora do framework) quando o trace não contiver instrumentação específica.
Pré-requisitos
O recurso de code hotspot requer a versão 3.1.4 ou posterior do agente.
O recurso de code hotspot depende do continuous profiling, que exige requisitos específicos de kernel do sistema operacional e versão do JDK. Para mais informações, consulte Limitações. Certifique-se de usar um sistema operacional e um JDK compatíveis.
Versões do agente anteriores à 4.2.1 suportam apenas chamadas síncronas e podem perder dados em chamadas assíncronas. Por exemplo, ao usar Spring Cloud Gateway, Undertow ou Lettuce, a troca de threads assíncronas pode causar imprecisões na coleta de dados. A versão 4.2.1 e posteriores do agente suportam cenários assíncronos.
Ativar o code hotspot
Faça login no console do ARMS. No painel de navegação à esquerda, escolha .
-
Na página Applications, selecione uma região na parte superior e clique em nome da sua aplicação.
NotaOs ícones na coluna Language indicam o seguinte:
: uma aplicação Java conectada ao Application Monitoring.
: uma aplicação Go conectada ao Application Monitoring.
: uma aplicação Python conectada ao Application Monitoring.-: uma aplicação conectada ao Trace Explorer (OpenTelemetry).
No painel de navegação à esquerda, clique em Application Settings e, em seguida, clique em aba Custom Configuration.
Na seção Continuous profiling, ative o Main switch e, em seguida, ative o switch Code Hotspot. Configure os endereços IP das instâncias da aplicação ou o bloco CIDR do grupo de instâncias onde deseja ativar esse recurso.
-
Na parte inferior da página, clique em Save.
As alterações entram em vigor imediatamente, sem necessidade de reiniciar a aplicação.
Analisar dados do code hotspot
Este exemplo analisa e itera sobre dados JSON e, em seguida, chama uma API HTTP downstream.
public class HotSpotAction extends AbsAction {
private RestTemplate restTemplate = new RestTemplate();
// Request entry method.
@Override
public void runBusiness() {
readFile();
invokeAPI();
}
// Make an HTTP call.
private void invokeAPI() {
String url = "https://httpbin.org/get";
String response = restTemplate.getForObject(url, String.class);
}
// Read and parse file data.
private double readFile() {
InputStreamReader reader = new InputStreamReader(
ClassLoader.getSystemResourceAsStream("data/xxx.json"));
LinkedList<Movie> movieList = GSON.fromJson(reader, new TypeToken<LinkedList<Movie>>() {
}.getType());
double totalCount = 0;
for (int i = 0; i < movieList.size(); i++) {
totalCount += movieList.get(i).rating();
}
return totalCount;
}
}
Faça login no console do ARMS. No painel de navegação à esquerda, escolha .
-
Na página Applications, selecione uma região na parte superior e clique em nome da sua aplicação.
NotaOs ícones na coluna Language indicam o seguinte:
: uma aplicação Java conectada ao Application Monitoring.
: uma aplicação Go conectada ao Application Monitoring.
: uma aplicação Python conectada ao Application Monitoring.-: uma aplicação conectada ao Managed Service for OpenTelemetry.
No painel de navegação à esquerda, clique em Interface Invocation. No lado direito da página, selecione a interface desejada e clique em aba trace query.
Na aba trace query, clique em link do TraceId desejado.
-
Na coluna Details, clique em ícone de lupa e, em seguida, clique em aba Code Hotspot.
O painel esquerdo lista todos os métodos envolvidos nessa chamada e seus tempos de execução. O painel direito exibe um gráfico de chamas que visualiza os stack traces do método selecionado.
A coluna Self mostra o tempo ou os recursos consumidos por um método durante sua própria execução, excluindo o consumo dos métodos filhos. Isso ajuda a identificar métodos que gastam tempo significativo em sua própria lógica.
A coluna Total mostra o tempo ou os recursos consumidos por um método e todos os seus métodos filhos. Isso ajuda a entender quais métodos contribuem mais para o tempo total de execução da pilha de chamadas.
Para identificar pontos de code hotspot específicos, concentre-se na coluna Self ou procure barras largas na parte inferior do gráfico de chamas. Uma barra larga indica uma causa raiz de alta latência e frequentemente representa um gargalo de desempenho do sistema, como o método java.lang.Thread.sleep().
Analise os dados da seguinte forma:
Ordene a coluna Self em ordem decrescente. Clique em método com o maior valor de Self, como java.util.LinkedList.node(int). O gráfico de chamas à direita focará nos métodos relevantes.
A visualização focada mostra que java.util.LinkedList.node(int) é a barra mais larga no topo da pilha do gráfico de chamas.
Esse método é uma função de biblioteca do Java Development Kit (JDK), não a lógica de negócios da sua aplicação. Para encontrar a origem no seu código, rastreie a pilha de chamadas a partir de java.util.LinkedList.node(int). Ele é chamado por java.util.LinkedList.get(int), que por sua vez é chamado por com.alibaba.cloud.pressure.memory.HotSpotAction.readFile(). O método com.alibaba.cloud.pressure.memory.HotSpotAction.readFile() faz parte da sua aplicação. Neste exemplo, ele consome 3,75s, o que representa 69,88% do tempo total no gráfico de chamas. Isso indica que com.alibaba.cloud.pressure.memory.HotSpotAction.readFile() é um gargalo de desempenho significativo. Analise a lógica desse método para identificar oportunidades de otimização.
Perguntas frequentes
-
Por que a duração mostrada no code hotspot é menor que a duração total da requisição?
Para minimizar o impacto no desempenho da sua aplicação, o recurso de code hotspot usa um mecanismo de coleta otimizado. Isso pode fazer com que a duração registrada seja ligeiramente menor que a duração real da requisição. O desvio geralmente fica dentro de 20 ms. Desconsidere essa pequena diferença e concentre-se nos métodos com a maior duração relativa.
-
Existem limitações no intervalo de coleta de dados do code hotspot?
Para requisições que duram mais de 15 minutos, o recurso de code hotspot fornece dados de análise apenas para os primeiros 15 minutos.
Para reduzir a sobrecarga do sistema, o ARMS não coleta dados de code hotspot para requisições de baixa latência. Geralmente, são requisições concluídas em menos de 500 ms, embora o limiar exato seja determinado dinamicamente com base na carga do sistema. Como resultado, a aba pode não exibir dados para essas requisições.
Tópicos relacionados
Use o recurso de continuous profiling para solucionar problemas de alta utilização de CPU e memória. Para mais informações, consulte os seguintes tópicos:
Usar gráficos de chamas para localizar gargalos de desempenho
Usar profiling de CPU hotspot para diagnosticar alta utilização de CPU
Usar profiling de memory hotspot para diagnosticar alto uso de memória heap
Para problemas comuns com continuous profiling, consulte Perguntas frequentes.