O thread profiler é uma ferramenta de criação de perfil de baixo impacto que pode ser usada na produção para identificar gargalo em um aplicativo. Ele funciona capturando periodicamente (100 ms) o stack trace de cada thread por um período especificado. Ao final da duração especificada, o rastreamento de pilha é agregado para construir uma árvore. A contagem de chamadas na árvore corresponde ao número de vezes que essa função esteve presente no rastreamento de pilha no mesmo contexto.
Embora a árvore de chamadas não possa capturar toda a execução, uma amostra grande o suficiente pode ser uma boa representação do comportamento do aplicativo. Isso fornece insights sobre as funções "quentes" do aplicativo onde a maior parte do tempo é gasto. Com este escopo, as entradas amostradas com menos de 0,05% são omitidas.
Agente compatível
Este recurso está disponível apenas para agentes e versões específicas:
Agente Java versões 1.2.004.6 ou superior
.NET:
Framework: versões do agente 2.12.146.0 ou superior
.NET Core 2.0: versões do agente 8.3.360.0 ou superior (somente Windows)
Linux: .NET Core 3.0 ou superior e versões de agente 8.23 ou superior
Python: versões do agente 1.7.0 ou superior
Ruby: agente versões 3.5.5 ou superior
Inicie o profiler
O recurso Thread profiler está habilitado por padrão. Você também pode ativá-lo ou desativá-lo no arquivo de configuração do agente:
Java: thread_profiler.enabled
NET: você
cannot
desativa o thread profiler com aplicativos .NET.
Python: thread_profiler.enabled
Ruby: thread_profiler.enabled
Quando ativado, você pode visualizar o thread profiler em nossa interface do usuário:
Selecione o host no qual deseja executar o profiler .
Defina a duração da sessão de criação de perfil.
Selecione
Start profiler
.
Isso aciona o agente para iniciar o thread profiler durante o próximo ciclo de coleta (a cada minuto) e capturar dados pela duração especificada. Registramos backtraces de thread, estejam ou não em estado executável no momento em que a amostra é coletada. Threads que estão suspensos ou bloqueados no IO podem aparecer na árvore de chamadas.
one.newrelic.com > All capabilities > APM & services > (select an app) > Events > Thread profiler: use esta página para definir as configurações de duração do thread profiler e para visualizar os resultados.
Ver dados do perfil
Depois que o profiler terminar a execução, o agente reportará os dados do perfil. A árvore de chamadas aparece automaticamente na página Thread profiler . As porcentagens na árvore de chamadas representam a porcentagem de amostras de backtrace de encadeamento nas quais cada caminho de chamada apareceu durante a sessão de criação de perfil. A coleta de dados iniciou-se no momento do PERFIL COLETADO.
A página codifica por cores os resultados da árvore:
Vermelho: percentagens superiores a 30%
Amarelo: percentuais superiores a 10%
Preto: percentagens inferiores a 10%
If you want to...
Do this...
Alterar a forma como as informações do perfil da conversa aparecem
Selecione suas opções de opções disponíveis em Tree settings e selecione Refresh tree.
Alterar a quantidade de informações exibidas
Selecione as opções Expand ou Collapse acima da árvore de chamadas ou selecione o nome ou a seta em qualquer linha da árvore de chamadas.
Visualize informações resumidas sobre qualquer linha na árvore de chamadas
Passe o mouse sobre a linha.
Enviar por e-mail os resultados do perfil da conversa para outras pessoas
Selecione Share this profile.
Inicie outra sessão ou visualize um perfil de tópico diferente
Selecione Back to all profiles.
Considerações do agente
Dependendo de qual agente você usa, o recurso de criação de perfil de thread tem considerações adicionais.
Ao usar a criação de perfil de encadeamento com o agente Java, esteja ciente do seguinte.
Java agent
Thread profiler notes
As configurações da árvore mostram apenas a categoria Other
Todos os tópicos são colocados na categoria Other . As categorias Web Request e Background não são suportadas.
Ao usar a criação de perfil de thread com o agente do .NET framework , esteja ciente do seguinte.
.NET agent
Thread profiler notes
Suportado em Linux
A criação de perfil de thread em Linux é suportada no aplicativo .NET Core 3.0 ou posterior ao executar o agente .NET versão 8.23 ou posterior.
Somente threads gerenciados
Para o agente .NET, o thread profiler captura apenas o rastreamento de pilha em threads gerenciados. Ele não captura rastreamento de pilha em threads não gerenciados. Se ocorrer uma chamada para uma função não gerenciada em um encadeamento gerenciado, o profiler de encadeamento mostrará Native:Function Call na árvore de chamadas.
Sem números de linha
Um perfil de thread .NET não inclui números de linha na árvore de chamadas. A caixa de seleção Show line numbers nas configurações da árvore não tem nenhum efeito.
Bug com .NET CLR v4.0 de 64 bits
Há um bug no Common Language Runtime (CLR) do .NET versão 4.0 de 64 bits que interfere na capacidade do agente de recuperar o rastreamento de pilha gerenciado. Se seu aplicativo apresentar esse bug, o APM mostrará perfis de thread vazios. Este bug não afeta o aplicativo de 32 bits.
O bug foi corrigido nas versões CLR para .NET 4.5. Para verificar se seu aplicativo de 64 bits tem a versão fixa, consulte a versão completa do mscorlib.dll no diretório C:\Windows\Microsoft.NET\Framework64\v4.0.30319 . A correção está nas versões 4.0.30319.17379 ou superior.
Other apenas categoria
Todos os tópicos são colocados na categoria Other . As categorias Web Request e Background não são suportadas.
Ao usar a criação de perfil de thread com o agente Python, esteja ciente do seguinte.
Python agent
Thread profiler notes
Sistemas baseados em co-rotina
Há limites para capturar detalhes quando um sistema baseado em co-rotina está sendo usado, como os modos gevent ou eventlet do gunicorn. Se estiver criando um novo thread, o agente Python criará, na verdade, um greenlet em vez de um thread profiler perfil de thread. Portanto, o thread profiler não capturará nenhuma solicitação da web e transação em segundo plano na página do thread profiler.
Verduras
Um greenlet pode ser executado somente quando outros greenlets cederem explicitamente o controle, como quando eles bloqueiam. Por exemplo, se o amostrador de threads for executado, ele apenas fará uma amostragem da stack para outros greenlets em um ponto onde eles estão bloqueados. Ele não irá amostrá-los quando estiverem executando código arbitrário. Ele pode perder completamente a execução dentro de um greenlet se nunca for bloqueado ou ceder a outro greenlet.
Tempo no código Python
O tempo gasto em código Python puro que não bloqueia solicitações não será coletado e nenhuma informação será registrada ou relatada. Isso ocorre porque os resultados são enganosos quando co-rotinas são usadas.
Ao usar a criação de perfil de thread com o agente Ruby, esteja ciente do seguinte.
Ruby agent
Thread profiler notes
Retrocessos
O profiler de thread depende da capacidade de capturar backtraces de thread de dentro de seu aplicativo Ruby. Por esse motivo, requer CRuby 1.9.2 or higher (para o método Thread#backtrace ).
Resque
O agente Ruby atualmente não oferece suporte a perfis de thread com trabalhos em segundo plano do Resque. Uma sessão de criação de perfil de thread iniciada no Resque capturará apenas o rastreamento do processo pai, não dos processos de trabalho.
JRuby
O suporte JRuby é considerado experimental neste momento. Existem problemas conhecidos com a implementação Thread#backtrace do JRuby que afetarão a precisão e a confiabilidade dos backtraces coletados no JRuby.