Utilização do tamanho do heap do Elasticsearch e coleta de lixo da JVM

Explorando o uso do tamanho do heap do Elasticsearch e a coleta de lixo da JVM, incluindo as melhores práticas e como resolver problemas quando o uso da memória heap está muito alto ou quando o desempenho da JVM não é ideal.

Novo no Elasticsearch? Participe do nosso webinar Introdução ao Elasticsearch. Você também pode iniciar um teste gratuito na nuvem do Elastic ou experimentar o Elastic em sua máquina agora.

O tamanho do heap é a quantidade de RAM alocada para a Máquina Virtual Java de um nó do Elasticsearch.

A partir da versão 7.11, o Elasticsearch define automaticamente, por padrão, o tamanho do heap da JVM com base nas funções e na memória total de um nó. Para a maioria dos ambientes de produção, recomenda-se o uso do dimensionamento padrão. No entanto, se você quiser definir manualmente o tamanho do heap da JVM, como regra geral, você deve definir -Xms e -Xmx com o MESMO valor, que deve ser 50% da sua RAM total disponível, sujeito a um máximo de (aproximadamente) 31 GB.

Um tamanho de heap maior dará ao seu nó mais memória para operações de indexação e pesquisa. No entanto, seu nó também requer memória para cache, portanto, usar 50% mantém um equilíbrio saudável entre os dois. Pelo mesmo motivo, em produção, você deve evitar usar outros processos que consomem muita memória no mesmo nó que o Elasticsearch.

Normalmente, a utilização da memória heap seguirá um padrão em dente de serra, oscilando entre cerca de 30 e 70% da capacidade máxima da heap. Isso ocorre porque a JVM aumenta gradualmente a porcentagem de uso do heap até que o processo de coleta de lixo libere memória novamente. O uso elevado da memória heap ocorre quando o processo de coleta de lixo não consegue acompanhar. Um indicador de alto uso da memória heap é quando a coleta de lixo é incapaz de reduzir o uso da memória heap para cerca de 30%.

Na imagem acima, você pode ver um padrão típico de dente de serra no heap da JVM.

Você também verá que existem dois tipos de coleta de lixo: coleta de lixo jovem e coleta de lixo antiga.

Em uma JVM saudável, a coleta de lixo deve idealmente atender às seguintes condições:

  • O GC jovem é processado rapidamente (em 50 ms).
  • O coletor de lixo jovem não é executado com frequência (cerca de 10 segundos).
  • O GC antigo é processado rapidamente (em menos de 1 segundo).
  • A coleta de lixo antiga não é executada com frequência (uma vez a cada 10 minutos ou mais).

Como resolver problemas quando o uso da memória heap está muito alto ou quando o desempenho da JVM não está ideal

Existem diversos motivos pelos quais o uso da memória heap pode aumentar:

Sobrefragmentação

Consulte o documento sobre sobreparticionamento aqui.

Tamanhos de agregação grandes

Para evitar tamanhos de agregação muito grandes, mantenha o número de buckets de agregação (tamanho) em suas consultas no mínimo.

Você pode usar o registro de consultas lentas (logs lentos) e implementá-lo em um índice específico usando o seguinte.

Consultas que demoram muito para retornar resultados provavelmente são as que consomem mais recursos.

Tamanho excessivo do índice de volume

Se você estiver enviando solicitações grandes, isso pode ser a causa de um alto consumo de memória heap. Tente reduzir o tamanho das solicitações de indexação em lote.

Problemas de mapeamento

Em particular, se você usar “fielddata: true”, isso pode consumir grande parte da memória heap da sua JVM.

Tamanho do heap configurado incorretamente

O tamanho do heap pode ser definido manualmente por:

Definindo a variável de ambiente:

Edite o arquivo jvm.options no diretório de configuração do Elasticsearch:

A configuração da variável de ambiente tem prioridade sobre a configuração do arquivo.

É necessário reiniciar o nó para que a configuração seja considerada.

A nova proporção da JVM foi configurada incorretamente.

Geralmente NÃO é necessário configurar isso, pois o Elasticsearch define esse valor por padrão. Este parâmetro define a proporção de espaço disponível para objetos de “nova geração” e de “geração antiga” na JVM.

Se você perceber que as coletas de lixo antigas estão se tornando muito frequentes, pode tentar definir esse valor especificamente no arquivo jvm.options no diretório de configuração do Elasticsearch.

Quais são as melhores práticas para gerenciar o uso do tamanho do heap e a coleta de lixo da JVM em um cluster Elasticsearch de grande porte?

As melhores práticas para gerenciar o uso do tamanho do heap e a coleta de lixo da JVM em um cluster Elasticsearch de grande porte consistem em garantir que o tamanho do heap seja definido para, no máximo, 50% da RAM disponível e que as configurações de coleta de lixo da JVM sejam otimizadas para o caso de uso específico. É importante monitorar o tamanho do heap e as métricas de coleta de lixo para garantir que o cluster esteja funcionando de forma otimizada. Especificamente, é importante monitorar o tamanho do heap da JVM, o tempo de coleta de lixo e as pausas na coleta de lixo. Além disso, é importante monitorar o número de ciclos de coleta de lixo e o tempo gasto nessa atividade. Ao monitorar essas métricas, é possível identificar quaisquer problemas potenciais com o tamanho do heap ou com as configurações de coleta de lixo e tomar medidas corretivas, se necessário.

Conteúdo relacionado

Pronto para criar buscas de última geração?

Uma pesquisa suficientemente avançada não se consegue apenas com o esforço de uma só pessoa. O Elasticsearch é impulsionado por cientistas de dados, especialistas em operações de aprendizado de máquina, engenheiros e muitos outros que são tão apaixonados por buscas quanto você. Vamos nos conectar e trabalhar juntos para construir a experiência de busca mágica que lhe trará os resultados desejados.

Experimente você mesmo(a)