Como alterar o tamanho máximo da memória do Elasticsearch

99

Eu tenho um servidor Apache com uma configuração padrão de Elasticsearch e tudo funciona perfeitamente, exceto que a configuração padrão tem um tamanho máximo de 1 GB.

Não tenho um número tão grande de documentos para armazenar no Elasticsearch, então quero reduzir a memória.

Eu vi que tenho que mudar o -Xmxparâmetro na configuração do Java, mas não sei como.

Eu vi que posso executar isso:

bin/ElasticSearch -Xmx=2G -Xms=2G

Mas quando eu tiver que reiniciar o Elasticsearch, isso será perdido.

É possível alterar o uso máximo de memória quando Elasticsearch é instalado como um serviço?

Patxi1980
fonte
Qual sistema operacional e versão? Versão do Elasticsearch? Como você instalou o Elasticsearch?
James Addison
1
Você pode querer diminuir o número de réplicas e fragmentos, uma vez que não há nenhuma vantagem em tê-los em uma configuração de 1 nó, adicione isso a /etc/elasticsearch/elasticsearch.yaml: index.number_of_shards: 1 index.number_of_replicas: 0 Desta forma, você economiza memória e CPU por não fazer trabalho desnecessário .
neo112

Respostas:

127

Em ElasticSearch> = 5, a documentação mudou , o que significa que nenhuma das respostas acima funcionou para mim.

Tentei mudar ES_HEAP_SIZEdentro /etc/default/elasticsearche dentro etc/init.d/elasticsearch, mas quando executei ps aux | grep elasticsearcha saída ainda mostrava:

/usr/bin/java -Xms2g -Xmx2g # aka 2G min and max ram

Tive que fazer essas mudanças em:

/etc/elasticsearch/jvm.options

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms1g 
-Xmx1g 
# the settings shipped with ES 5 were: -Xms2g
# the settings shipped with ES 5 were: -Xmx2g
BigRon
fonte
3
E para Elasticsearch 5.2 no Mac OS 10.12 eu encontrei este arquivo em/usr/local/opt/elasticsearch/libexec/config/jvm.options
victorpolko
1
Posso confirmar que isso funciona para a instância aws ami (instalada com RPM), mas primeiro defina MAX_LOCKED_MEMORY = ilimitado em / etc / sysconfig / elasticsearch e bootstrap.memory_lock: true em /etc/elasticsearch/elasticsearch.yml
mork
2
Isso não funciona no Windows - a resposta correta está aqui: stackoverflow.com/questions/28798845/…
cbp
4
Para instalações de homebrew, o arquivo está aqui:/usr/local/etc/elasticsearch/jvm.options
Milovan Zogovic
117

Atualizado em 24 de novembro de 2016 : Elasticsearch 5 aparentemente mudou a maneira de configurar o JVM. Veja esta resposta aqui . A resposta abaixo ainda se aplica às versões <5.

tirdadc, obrigado por apontar isso em seu comentário abaixo.


Eu tenho uma página pastebin que compartilho com outras pessoas quando me pergunto sobre memória e ES. Funcionou bem para mim: http://pastebin.com/mNUGQCLY . Vou colar o conteúdo aqui também:

Referências:

https://github.com/grigorescu/Brownian/wiki/ElasticSearch-Configuration http://www.elasticsearch.org/guide/reference/setup/installation/

Edite os arquivos a seguir para modificar os limites de memória e número de arquivos. Estas instruções presumem que o Ubuntu 10.04 pode funcionar em versões posteriores e outras distribuições / sistemas operacionais. ( Editar : isso também funciona para o Ubuntu 14.04.)

/etc/security/limits.conf :

elasticsearch - nofile 65535
elasticsearch - memlock unlimited

/ etc / default / elasticsearch (no CentOS / RH: / etc / sysconfig / elasticsearch) :

ES_HEAP_SIZE=512m
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited

/etc/elasticsearch/elasticsearch.yml :

bootstrap.mlockall: true
James Addison
fonte
4
Este parece ser bom. Também tenho o seguinte conselho sobre como determinar o que ES_HEAP_SIZE deve ser: A regra geral é que o heap ElasticSearch deve ter cerca de 50% da memória disponível na máquina. ElasticSearch usa caches de sistema pesadamente, então você deve deixar memória suficiente para eles. (de asquera.de/opensource/2012/11/25/… )
Tom
17
No CentOS, vejo as configurações que você mencionou /etc/defaultem `/ etc / sysconfig '
Nishant
5
No CentOS /etc/sysconfig/elasticsearché o local apropriado para fazer essas alterações. O RPM também fornece uma versão padrão desse arquivo.
slm de
5
Isso não é mais aplicável para Elasticsearch 5, você precisa desta resposta .
tirdadc
2
Parece bom, mas eu coloquei meus limites especificamente para o usuário do /etc/security/limits.d/elasticsearch.conf
elasticsearch
26

Para quem deseja fazer isso no Centos 7 ou com outro sistema executando o SystemD, você pode alterá-lo em

/etc/sysconfig/elasticsearch 

Remova o comentário da linha ES_HEAP_SIZE e defina um valor, por exemplo:

# Heap Size (defaults to 256m min, 1g max)
ES_HEAP_SIZE=16g

(Ignore o comentário sobre 1g no máximo - esse é o padrão)


fonte
Devo acrescentar: tentei a abordagem acima no ES 1.7 no CentOS 7, e não teve efeito
Jonesome Reintegrar Monica
1
@Jonesome não tem certeza do que posso sugerir - estou executando o ES 1.7.1 do pacote ES RPM no CentOS 7 e esse é o caminho em que este arquivo existe, e a alteração de ES_HEAP_SIZE funciona conforme o planejado.
9

Instruções para ubuntu 14.04:

sudo vim /etc/init.d/elasticsearch

Conjunto

ES_HEAP_SIZE=512m

então em:

sudo vim /etc/elasticsearch/elasticsearch.yml

Conjunto:

bootstrap.memory_lock: true

Existem comentários nos arquivos para mais informações

Stephen
fonte
9

As respostas anteriores foram insuficientes no meu caso, provavelmente porque estou no Debian 8, embora tenham sido encaminhadas para alguma distribuição anterior.

No Debian 8, modifique o script de serviço normalmente colocado em /usr/lib/systemd/system/elasticsearch.servicee adicione Environment=ES_HEAP_SIZE=8G logo abaixo das outras linhas "Environment = *".

Agora recarregue o script de serviço com systemctl daemon-reloade reinicie o serviço. O trabalho deve ser feito!

Claudod
fonte
1
obrigado, você salva meu dia! sim, este é o procedimento correto para Debian 8
rápido 2b
Não há outro lugar para configurar isso, mas para alterar um arquivo /usr/?
Martin Schröder
6

Se você usar o wrapper de serviço fornecido no repositório Github do Elasticsearch, encontrado em https://github.com/elasticsearch/elasticsearch-servicewrapper , o arquivo conf em elasticsearch-servicewrapper / service / elasticsearch.conf controla as configurações de memória. No topo de elasticsearch.conf está um parâmetro:

set.default.ES_HEAP_SIZE=1024

Apenas reduza este parâmetro, digamos "set.default.ES_HEAP_SIZE = 512", para reduzir a memória alocada do Elasticsearch.

Observe que se você usar o elasticsearch-wrapper, o ES_HEAP_SIZE fornecido em elasticsearch.conf SUBSTITUI TODAS AS OUTRAS CONFIGURAÇÕES. Isso me levou um pouco para descobrir, já que a partir da documentação, parecia que a memória heap poderia ser configurada em elasticsearch.yml.

Se suas configurações de wrapper de serviço estiverem definidas em outro lugar, como em / etc / default / elasticsearch como no exemplo de James, defina ES_HEAP_SIZE lá.

Scott Rice
fonte
2
e se você não tiver nenhum serviço? (ou seja, basta executar bin / elasticsearch -d)
Henley Chiu
@HenleyChiu então apenas defina a variável de ambiente ES_HEAP_SIZE antes de executá-la. isto éexport ES_HEAP_SIZE=1G; bin/elasticsearch -d
Andrey Regentov
No estoque elasticsearch.conf do ES 1.7.x (aquele instalado pelo rpm no CentOS), não há set.default. Esta abordagem funciona no ES 1.7?
Jonesome Reintegrar Monica
A resposta acima é enganosa. Defina ES_HEAP_SIZE em / etc / sysconfig /
elasticsearch
6

Se você instalou o ES usando os pacotes RPM / DEB fornecidos (como você parece ter feito), você pode ajustar isso editando o script init ( /etc/init.d/elasticsearch on RHEL/CentOS). Se você der uma olhada no arquivo, verá um bloco com o seguinte:

export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS
export JAVA_HOME

Para ajustar o tamanho, basta alterar a ES_HEAP_SIZElinha para o seguinte:

export ES_HEAP_SIZE=xM/xG

(onde x é o número de MB / GB de RAM que você gostaria de alocar)

Exemplo:

export ES_HEAP_SIZE=1G

Alocaria 1 GB.

Depois de editar o script, salve e saia e reinicie o serviço. Você pode verificar se ele foi configurado corretamente executando o seguinte:

ps aux | grep elasticsearch

E verificando os sinalizadores -Xms e -Xmx no processo java que retorna:

/usr/bin/java -Xms1G -Xmx1G

Espero que isto ajude :)

gl1tchh
fonte
1
Não faça assim. Este não é um bom lugar para fazer esses tipos de alterações. Este é um hack gigante! Pode funcionar, mas será potencialmente destruído sempre que o ES for atualizado.
slm de
1
Devo acrescentar: tentei a abordagem acima no ES 1.7 no CentOS 7 e não teve efeito.
Jonesome Reintegrar Monica
3
  • Elasticsearch atribuirá todo o heap especificado em jvm.options por meio das configurações de Xms (tamanho mínimo de heap) e Xmx (tamanho máximo de heap).
    • -Xmx12g
    • -Xmx12g
  • Defina o tamanho mínimo de heap (Xms) e o tamanho máximo de heap (Xmx) para que sejam iguais.
  • Não defina o Xmx acima do corte que a JVM usa para ponteiros de objetos compactados (ops compactados), o corte exato varia, mas está próximo a 32 GB.

  • Também é possível definir o tamanho do heap por meio de uma variável de ambiente

    • ES_JAVA_OPTS = "- Xms2g -Xmx2g" ./bin/elasticsearch
    • ES_JAVA_OPTS = "- Xms4000m -Xmx4000m" ./bin/elasticsearch
Satyendra Sharma
fonte
Também não mais que 50% da RAM física
Achi Even-dar
Olá, como eu defino a variável de ambiente como este. O nome da variável é ES_JAVA_OPTS e o valor: "-Xms2g -Xmx2g" ./bin/elasticsearch like
Manikandan
Além disso, como eu confirmo, o tamanho do heap foi atualizado corretamente
Manikandan
2

No diretório inicial do caminho do elasticsearch, ou seja /usr/share/elasticsearch, normalmente , há um arquivo de configuração bin/elasticsearch.in.sh. Editar parâmetro ES_MIN_MEM, ES_MAX_MEMneste arquivo para alterar -Xms2g, -Xmx4grespectivamente. E certifique-se de ter reiniciado o nó após esta mudança de configuração.

Amit Sharma
fonte
1

Se você usar o Windows Server, poderá alterar a Variável de Ambiente, reiniciar o servidor para aplicar o novo Valor de Ambiente e iniciar o Elastic Service. Mais detalhes em Instalar Elastic no Windows Server

Thoai Ngo
fonte
1

Em elasticsearch 2.x:

vi /etc/sysconfig/elasticsearch 

Vá para o bloco de código

# Heap size defaults to 256m min, 1g max
# Set ES_HEAP_SIZE to 50% of available RAM, but no more than 31g
#ES_HEAP_SIZE=2g

Remova o comentário da última linha como

ES_HEAP_SIZE=2g
Ankush
fonte