O Arthas é uma ferramenta poderosa para diagnosticar problemas de produção em aplicações Java. Ele usa instrumentação de bytecode para inspecionar o estado de execução de um programa sem reiniciar o processo da JVM.
Pré-requisitos
-
O Application Monitoring (ARMS) oferece uma nova página de detalhes de monitoramento para usuários que ativaram o novo plano de faturamento. Para mais informações, consulte Faturamento do produto (Novo).
Se você ainda não ativou o novo plano de faturamento e deseja visualizar a nova página de detalhes de monitoramento, clique em Switch to New Version na página Application List.
Atualmente, este recurso suporta apenas aplicações Java.
Recomendamos ativar o diagnóstico do Arthas apenas para solução de problemas e desativá-lo durante o uso rotineiro.
A versão do agente do ARMS deve ser v2.7.1.3 ou posterior.
Sua aplicação deve estar conectada ao Application Monitoring. Para mais informações, consulte Visão geral do Application Monitoring.
A aplicação deve ser desenvolvida em Java.
Informações de fundo
O diagnóstico do Arthas fornecido pelo ARMS complementa as capacidades de diagnóstico em tempo real do ARMS. O diagnóstico do Arthas no ARMS inclui os seguintes tipos:
Visão geral da JVM: visualize o uso de memória em tempo real, informações do sistema, variáveis do sistema e variáveis de ambiente do processo atual da JVM.
Análise de duração de threads: verifique o tempo de cpu consumido pelas threads no processo atual da JVM e a pilha de métodos em tempo real de uma thread específica.
Análise de execução de métodos: capture um único registro de execução de qualquer método não JDK que atenda às condições especificadas. Esse registro inclui parâmetros do método, exceções, valores de retorno e a duração de execução de métodos internos.
Visualizador de objetos: inspecione os valores de campos em tempo real de qualquer instância de classe.
Painel em tempo real: acompanhe painéis em tempo real de componentes comuns. Por exemplo, o painel de um pool de conexões Druid exibe sua configuração, uso e durações de execução de SQL.
Análise de desempenho: faça amostragem de dados como tempo de cpu e alocação de memória durante um período para gerar gráficos de chama correspondentes.
Arthas Shell: use a linha de comando para executar diagnósticos com o Arthas.
Informações sobre a versão do Arthas
Para versões do agente do ARMS entre v2.7.1.3 e 4.6.x, a versão correspondente do Arthas é a 3.5.6. Já para o agente do ARMS nas versões 4.7.x e posteriores, a versão do Arthas é a 4.1.0.
Ativar o diagnóstico do Arthas
Faça login no console do ARMS. No painel de navegação à esquerda, escolha .
-
Na página Application List, selecione uma região no topo da página e clique em nome da aplicação desejada.
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.
Na barra de navegação superior, escolha .
Na seção Arthas Monitoring, ative a chave Arthas. Você também pode executar diagnósticos apenas em endereços IP específicos adicionando-os à configuração.
Clique em Save.
Visualizar diagnósticos do Arthas
Faça login no console do ARMS. No painel de navegação à esquerda, escolha .
-
Na página Application List, selecione uma região no topo da página e clique em nome da aplicação desejada.
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.
Na barra de navegação superior, escolha .
-
No topo da página Arthas Diagnostics, selecione uma instância para diagnosticar na lista suspensa.
Se o agente do ARMS da instância não estiver atualizado para a versão v2.7.1.3 ou posterior, a página solicitará a atualização prévia do agente.
Se o agente do ARMS da instância já estiver na versão v2.7.1.3 ou superior, a página exibirá as informações de diagnóstico do Arthas para essa instância.
Visão geral da JVM
A visão geral da JVM oferece uma visualização de alto nível do status da JVM da sua aplicação, incluindo memória, informações do sistema operacional e variáveis.
A página de diagnóstico do Arthas exibe a aba JVM Overview por padrão. Na aba JVM Overview, visualize as seguintes informações:
JVM Memory: dados sobre a memória da JVM, incluindo uso de heap, uso de non-heap e status de GC. A tabela mostra a memória Used, Total e Max para as áreas heap, buffer_pool e nonheap, além de Total Count e Total Time para cada tipo de GC.
Operating System Information: detalhes do sistema operacional, como carga média, nome do SO, versão do SO e versão do Java. Os campos incluem systemLoadAverage, osVersion, javaVersion, processors, osName, javaHome, timestamp e uptime.
Variable information: informações sobre variáveis, abrangendo variáveis de sistema e de ambiente. A página divide-se em um painel System variables à esquerda e um painel Environment variables à direita, cada um com uma caixa de pesquisa para filtragem por palavra-chave. As variáveis aparecem como pares chave-valor.
Análise de duração de threads
A análise de duração de threads lista todas as threads da aplicação e permite visualizar informações da pilha de threads, facilitando a identificação rápida daquelas com alto consumo de cpu.
-
Na página Arthas Diagnostics, clique em aba Threading Time Analysis.
A aba Threading Time Analysis obtém o uso de cpu em tempo real das threads no processo atual da JVM e agrupa threads semelhantes. O topo da página mostra a quantidade de threads em cada estado (NEW, TERMINATED, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING). A tabela abaixo agrega as threads por Name, Total CPU e Count. Expanda um grupo para ver o id, o uso de cpu, o estado e a ação View real-time stack de cada thread.
Clique em ícone + à esquerda de um grupo de threads para expandir seus detalhes e ver o id, o uso de cpu e o estado de cada thread.
-
Para visualizar a pilha de uma thread, clique em View Live Stack na coluna Actions correspondente a essa thread.
A caixa de diálogo Thread Details será aberta, exibindo o nome da thread, o estado (por exemplo, RUNNABLE) e a pilha Java completa.
Análise de execução de métodos
A análise de execução de métodos captura a duração, os parâmetros de entrada e os valores de retorno de uma execução específica de método, além de permitir uma investigação detalhada. Isso ajuda a localizar rapidamente a causa raiz de chamadas lentas, sendo útil em cenários onde os problemas não podem ser reproduzidos offline ou quando há falta de logs.
Na página Arthas Diagnostics, clique em aba Method Execution Analysis.
Na aba Method Execution Analysis, insira uma palavra-chave do nome da classe na caixa de pesquisa e clique em ícone
.-
Nos resultados da pesquisa, selecione a classe que deseja diagnosticar, escolha um método na lista suspensa à direita e clique em OK.
A página exibe informações de uma execução capturada aleatoriamente do método selecionado pelo ARMS e .
-
A seção Execution Stack à esquerda apresenta o registro de execução interna do método diagnosticado.
Para investigar detalhadamente um método interno, clique em Drill-down na coluna Actions.
-
Para ver o código-fonte do método, clique em View Source Code no topo da seção Execution Stack.
A duração de execução de cada método interno aparece como um comentário no código-fonte.
A seção Method Execution Result à direita mostra os valores dos parâmetros, o valor de retorno, exceções, variáveis membro e o TraceID desta execução de método.
-
Na seção Set Execution Conditions à direita, siga estas etapas para definir condições de captura de registros de execução de método:
Selecione um método sobrecarregado do método atual.
-
Na lista suspensa Please select initial filter key, selecione um tipo de chave e clique em ícone
.Tipos de chave de filtro inicial:
params[n]: o enésimo parâmetro do método.
returnObj: o valor de retorno do método.
Method execution duration: o tempo de execução do método.
Whether an exception is thrown: uma condição baseada no lançamento ou não de uma exceção pelo método.
NotaSe a chave de filtro inicial selecionada for um tipo aninhado, continue selecionando seus campos internos até alcançar um tipo primitivo.
Escolha um operador de comparação.
Insira um valor de filtro.
-
Clique em Add.
A condição de filtro adicionada aparecerá na seção Current Filter Condition.
Por exemplo, selecione o método sobrecarregado doGetDatas(ArmsCtx, String), defina a chave de filtro atual como params[0].userId, escolha o operador =, insira o valor 123 e clique em Add. A seção Current Filtering Conditions mostrará as condições configuradas, como params.length = 2 e params[0].userId = 123.
Clique em ícone
no canto superior direito da seção Execution Stack. O sistema recapturará uma execução de método com base nas condições definidas.
-
Visualizador de objetos
Use o visualizador de objetos para inspecionar o estado de objetos singleton e solucionar problemas relacionados a configurações de aplicação, listas de permissões, listas de bloqueios e variáveis membro.
Na página Arthas Diagnostics, clique em aba Object Viewer.
Na aba Object Viewer, insira uma palavra-chave do nome da classe na caixa de pesquisa e clique em ícone Search.
-
Nos resultados da pesquisa, selecione a classe a ser diagnosticada. Em seguida, na lista de instâncias à direita, selecione uma instância e clique em OK.
A página exibe os valores em tempo real dos campos dessa instância. Ela se divide no painel Real-time Field Values of Object à esquerda (uma tabela com colunas Type, Field Name e Details) e no painel Field Details à direita (que mostra dados json detalhados do campo selecionado).
Para campos de tipo simples, a coluna Details no painel Object field real-time value mostra o valor do campo.
-
Para campos de tipo complexo, clique em View Details na coluna Details do painel Object field real-time value para ver os detalhes do valor do campo no painel Field Details à direita.
O painel Field Details suporta apenas desserialização de um nível para campos complexos. Para visualizar dados mais específicos, clique em Click.
Painel em tempo real
Use o painel em tempo real para acompanhar o status de componentes essenciais do seu sistema, como pools de conexão de banco de dados e pools de conexão HTTP. Isso auxilia na solução de problemas relacionados a recursos.
Na página Arthas Diagnostics, clique em aba Live Kanban.
-
Na aba Live Kanban, selecione um painel na lista suspensa, escolha uma instância na caixa de seleção de instâncias à direita e clique em Add to dashboard.
A página mostra dados em tempo real do painel. Por exemplo, para um pool de conexões Druid, as informações de status incluem configuração básica, status do pool e distribuição de duração de execução. A configuração básica abrange DbType e URL. O status do pool inclui métricas como ActiveCount, PoolingCount e MaxActive. Os gráficos de barras abaixo mostram a connection holding time distribution e a transaction execution duration distribution.
Análise de desempenho
A análise de desempenho faz amostragem de dados como tempo de cpu e alocação de memória durante um período e gera gráficos de chama. Isso permite identificar rapidamente gargalos de desempenho na aplicação.
Na página Arthas Diagnostics, clique em aba Performance Analytics.
Abaixo da aba Performance Analytics, clique em Create flame map.
-
Na caixa de diálogo Create flame map, selecione um tipo de gráfico de chama, insira a duração da amostragem e observações, e então clique em Confirm.
Parâmetro
Descrição
Exemplo
Flame graph type
O tipo de objeto a ser amostrado. Valores válidos:
-
CPU time
-
Memory allocation
-
Lock time
-
itimer
CPU time
Sampling duration (in seconds)
A duração da amostragem. Valores válidos: 10 a 1800.
30
As informações da tarefa do gráfico de chama criado aparecem abaixo da aba Performance Analytics, incluindo hora de início, duração da amostragem, observações, tipo de gráfico de chama e status da tarefa. Após a conclusão da tarefa, um link View flame graph será exibido na coluna Task Status. Clique em link para visualizar o gráfico de chama gerado.
-
-
Abaixo da aba Performance Analytics, localize o registro da tarefa. Na coluna Task Status, clique em View flame chart. Siga as instruções na tela para baixar o arquivo do gráfico de chama no formato SVG e abra-o em um navegador.

Arthas Shell
Use a linha de comando para realizar diagnósticos personalizados com o Arthas.
No topo da página Arthas Shell, selecione uma Route e use o botão Connect ou Disconnect. Após uma conexão bem-sucedida, um aviso de status verde Connected será exibido. A interface preta do terminal abaixo mostra o prompt de comando do Arthas, como [arthas@9]$. Insira comandos do Arthas no terminal para executar operações de diagnóstico.
FAQ
Nenhum prompt ou heartbeat após ativar o Arthas
Este problema pode ocorrer pelos dois motivos seguintes:
-
Problema de conectividade de rede.
Verificar a conectividade de rede. Se as conexões com as portas de diagnóstico de aplicação pública e privada (9092) falharem, configure o grupo de segurança para permitir acesso de saída na porta 9092 para os domínios de endpoint de diagnóstico e acesso na região correspondente. Para obter informações sobre os nomes de domínio necessários, consulte Configurações de rede para monitoramento de aplicações Java. O domínio de diagnóstico da aplicação é o mesmo que o domínio de metadados de rastreamento.
-
A aplicação possui um agente SkyWalking anexado.
O agente Arthas integrado ao ARMS é incompatível com o agente SkyWalking. Desinstale o agente SkyWalking ou anexe manualmente uma versão mais recente do Arthas (3.7.0 ou posterior).
Execute o comando
cat ~/logs/arthas/arthas.log. Uma exceção indicando incompatibilidade de agente será exibida no final do log.2023-09-11 09:09:47 [arthas-binding-thread] ERROR c.t.a.core.server.ArthasBootstrap -start channel client failure java.lang.ExceptionInInitializerError: null at com.alibaba.arthas.channel.proto.ArthasServiceGrpc$ArthasServiceStub.register(ArthasServiceGrpc.java:306) at com.alibaba.arthas.channel.client.ChannelClient.connect(ChannelClient.java:165) at com.alibaba.arthas.channel.client.ChannelClient.start(ChannelClient.java:111) at com.taobao.arthas.core.server.ArthasBootstrap.bind(ArthasBootstrap.java:478) at com.taobao.arthas.core.server.ArthasBootstrap.<init>(ArthasBootstrap.java:162) at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:613) at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:601) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.taobao.arthas.agent334.AgentBootstrap.bind(AgentBootstrap.java:182) at com.taobao.arthas.agent334.AgentBootstrap.access$000(AgentBootstrap.java:20) at com.taobao.arthas.agent334.AgentBootstrap$1.run(AgentBootstrap.java:152) Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.grpc.stub.ClientCalls.<clinit>(ClientCalls.java:52) ... 14 common frames omitted Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.skywalking.apm.dependencies.net.bytebuddy.dynamic.Nexus.initialize(Nexus.java:139) ... 19 common frames omitted Caused by: java.lang.NoClassDefFoundError: Lorg/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter; at java.lang.Class.getDeclaredFields0(Native Method) at java.lang.Class.privateGetDeclaredFields(Class.java:2583) at java.lang.Class.getDeclaredField(Class.java:2068) at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField.onLoad(LoadedTypeInitializer.java:163) at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$Compound.onLoad(LoadedTypeInitializer.java:233) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$InjectingInitializer.onLoad(AgentBuilder.java:3655) ... 24 common frames omitted Caused by: java.lang.ClassNotFoundException: org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsInter at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at com.taobao.arthas.agent.ArthasClassloader.loadClass(ArthasClassloader.java:34) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 30 common frames omitted
Falha de comando na análise de execução de métodos
A animação de carregamento na seção Execution Stack da página Method execution analysis indica que o sistema está aguardando a invocação do método.
A análise de execução de métodos captura a execução do método selecionado atualmente em tempo real. Se o método não for executado durante o período de espera, a operação expira e esse erro ocorre. Clique em ícone Refresh para tentar novamente.
Tamanho incorreto do espaço survivor
O espaço survivor divide-se em duas partes iguais: um espaço "from" e um espaço "to". O Arthas exibe apenas o tamanho do espaço "from".
Faturamento para diagnóstico do Arthas
Não. Não há cobranças adicionais para este recurso.
Conexão recusada ao anexar o Arthas manualmente
Por padrão, o Arthas usa a porta 3658 para aceitar novas conexões de cliente. Para evitar conflitos de porta quando vários processos no mesmo host anexarem o Arthas, o Arthas integrado ao ARMS utiliza uma porta aleatória. Isso pode causar falhas de anexação. Se esse problema ocorrer, desative o recurso Arthas no console do ARMS antes de anexar o Arthas manualmente.
Erro "Arthas server already bind"
Se uma instância open-source do Arthas foi anexada anteriormente à aplicação, o Arthas integrado ao ARMS não poderá ser ativado. Remova primeiro o Arthas open-source e, em seguida, ative o Arthas integrado ao ARMS.