Comment modifier la taille de mémoire maximale d'Elasticsearch

99

J'ai un serveur Apache avec une configuration par défaut d'Elasticsearch et tout fonctionne parfaitement, sauf que la configuration par défaut a une taille maximale de 1 Go.

Je n'ai pas un si grand nombre de documents à stocker dans Elasticsearch, je souhaite donc réduire la mémoire.

J'ai vu que je devais changer le -Xmxparamètre dans la configuration Java, mais je ne sais pas comment.

J'ai vu que je peux exécuter ceci:

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

Mais lorsque je devrai redémarrer Elasticsearch, cela sera perdu.

Est-il possible de modifier l'utilisation maximale de la mémoire lorsque Elasticsearch est installé en tant que service?

Patxi1980
la source
Quel système d'exploitation et quelle version? Version Elasticsearch? Comment avez-vous installé Elasticsearch?
James Addison
1
Vous voudrez peut-être réduire le nombre de répliques et de fragments car il n'y a aucun avantage à les avoir sur une configuration à 1 nœud, ajoutez ceci à /etc/elasticsearch/elasticsearch.yaml: De index.number_of_shards: 1 index.number_of_replicas: 0 cette façon, vous économisez de la mémoire et du processeur en ne faisant pas de travail inutile .
neo112 le

Réponses:

127

Dans ElasticSearch> = 5, la documentation a changé , ce qui signifie qu'aucune des réponses ci-dessus n'a fonctionné pour moi.

J'ai essayé de changer ES_HEAP_SIZEdans /etc/default/elasticsearchet etc/init.d/elasticsearch, mais quand j'ai couru ps aux | grep elasticsearchla sortie montré encore:

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

J'ai dû faire ces changements dans:

/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
la source
3
Et pour Elasticsearch 5.2 sur Mac OS 10.12, j'ai trouvé ce fichier dans/usr/local/opt/elasticsearch/libexec/config/jvm.options
victorpolko
1
Je peux confirmer que cela fonctionne pour l'instance aws ami (installée avec RPM), mais commencez par définir MAX_LOCKED_MEMORY = unlimited dans / etc / sysconfig / elasticsearch et bootstrap.memory_lock: true dans /etc/elasticsearch/elasticsearch.yml
mork
2
Cela ne fonctionne pas sous Windows - la bonne réponse est ici: stackoverflow.com/questions/28798845/…
cbp
4
Pour les installations homebrew, le fichier est ici:/usr/local/etc/elasticsearch/jvm.options
Milovan Zogovic
117

Mise à jour le 24 novembre 2016 : Elasticsearch 5 a apparemment changé la façon de configurer la JVM. Voir cette réponse ici . La réponse ci-dessous s'applique toujours aux versions <5.

tirdadc, merci de le signaler dans votre commentaire ci-dessous.


J'ai une page pastebin que je partage avec les autres lorsque je m'interroge sur la mémoire et ES. Cela a bien fonctionné pour moi: http://pastebin.com/mNUGQCLY . Je vais également coller le contenu ici:

Références:

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

Modifiez les fichiers suivants pour modifier les limites de mémoire et de nombre de fichiers. Ces instructions supposent qu'Ubuntu 10.04 peut fonctionner sur des versions ultérieures et d'autres distributions / OS. ( Modifier : cela fonctionne également pour Ubuntu 14.04.)

/etc/security/limits.conf :

elasticsearch - nofile 65535
elasticsearch - memlock unlimited

/ etc / default / elasticsearch (sur 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
la source
4
Cela semble bon. J'ai également les conseils suivants pour déterminer ce que ES_HEAP_SIZE devrait être: La règle de base est que le tas ElasticSearch doit avoir environ 50% de la mémoire disponible sur la machine. ElasticSearch utilise fortement les caches système, vous devez donc leur laisser suffisamment de mémoire. (d'après asquera.de/opensource/2012/11/25/… )
Tom
17
Dans CentOS, je vois les configurations que vous avez mentionnées sous se /etc/defaulttrouve sous `/ etc / sysconfig '
Nishant
5
Sur CentOS /etc/sysconfig/elasticsearchest l'endroit approprié pour effectuer ces changements. Le RPM fournit même une version par défaut de ce fichier là aussi.
slm
5
Cela n'est plus applicable pour Elasticsearch 5, vous avez besoin de cette réponse .
tirdadc
2
Cela semble bon, mais je mets mes limites spécifiquement pour l'utilisateur /etc/security/limits.d/elasticsearch.conf
elasticsearch
26

Pour ceux qui cherchent à le faire sur Centos 7 ou avec un autre système exécutant SystemD, vous le modifiez

/etc/sysconfig/elasticsearch 

Décommentez la ligne ES_HEAP_SIZE et définissez une valeur, par exemple:

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

(Ignorez le commentaire sur 1g max - c'est la valeur par défaut)


la source
Je devrais ajouter: j'ai essayé l'approche ci-dessus sur ES 1.7 sur CentOS 7, et cela n'a eu aucun effet
Jonesome Reinstate Monica
1
@Jonesome ne sait pas ce que je peux suggérer - J'exécute ES 1.7.1 à partir du package ES RPM sur CentOS 7 et c'est le chemin dans lequel ce fichier existe, et la modification de ES_HEAP_SIZE fonctionne comme prévu.
9

Instructions pour ubuntu 14.04:

sudo vim /etc/init.d/elasticsearch

Ensemble

ES_HEAP_SIZE=512m

puis dans:

sudo vim /etc/elasticsearch/elasticsearch.yml

Ensemble:

bootstrap.memory_lock: true

Il y a des commentaires dans les fichiers pour plus d'informations

Stephen
la source
9

Les réponses précédentes étaient insuffisantes dans mon cas, probablement parce que je suis sur Debian 8, alors qu'elles faisaient référence à une distribution précédente.

Sur Debian 8, modifiez le script de service normalement placé dans /usr/lib/systemd/system/elasticsearch.service, et ajoutez Environment=ES_HEAP_SIZE=8G juste en dessous des autres lignes "Environment = *".

Maintenant, rechargez le script de service avec systemctl daemon-reloadet redémarrez le service. Le travail doit être fait!

Claudod
la source
1
merci, vous sauvez ma journée! oui, c'est la bonne procédure pour Debian 8
rapide2b
N'y a-t-il pas d'autre endroit pour configurer cela que pour modifier un fichier /usr/?
Martin Schröder
6

Si vous utilisez le wrapper de service fourni dans le référentiel Github d'Elasticsearch, disponible à l' adresse https://github.com/elasticsearch/elasticsearch-servicewrapper , le fichier conf dans elasticsearch-servicewrapper / service / elasticsearch.conf contrôle les paramètres de mémoire. En haut de elasticsearch.conf se trouve un paramètre:

set.default.ES_HEAP_SIZE=1024

Réduisez simplement ce paramètre, par exemple "set.default.ES_HEAP_SIZE = 512", pour réduire la mémoire allouée à Elasticsearch.

Notez que si vous utilisez le wrapper elasticsearch, le ES_HEAP_SIZE fourni dans elasticsearch.conf REMPLACE TOUS LES AUTRES PARAMÈTRES. Cela m'a pris un peu de temps à comprendre, car d'après la documentation, il semblait que la mémoire du tas pouvait être définie à partir de elasticsearch.yml.

Si les paramètres de votre wrapper de service sont définis ailleurs, comme dans / etc / default / elasticsearch comme dans l'exemple de James, définissez-y ES_HEAP_SIZE.

Scott Rice
la source
2
Et si vous n'avez aucun service du tout? (c'est-à-dire exécutez simplement bin / elasticsearch -d)
Henley Chiu
@HenleyChiu puis définissez simplement la variable d'environnement ES_HEAP_SIZE avant de l'exécuter. ieexport ES_HEAP_SIZE=1G; bin/elasticsearch -d
Andrey Regentov
Dans le stock elasticsearch.conf ES 1.7.x (celui installé par le rpm sur CentOS), il n'y a pas du tout de set.default. Cette approche fonctionne-t-elle avec ES 1.7?
Jonesome réintègre Monica
La réponse ci-dessus est trompeuse. Définissez ES_HEAP_SIZE dans / etc / sysconfig /
elasticsearch
6

Si vous avez installé ES en utilisant les packages RPM / DEB fournis (comme vous semblez l'avoir fait), vous pouvez ajuster cela en éditant le script init ( /etc/init.d/elasticsearch on RHEL/CentOS). Si vous regardez dans le fichier, vous verrez un bloc avec les éléments suivants:

export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS
export JAVA_HOME

Pour ajuster la taille, changez simplement la ES_HEAP_SIZEligne comme suit:

export ES_HEAP_SIZE=xM/xG

(où x est le nombre de Mo / Go de RAM que vous souhaitez allouer)

Exemple:

export ES_HEAP_SIZE=1G

Allouerait 1 Go.

Une fois que vous avez modifié le script, enregistrez et quittez, puis redémarrez le service. Vous pouvez vérifier s'il a été correctement défini en exécutant ce qui suit:

ps aux | grep elasticsearch

Et en vérifiant les indicateurs -Xms et -Xmx dans le processus java qui retourne:

/usr/bin/java -Xms1G -Xmx1G

J'espère que cela t'aides :)

gl1tchh
la source
1
Ne fais pas ça de cette façon. Ce n'est pas un bon endroit pour effectuer ces types de changements. C'est un hack géant! Cela pourrait fonctionner, mais il sera potentiellement mis à la poubelle chaque fois que ES est mis à jour.
slm
1
Je dois ajouter: j'ai essayé l'approche ci-dessus sur ES 1.7 sur CentOS 7, et cela n'a eu aucun effet.
Jonesome réintègre Monica
3
  • Elasticsearch attribuera le tas entier spécifié dans jvm.options via les paramètres Xms (taille minimale du tas) et Xmx (taille maximale du tas).
    • -Xmx12g
    • -Xmx12g
  • Définissez la taille minimale du tas (Xms) et la taille maximale du tas (Xmx) pour qu'elles soient égales l'une à l'autre.
  • Ne définissez pas Xmx au-dessus du seuil utilisé par la JVM pour les pointeurs d'objet compressés (oups compressés), le seuil exact varie mais est proche de 32 Go.

  • Il est également possible de définir la taille du tas via une variable d'environnement

    • ES_JAVA_OPTS = "- Xms2g -Xmx2g" ./bin/elasticsearch
    • ES_JAVA_OPTS = "- Xms4000m -Xmx4000m" ./bin/elasticsearch
Satyendra Sharma
la source
Aussi pas plus de 50% de la RAM physique
Achi Even-dar
Salut Comment j'ai défini la variable d'environnement comme celle-ci. Le nom de la variable est ES_JAVA_OPTS et la valeur: "-Xms2g -Xmx2g" ./bin/elasticsearch comme
Manikandan
Aussi comment je confirme, la taille du tas correctement mise à jour
Manikandan
2

Dans elasticsearch path home dir ie typiquement /usr/share/elasticsearch, il y a un fichier de configuration bin/elasticsearch.in.sh. Modifier le paramètre ES_MIN_MEM, ES_MAX_MEMdans ce fichier à modifier -Xms2g, -Xmx4grespectivement. Et veuillez vous assurer que vous avez redémarré le nœud après ce changement de configuration.

Amit Sharma
la source
1

Si vous utilisez Windows Server, vous pouvez modifier la variable d'environnement, redémarrer le serveur pour appliquer la nouvelle valeur d'environnement et démarrer Elastic Service. Plus de détails dans Installer Elastic dans Windows Server

Thoai Ngo
la source
1

Dans elasticsearch 2.x:

vi /etc/sysconfig/elasticsearch 

Aller au bloc de code

# 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

Décommentez la dernière ligne comme

ES_HEAP_SIZE=2g
Ankush
la source