Circuit breaker para instrumentação Java personalizada
O agente Java da New Relic inclui um circuit breaker que protege o aplicativo dos efeitos do excesso de instrumentação. Quando o circuit breaker detecta sintomas precoces de exaustão de memória, ele automaticamente “desarma” e limita a instrumentação. O agente para de coletar dados de transação até que o circuit breaker seja reinicializado automaticamente após decidir que a redefinição é segura.
O circuit breaker leva em consideração dois parâmetros (uso do heap e tempo gasto na coleta de lixo) para determinar quando deve desarmar. Os valores padrão para esses limites são porcentagens:
Limite de memória: 20%
Limite de CPU para coleta de lixo: 10%
Quando a porcentagem de memória heap livre for menor que memory_threshold e o tempo de CPU gasto na coleta de lixo for maior que gc_cpu_threshold, o circuit breaker . Quando o circuit breaker , o agente para de coletar dados de transação. as taxas de transferência informadas na interface serão subnotificadas e você não verá nenhum vestígio da transação por um período de tempo.
Razões para esgotamento da memória
O circuit breaker quando detecta sinais de esgotamento da memória. Isso pode acontecer por vários motivos:
Seu aplicativo mostra sinais precoces de esgotamento de memória devido à instrumentação personalizada recentemente implantada (usando XML, chamada de API, anotações trace ou o editor de instrumentação personalizada do agente Java) ou devido à instrumentação integrada.
Seu aplicativo sofreu um pico de carga e mostrou sinais de esgotamento de memória. Nesse caso, o agente não está contribuindo para o pico, mas o circuit breaker pode ajudar a conservar recursos e garantir que o agente não contribua para OutOfMemoryErrors.
Seu aplicativo está ajustado para ser executado próximo ao limite de memória.
Resolução de problemas
Se o circuit breaker , tente estas dicas de resolução de problemas.
Use a tabela Top methods by call count na página do circuit breaker Events para encontrar métodos que possam estar superinstrumentados. Identifique e desative a instrumentação personalizada.
Em geral, o uso de memória do agente é proporcional à contagem de chamadas de um método. A instrumentação personalizada deve ser usada em métodos que são chamados no máximo dez vezes por transação. Se a instrumentação estiver integrada ao agente, revise a documentação de instrumentação personalizada da New Relic para Java. Se precisar de ajuda adicional, obtenha suporte em support.newrelic.com.
Revise cuidadosamente o histórico de uso de memória do seu aplicativo e determine se é necessário aumentar o tamanho máximo de heap Java.
Se o seu aplicativo estiver se comportando conforme o esperado, você pode desabilitar o circuit breaker. Para desativar o circuit breaker, adicione enabled: false na seção circuitbreaker no arquivo de configuração newrelic.yml:
common:&default_settings
circuitbreaker:
enabled:false
Para detectar sinais precoces de esgotamento da memória, o circuit breaker utiliza uma fórmula com duas variáveis: memory_threshold e gc_cpu_threshold. Quando a porcentagem de memória heap livre for menor que memory_threshold e o tempo de CPU gasto na coleta de lixo for maior que gc_cpu_threshold, o circuit breaker . Ajuste esses valores conforme necessário, com base no desempenho operacional e no comportamento do seu aplicativo.
Para obter detalhes de configuração, consulte memory_threshold e gc_cpu_threshold.