Cómo cambiar el tamaño máximo de memoria de Elasticsearch

99

Tengo un servidor Apache con una configuración predeterminada de Elasticsearch y todo funciona perfectamente, excepto que la configuración predeterminada tiene un tamaño máximo de 1GB.

No tengo tantos documentos para almacenar en Elasticsearch, así que quiero reducir la memoria.

He visto que tengo que cambiar el -Xmxparámetro en la configuración de Java, pero no sé cómo.

He visto que puedo ejecutar esto:

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

Pero cuando tenga que reiniciar Elasticsearch, esto se perderá.

¿Es posible cambiar el uso máximo de memoria cuando Elasticsearch está instalado como servicio?

Patxi1980
fuente
¿Qué sistema operativo y versión? ¿Versión de Elasticsearch? ¿Cómo instalaste Elasticsearch?
James Addison
1
Es posible que desee reducir la cantidad de réplicas y fragmentos, ya que no hay ventajas de tenerlos en una configuración de 1 nodo, agregue esto a /etc/elasticsearch/elasticsearch.yaml: De index.number_of_shards: 1 index.number_of_replicas: 0 esta manera, ahorra en memoria y CPU al no hacer un trabajo innecesario .
neo112

Respuestas:

127

En ElasticSearch> = 5, la documentación ha cambiado , lo que significa que ninguna de las respuestas anteriores funcionó para mí.

Intenté cambiar ES_HEAP_SIZEde entrada /etc/default/elasticsearchy de entrada etc/init.d/elasticsearch, pero cuando ejecuté ps aux | grep elasticsearchla salida todavía mostraba:

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

Tuve que hacer estos cambios en:

/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
fuente
3
Y para Elasticsearch 5.2 en Mac OS 10.12 encontré este archivo en/usr/local/opt/elasticsearch/libexec/config/jvm.options
victorpolko
1
Puedo confirmar que esto funciona para la instancia de aws ami (instalada con RPM), pero primero configure MAX_LOCKED_MEMORY = ilimitado en / etc / sysconfig / elasticsearch y bootstrap.memory_lock: true en /etc/elasticsearch/elasticsearch.yml
mork
2
Esto no funciona en Windows; la respuesta correcta está aquí: stackoverflow.com/questions/28798845/…
cbp
4
Para instalaciones /usr/local/etc/elasticsearch/jvm.options
caseras
117

Actualizado el 24 de noviembre de 2016 : Elasticsearch 5 aparentemente ha cambiado la forma de configurar la JVM. Vea esta respuesta aquí . La respuesta a continuación todavía se aplica a las versiones <5.

tirdadc, gracias por señalar esto en su comentario a continuación.


Tengo una página de pastebin que comparto con otros cuando me pregunto sobre la memoria y ES. Me ha funcionado bien: http://pastebin.com/mNUGQCLY . Pegaré el contenido aquí también:

Referencias:

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

Edite los siguientes archivos para modificar la memoria y los límites de número de archivo. Estas instrucciones asumen Ubuntu 10.04, pueden funcionar en versiones posteriores y otras distribuciones / sistemas operativos. ( Editar : esto también funciona para Ubuntu 14.04).

/etc/security/limits.conf :

elasticsearch - nofile 65535
elasticsearch - memlock unlimited

/ etc / default / elasticsearch (en 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
fuente
4
Esto luce bien. También tengo el siguiente consejo sobre cómo determinar cuál debería ser ES_HEAP_SIZE: La regla general es que el montón de ElasticSearch debe tener alrededor del 50% de la memoria disponible en la máquina. ElasticSearch utiliza mucho los cachés del sistema, por lo que debe dejar suficiente memoria para ellos. (de asquera.de/opensource/2012/11/25/… )
Tom
17
En CentOS, veo que las configuraciones que mencionaste debajo se /etc/defaultencuentran en `/ etc / sysconfig '
Nishant
5
En CentOS /etc/sysconfig/elasticsearches el lugar apropiado para realizar estos cambios. El RPM incluso proporciona una versión predeterminada de este archivo allí también.
slm
5
Esto ya no es aplicable para Elasticsearch 5, necesita esta respuesta .
tirdadc
2
Esto se ve bien, pero puse mis límites específicamente para el usuario de /etc/security/limits.d/elasticsearch.conf
elasticsearch
26

Para cualquiera que busque hacer esto en Centos 7 o con otro sistema que ejecute SystemD, lo cambia en

/etc/sysconfig/elasticsearch 

Descomente la línea ES_HEAP_SIZE y establezca un valor, por ejemplo:

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

(Ignore el comentario sobre 1g máx., Ese es el valor predeterminado)


fuente
Debo agregar: probé el enfoque anterior en ES 1.7 en CentOS 7, y no tuvo ningún efecto
Jonesome Reinstate Monica
1
@Jonesome no estoy seguro de lo que puedo sugerir: estoy ejecutando ES 1.7.1 desde el paquete ES RPM en CentOS 7 y esa es la ruta en la que existe este archivo, y cambiar ES_HEAP_SIZE funciona según lo previsto.
9

Instrucciones para ubuntu 14.04:

sudo vim /etc/init.d/elasticsearch

Conjunto

ES_HEAP_SIZE=512m

luego en:

sudo vim /etc/elasticsearch/elasticsearch.yml

Conjunto:

bootstrap.memory_lock: true

Hay comentarios en los archivos para obtener más información.

Stephen
fuente
9

Las respuestas anteriores fueron insuficientes en mi caso, probablemente porque estoy en Debian 8, mientras que se referían a alguna distribución anterior.

En Debian 8, modifique el script de servicio que normalmente se coloca /usr/lib/systemd/system/elasticsearch.servicey agregue Environment=ES_HEAP_SIZE=8G justo debajo de las otras líneas "Environment = *".

Ahora vuelva a cargar el script de servicio systemctl daemon-reloady reinicie el servicio. ¡El trabajo debería estar hecho!

claudo
fuente
1
gracias, salvas mi dia! sí, este es el procedimiento correcto para Debian 8
rápido2b
¿No hay otro lugar para configurar esto que para cambiar un archivo /usr/?
Martin Schröder
6

Si utiliza el contenedor de servicios proporcionado en el repositorio Github de Elasticsearch, que se encuentra en https://github.com/elasticsearch/elasticsearch-servicewrapper , entonces el archivo conf en elasticsearch-servicewrapper / service / elasticsearch.conf controla la configuración de la memoria. En la parte superior de elasticsearch.conf hay un parámetro:

set.default.ES_HEAP_SIZE=1024

Simplemente reduzca este parámetro, digamos "set.default.ES_HEAP_SIZE = 512", para reducir la memoria asignada de Elasticsearch.

Tenga en cuenta que si utiliza elasticsearch-wrapper, ES_HEAP_SIZE proporcionado en elasticsearch.conf ANULA TODAS LAS DEMÁS CONFIGURACIONES. Esto me tomó un poco entender, ya que a partir de la documentación, parecía que la memoria del montón se podía configurar desde elasticsearch.yml.

Si la configuración de su contenedor de servicio se establece en otro lugar, como en / etc / default / elasticsearch como en el ejemplo de James, entonces configure ES_HEAP_SIZE allí.

Scott Rice
fuente
2
¿Qué pasa si no tienes ningún servicio? (es decir, ejecute bin / elasticsearch -d)
Henley Chiu
@HenleyChiu luego simplemente configure la variable de entorno ES_HEAP_SIZE antes de ejecutarla. es decirexport ES_HEAP_SIZE=1G; bin/elasticsearch -d
Andrey Regentov
En el archivo elasticsearch.conf de ES 1.7.x (el que instaló rpm en CentOS), no hay set.default en absoluto. ¿Funciona este enfoque en ES 1.7?
Jonesome reinstala a Monica
La respuesta anterior es engañosa. Establecer ES_HEAP_SIZE en / etc / sysconfig /
elasticsearch
6

Si instaló ES usando los paquetes RPM / DEB como se proporcionan (como parece que lo hizo), puede ajustar esto editando el script de inicio ( /etc/init.d/elasticsearch on RHEL/CentOS). Si echa un vistazo al archivo, verá un bloque con lo siguiente:

export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS
export JAVA_HOME

Para ajustar el tamaño, simplemente cambie la ES_HEAP_SIZElínea a lo siguiente:

export ES_HEAP_SIZE=xM/xG

(donde x es la cantidad de MB / GB de RAM que le gustaría asignar)

Ejemplo:

export ES_HEAP_SIZE=1G

Asignaría 1GB.

Una vez que haya editado el script, guarde y salga, luego reinicie el servicio. Puede comprobar si se ha configurado correctamente ejecutando lo siguiente:

ps aux | grep elasticsearch

Y verificando los indicadores -Xms y -Xmx en el proceso de Java que devuelve:

/usr/bin/java -Xms1G -Xmx1G

Espero que esto ayude :)

gl1tchh
fuente
1
No lo hagas de esta manera. Este no es un buen lugar para realizar este tipo de cambios. ¡Este es un truco gigante! Podría funcionar, pero se destruirá potencialmente cada vez que se actualice ES.
slm
1
Debo agregar: probé el enfoque anterior en ES 1.7 en CentOS 7 y no tuvo ningún efecto.
Jonesome reinstala a Monica
3
  • Elasticsearch asignará el montón completo especificado en jvm.options a través de la configuración de Xms (tamaño de montón mínimo) y Xmx (tamaño de montón máximo).
    • -Xmx12g
    • -Xmx12g
  • Establezca el tamaño de pila mínimo (Xms) y el tamaño de pila máximo (Xmx) para que sean iguales entre sí.
  • No establezca Xmx por encima del límite que utiliza la JVM para los punteros de objetos comprimidos (oops comprimidos), el límite exacto varía pero está cerca de 32 GB.

  • También es posible establecer el tamaño del montón a través de una variable de entorno

    • ES_JAVA_OPTS = "- Xms2g -Xmx2g" ./bin/elasticsearch
    • ES_JAVA_OPTS = "- Xms4000m -Xmx4000m" ./bin/elasticsearch
Satyendra Sharma
fuente
Además, no más del 50% de la RAM física
Achi Even-dar
Hola, cómo configuro una variable de entorno como esta. El nombre de la variable es ES_JAVA_OPTS y el valor: "-Xms2g -Xmx2g" ./bin/elasticsearch like
Manikandan
También cómo confirmo, el tamaño del montón se actualizó correctamente
Manikandan
2

En el directorio de inicio de la ruta de búsqueda elástica, es decir /usr/share/elasticsearch, normalmente , hay un archivo de configuración bin/elasticsearch.in.sh. Editar parámetro ES_MIN_MEM, ES_MAX_MEMen este archivo para cambiar -Xms2g, -Xmx4grespectivamente. Y asegúrese de haber reiniciado el nodo después de este cambio de configuración.

Amit Sharma
fuente
1

Si usa Windows Server, puede cambiar la variable de entorno, reiniciar el servidor para aplicar un nuevo valor de entorno e iniciar Elastic Service. Más detalles en Instalar Elastic en Windows Server

Thoai Ngo
fuente
1

En elasticsearch 2.x:

vi /etc/sysconfig/elasticsearch 

Ir al bloque 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

Descomentar la última línea como

ES_HEAP_SIZE=2g
Ankush
fuente