Todos os produtos
Search
Central de documentação

Application Real-Time Monitoring Service:Perguntas frequentes

Última atualização: Aug 04, 2026

Este tópico responde às perguntas mais comuns sobre o uso de continuous profiling.

Ative o Continuous Profiling não gera dados

  1. Verifique se as configurações estão corretas. Certifique-se de que o bloco CIDR configurado inclui o endereço IP da instância da aplicação.

  2. Caso utilize uma versão do agente anterior à 3.1.4, o mecanismo de profiling pode falhar devido a um problema de compatibilidade com a imagem base Alpine. Esse problema foi corrigido na versão 3.1.4. Para garantir estabilidade e integridade dos dados, recomendamos atualizar o agente para a versão 3.1.4 ou posterior.

    Nota

    Para verificar se você está usando uma imagem base Alpine Linux, consulte Outras operações.

  3. O continuous profiling utiliza uma versão aprimorada e open source do Async Profiler para coleta de dados e não suporta a montagem simultânea de múltiplos Async Profilers. Se sua aplicação também usar o recurso de continuous profiling do agente Pyroscope, ela poderá falhar ao iniciar.

  4. Na página de continuous profiling, defina o horário da consulta para 8 horas antes e verifique se os dados aparecem. Se houver exibição de dados, o fuso horário da aplicação pode estar configurado como UTC+0. Isso causa um atraso de 8 horas na gravação de dados em comparação ao UTC+8.

    Solução: Adicione uma variável de ambiente à aplicação para ajustar o fuso horário para UTC+8.

    Nota

    Primeiro, filtre pelo nome do pod atual na página de continuous profiling para evitar confusões causadas por múltiplas reinicializações de contêiner nas últimas 8 horas.

    Key: JAVA_TOOL_OPTIONS, Value: -Duser.timezone=GMT+8

    Esse problema foi corrigido na versão 4.1.10 do agente. Se confirmar que este é o caso, você também pode atualizar o agente para a versão 4.1.10 ou posterior.

  5. Verifique se a aplicação montou outras bibliotecas dinâmicas do Async Profiler:

    1. Execute o comando a seguir. Substitua [pid] pelo ID do processo da sua aplicação.

      lsof -p [pid] | grep libasync
    2. Se o resultado contiver uma biblioteca dinâmica que não seja da Alibaba Cloud, como a mostrada abaixo, sua aplicação está usando sua própria biblioteca dinâmica do Async Profiler. Essa biblioteca não é compatível com o Application Real-Time Monitoring Service (ARMS). Para utilizar os recursos do ARMS, remova essa biblioteca dinâmica.

      /home/admin/xxx/.default/temp/libasyncProfiler1309163652530490111.so

Por que as taxas de armazenamento mudaram no novo continuous performance profiling?

Os principais motivos para a alteração no volume reportado são:

  • O continuous performance profiling é um novo recurso totalmente compatível com o recurso original de continuous profiling. Ele oferece suporte a consultas agregadas em várias instâncias, análise no nível de thread e análise inteligente de gráficos de chama com Copilot.

  • A estrutura de armazenamento foi alterada. Para permitir que os usuários realizem análises secundárias dos dados de profiling, o meio de armazenamento migrou do Object Storage Service (OSS) integrado para uma instância do Simple Log Service (SLS) em sua conta. O SLS Project é proj-xtrace-<encode>-<region-id> e o SLS Logstore é logstore-profiling. Essa mudança afeta o volume de dados de profiling armazenados e as taxas de armazenamento correspondentes.

Intervalo de tempo suportado para consultas de dados

Os dados do continuous performance profiling são retidos por 7 dias. Consulte os dados dentro desse período.

É normal o uso de memória do monitoramento de heap diferir do uso detectado pelos hot spots de memória no continuous profiling?

O Continuous Profiling registra apenas alocações de memória heap dentro de um período especificado, e não o uso total de memória do processo.

Diagnósticos de CPU têm dados, mas diagnósticos de memória não

Esse problema geralmente ocorre com versões do agente 3.1.4 e posteriores.

A ausência de dados nos diagnósticos de memória normalmente indica o uso de uma imagem base Alpine. Imagens base Alpine removem os símbolos de depuração do JDK para reduzir seu tamanho, o que impede o funcionamento correto do continuous profiling. Para resolver, instale os símbolos de depuração do JDK na sua imagem ou utilize uma imagem base que não seja Alpine. Observe que algumas versões do JDK não possuem pacotes de símbolos de depuração correspondentes, o que pode impedir uma instalação bem-sucedida.

Nota

Para verificar se o JDK no seu ambiente contém símbolos de depuração, consulte Verificar se o JDK no seu ambiente inclui símbolos de depuração.

Por que não há dados para hot spots de código ou os dados não atendem às expectativas?

  1. O profiling de hot spots não é suportado para aplicações que utilizam virtual threads ou tecnologias similares no JDK, incluindo o Alibaba Dragonwell JDK.

  2. O protocolo SkyWalking não suporta o recurso de hot spots de código. Confirme o tipo de protocolo nos detalhes do span de um trace.

  3. O recurso de hot spots de código exige a versão 3.1.4 ou posterior do agente. Versões anteriores não oferecem suporte a esse recurso.

  4. Versões do agente anteriores à 4.2.1 suportam apenas chamadas síncronas e podem não coletar dados completos. Dados de chamadas assíncronas podem estar ausentes. Por exemplo, o uso de Spring Cloud Gateway, Undertow ou Lettuce pode causar troca de threads assíncronas, levando a uma coleta de dados imprecisa. As versões 4.2.1 e posteriores incluem otimizações para esses cenários. Recomendamos atualizar o agente para a versão mais recente.

  5. O recurso de hot spots de código é suportado apenas para traces amostrados a uma taxa fixa. Não há suporte para traces coletados com taxas de amostragem não fixas, como amostragem de erros (s9) ou amostragem de lentidão (s10), pois isso causaria alta sobrecarga de desempenho. Esses tipos de amostragem são acionados somente após a conclusão do trace. Utilize verificar o campo sample.reason nos atributos do span para determinar o tipo de amostragem.

    Para traces coletados com taxa de amostragem não fixa, acesse a página Trace Analysis. Use o parâmetro Traces with Code Hotspots para filtrar traces que contenham hot spots de código e diagnosticar problemas.

  6. Ao usar a versão 4.2.1 ou posterior do agente, o tempo de execução coletado pode ser muito inferior ao tempo registrado pelo span externo. Isso pode acontecer se sua aplicação utilizar um framework de I/O assíncrono e não bloqueante (NIO), como o Spring Cloud Gateway. Quando esses frameworks recebem uma requisição de um service upstream ou enviam uma requisição para um service downstream, eles não bloqueiam a thread se os dados não estiverem prontos. Em vez disso, a thread retorna imediatamente e pode executar outras tarefas, melhorando a utilização das threads. Como a thread não fica bloqueada aguardando I/O, o gargalo de desempenho não está na aplicação atual. Nesse caso, o tempo coletado para o hot spot de código pode ser muito menor que a duração do span. Verifique se há gargalos no processamento de requisições da aplicação upstream ou downstream, ou na rede.

Qual é a sobrecarga de desempenho do continuous profiling?

  • Testes de desempenho indicam a seguinte sobrecarga para o continuous profiling: Em um cenário com 500 Transações Por Segundo (TPS) e todos os recursos ativados em uma aplicação Spring Web padrão, a sobrecarga de CPU aumenta aproximadamente 5% e a sobrecarga de memória off-heap aumenta cerca de 50 MB. O aumento na coleta de lixo (GC) e na latência de requisição não é significativo.

  • Em casos extremos, o profiling de hot spots de memória não possui limite de taxa. Se uma aplicação alocar memória com muita frequência, poderá gerar um alto volume de eventos, como dezenas de milhares por minuto. Isso pode afetar a latência P99. Desative o profiling de memória para resolver esse problema.

    Esse problema foi corrigido na versão 4.1.10. Você pode atualizar o agente para a versão 4.1.10 ou posterior.

Threads relacionadas a JFR na aplicação

  • O recurso de continuous profiling cria threads do JDK Flight Recorder (JFR). Essas threads são encontradas principalmente em versões do agente anteriores à 4.1.10. As versões 4.1.10 e posteriores não criam threads JFR.

  • Essas threads não causam gargalos de desempenho na aplicação.

  • Se você desativar dinamicamente a opção de continuous profiling, a thread não será destruída imediatamente. Ela desaparece apenas após a reinicialização da aplicação.

Continuous profiling durante a inicialização da aplicação

O continuous profiling pode tornar a inicialização da aplicação mais lenta. Isso ocorre se o JDK não tiver símbolos de depuração e o Classloader carregar muitos métodos. Após a inicialização, não há impacto no desempenho de execução da aplicação.

Esse problema foi corrigido na versão 4.2.1 do agente. Você pode atualizar o agente para esta versão a fim de resolver o problema.

Por que a memória total no gráfico de chama excede o limite de memória configurado?

Os dados no continuous profiling não estão diretamente relacionados à configuração de memória do host. Eles mostram a quantidade total de memória heap alocada durante o período de análise. Devido à coleta de lixo, é normal que esse valor seja maior que a memória configurada no host.

Falha de anexação no OpenJ9 JDK

O continuous profiling do ARMS não suporta IBM OpenJ9. O uso desse JDK pode causar falha na integração e gerar erros. Recomendamos o uso de OpenJDK ou Oracle JDK.

Dados de hot spots de código em spans estão incompletos

Hot spots de código são identificados amostrando as pilhas de métodos das threads em um trace em intervalos definidos. Se um método estiver ausente no gráfico de chama de hot spots de código, pode ser porque seu tempo de execução é inferior a 500 ms. Métodos com tempos de execução tão curtos podem não ser capturados pelo processo de amostragem. Isso não afeta o diagnóstico de traces lentos, pois métodos de curta duração não são considerados gargalos de desempenho.

Por que o gráfico de chama contém pilhas .GC_active?

.GC_active indica que a coleta de lixo (GC) estava ativa durante a coleta de dados para o gráfico de chama. O processo de GC pausou todas as threads de negócios Java em um evento conhecido como "Stop-the-World". Se .GC_active aparecer em um hot spot de código, significa que uma pausa de GC contribuiu para a latência da requisição.

Por que o gráfico de chama contém entradas "unknown"?

Em um sistema operacional Alpine, se o JDK não tiver símbolos de depuração e o classloader carregar muitos métodos, ativar o continuous profiling pode tornar a aplicação lenta ou causar timeout. Para evitar isso, as versões 4.2.1 e posteriores do agente monitoram o tempo de carregamento. O limiar padrão é 150 ms. Se o carregamento exceder esse tempo, o agente interrompe algumas etapas demoradas. Isso pode impedir que alguns símbolos de método sejam analisados corretamente, resultando em entradas "unknown". Ajuste esse limiar para mitigar o problema. Por exemplo, defina a variável de ambiente AP_JMID_TIME_LIMIT como 500 (milissegundos): export AP_JMID_TIME_LIMIT=500.

Por que o gráfico de chama contém entradas .no_Java_frame?

Isso geralmente acontece ao usar uma imagem base Alpine. O Alpine remove os símbolos de depuração do JDK para reduzir o tamanho da imagem. Isso impede que o sistema identifique nomes de funções nas pilhas de métodos de threads C++ dentro do JDK. Essas pilhas são então exibidas como .no_Java_frame. Elas representam principalmente informações de threads não Java, como da VM Thread ou da thread do compilador Just-In-Time (JIT). Se a proporção de entradas .no_Java_frame for baixa, ignore-as. Concentre-se nas outras pilhas de métodos Java para análise de desempenho. Se a proporção for alta, instale símbolos de depuração para o JDK na sua imagem base ou mude para uma imagem base que não seja Alpine. Note que algumas versões do JDK não possuem pacotes de símbolos de depuração correspondentes, o que pode impedir a instalação.

Por que o item "other" aparece no gráfico de chama?

Problema

Um item "other" aparece no gráfico de chama. Por exemplo, nos resultados de análise com Allocated Memory selecionado como tipo de profiling, o item other (6,41 MB) é destacado em laranja na tabela de classificação de alocação de memória, posicionado entre métodos Java específicos (como AbstractQueuedSynchronizer$ConditionObject.addConditionWaiter() 8,99 MB e java.util.Arrays.copyOfRange(char[], int, int) 8,90 MB). O gráfico de chama à direita exibe a hierarquia de pilha de chamadas correspondente.

Causa

O item "other" em um gráfico de chama é normal. Um gráfico de chama possui uma estrutura de árvore. Quando há muitos nós, identificar informações-chave torna-se difícil. O ARMS agrupa nós menos significativos na categoria "other" para simplificar o gráfico e destacar informações importantes.

Saída de log: parse lib sigsegv handler installed

O agente do ARMS imprime esta mensagem de log informativa. Ela aparece apenas após a ativação do continuous profiling e não afeta o desempenho de execução da aplicação. O ARMS desativará essa saída de log em uma versão futura.

Como resolver o erro "No access to perf events" causado por restrições de perf_event_open?

Problema

O Async-Profiler depende da chamada de sistema perf_event_open para profiling de CPU. No entanto, políticas de segurança no kernel Linux, como seccomp, podem bloquear o uso de certas chamadas de sistema pelos processos.

A mensagem de erro é a seguinte:

[ERROR] Failed to execute 'start,jfr=0,event=cpu,interval=11ms,alloc=512k,file=/tmp/cpc-async-profiler-7729534006755968198.jfr'
[ERROR] Failed to start Continuous Profile Collector
java.lang.RuntimeException: java.lang.IllegalStateException: No access to perf events. Try --fdtransfer or --all-user option or 'sysctl kernel.perf_event_paranoid=1'

Soluções

  • Para ambientes Docker, execute o contêiner com o comando a seguir. Para um controle mais detalhado sobre chamadas de sistema, consulte a documentação oficial.

      docker run --security-opt seccomp=unconfined  XXX
  • Para ambientes Kubernetes, defina o parâmetro de contêiner privilegiado como privileged: true. Contêineres privilegiados são sempre Unconfined.

    Para um controle mais detalhado sobre chamadas de sistema, consulte a documentação oficial.

Como resolver o erro "No AllocTracer symbols found. Are JDK debug symbols installed?"?

Esse erro, ou a falta de dados, pode ocorrer se seu processo Java for executado em um contêiner que usa uma imagem base Alpine. Imagens base Alpine removem os símbolos de depuração do JDK para reduzir seu tamanho, o que impede o funcionamento correto do continuous profiling. Para resolver esse problema, consulte as soluções para falha na coleta de hot spots de memória devido à falta de símbolos de depuração.

Como resolver o erro "perf_event mmap failed..."?

Problema

Esse erro geralmente aparece na saída padrão da Java Virtual Machine (JVM). Quando o continuous profiling amostra hot spots de CPU, ele coleta tanto pilhas nativas (Linux Kernel, JVM e C/C++) quanto pilhas Java. Para coletar pilhas nativas, é necessário realizar um mapa de memória (MMap) no descritor de arquivo perf_event para cada thread Java. O kernel Linux limita a memória total para essas operações MMap. O limite padrão é 516 KB. Se sua aplicação Java tiver muitas threads, poderá exceder esse limite. Isso aciona o aviso perf_event mmap failed... na saída padrão Java. Esse aviso não afeta sua aplicação Java ou lógica de negócios. O único efeito colateral é que as pilhas nativas não aparecerão no gráfico de chama. Como a pilha de métodos Java geralmente é suficiente para diagnosticar hot spots de CPU, você normalmente pode ignorar este aviso.

Soluções

Para eliminar essa mensagem de erro, execute as etapas a seguir:

  1. Na máquina host, execute o comando a seguir.

    echo 1028 > /proc/sys/kernel/perf_event_mlock_kb

    O limiar padrão é 516. Aumente esse valor até que o aviso pare. O valor deve obedecer à fórmula 8*N + 4, onde N é um número natural. Por exemplo, 516 = 512 + 4 e 1028 = 1024 + 4.

  2. Para resolver o erro, reinicie o Docker.

Outras operações

Verificar se o JDK no seu ambiente inclui símbolos de depuração

Símbolos de depuração ausentes farão com que a ativação de hot spots de memória falhe. Consequentemente, nenhum dado de hot spot de memória poderá ser coletado.

  • Verifique nos logs do agente se há símbolos de depuração ausentes.

    No diretório de instalação do agente, procure o arquivo cpc.log no diretório logs. Em algumas versões mais antigas do agente, esse arquivo está no diretório logs/arms_log. Se o log contiver a palavra-chave No AllocTracer symbols found. Are JDK debug symbols installed?, significa que os símbolos de depuração estão ausentes.

    2023-03-08 11:32:00 [continuous Profile collector] [INFO]
    Some or all engines success, details below
    CPU:true
    Alloc:false:No AllocTracer symbols found. Are JDK debug symbols installed?
    Wall:true
    Other:false
    Lock:false
  • Use comandos para verificar se o ambiente está sem símbolos de depuração.

    • Acesse o caminho de instalação do JDK.

      Encontre o caminho de instalação do JDK no seu ambiente usando o comando which java ou echo $JAVA_HOME.

    • A partir do nível superior do caminho de instalação do JDK, execute o comando a seguir para encontrar o caminho do arquivo libjvm.so.

      find ./ -name "*libjvm.so*"
    • Execute o comando a seguir para verificar se os símbolos de depuração foram removidos do arquivo. Substitua /path/to/ pelo caminho real.

      file /path/to/libjvm.so

      Se o comando retornar not stripped, o JDK no seu ambiente inclui símbolos de depuração. Se retornar stripped, ele não inclui símbolos de depuração.

      [root@iZj6cbirlzrhmgljxdfxw9Z jdk-directory]# cd jdk8u412-b08
      [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# ls
      ASSEMBLY_EXCEPTION  LICENSE  NOTICE  THIRD_PARTY_README  bin  include  jre  lib  man  release  sample  src.zip
      [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# find ./ -name "*libjvm.so*"
      ./jre/lib/amd64/server/libjvm.so
      [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# file ./jre/lib/amd64/server/libjvm.so
      ./jre/lib/amd64/server/libjvm.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped

Soluções para falha na coleta de hot spots de memória devido à falta de símbolos de depuração

Método 1: Atualizar para JDK 11 ou posterior

A implementação do JDK 11 e posteriores foi ajustada e não depende mais de informações de símbolos de depuração.

Método 2: Alterar a imagem base

Acesse o Docker Hub e use a palavra-chave openjdk para encontrar distribuições populares do JDK, como eclipse-temurin, ibm-semeru-runtimes e amazoncorretto. Em seguida, procure uma imagem JDK que não seja construída sobre Alpine Linux. Se você tiver seu próprio repositório de imagens JDK, também poderá encontrar uma substituta lá. Imagens JDK construídas sobre Alpine Linux geralmente têm alpine em suas tags.

Por exemplo, a imagem eclipse-temurin:8u382-b05-jdk-alpine tem alpine em sua tag, o que indica que foi construída sobre Alpine Linux. Evite usar essa imagem.

Exemplo de versão JDK construída sobre uma imagem base que não é Alpine Linux:

A imagem eclipse-temurin:8u392-b08-jdk no Docker Hub não possui alpine em sua tag. É uma versão JDK construída sobre uma imagem base que não é Alpine Linux e suporta múltiplas arquiteturas, incluindo linux/amd64, linux/arm/v7, linux/arm64/v8, linux/ppc64le e windows/amd64.

Se ainda não houver dados após alterar a imagem base, verifique o arquivo cpc.log local em busca da mensagem de erro No AllocTracer symbols found. Are JDK debug symbols installed?. Essa mensagem indica que os símbolos de depuração ainda estão ausentes no seu ambiente. Nesse caso, use outra imagem base ou Método 3: Usar Alpine Linux e JDK padrão.

Método 3: Usar Alpine Linux e JDK padrão

Utilize a versão 3.2.8 ou posterior do agente ARMS e declare o Alpine Linux e o JDK no Dockerfile.

from Alpine:3.9
RUN apk add openjdk8