How to change Elasticsearch max memory size
Asked Answered
V

20

137

I have an Apache server with a default configuration of Elasticsearch and everything works perfectly, except that the default configuration has a max size of 1GB.

I don't have such a large number of documents to store in Elasticsearch, so I want to reduce the memory.

I have seen that I have to change the -Xmx parameter in the Java configuration, but I don't know how.

I have seen I can execute this:

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

But when I have to restart Elasticsearch this will be lost.

Is it possible to change max memory usage when Elasticsearch is installed as a service?

Verret answered 8/8, 2013 at 17:52 Comment(2)
What operating system and version? Elasticsearch version? How did you install Elasticsearch?Floria
You might want to lower the number of replicas and shards since there is no upside of having them on a 1 node setup, add this to /etc/elasticsearch/elasticsearch.yaml: index.number_of_shards: 1 index.number_of_replicas: 0 This way you save on memory and cpu by not doing unneccessary work.Sexagenary
U
171

In ElasticSearch >= 5 the documentation has changed, which means none of the above answers worked for me.

I tried changing ES_HEAP_SIZE in /etc/default/elasticsearch and in /etc/init.d/elasticsearch, but when I ran ps aux | grep elasticsearch the output still showed:

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

I had to make these changes in:

/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
Urina answered 30/10, 2016 at 20:23 Comment(5)
And for Elasticsearch 5.2 on Mac OS 10.12 I found this file in /usr/local/opt/elasticsearch/libexec/config/jvm.optionsSpinnaker
I can confirm this works for aws ami instance (installed with RPM), but first set MAX_LOCKED_MEMORY=unlimited in /etc/sysconfig/elasticsearch and bootstrap.memory_lock: true in /etc/elasticsearch/elasticsearch.ymlAudun
This does not work in Windows - the correct answer is here: #28799345Boarding
For homebrew installs, file is in here: /usr/local/etc/elasticsearch/jvm.optionsQuenby
This works for Rocky 8 (and the entire EL8 family)Sanyu
F
117

Updated on Nov 24, 2016: Elasticsearch 5 apparently has changed the way to configure the JVM. See this answer here. The answer below still applies to versions < 5.

tirdadc, thank you for pointing this out in your comment below.


I have a pastebin page that I share with others when wondering about memory and ES. It's worked OK for me: http://pastebin.com/mNUGQCLY. I'll paste the contents here as well:

References:

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

Edit the following files to modify memory and file number limits. These instructions assume Ubuntu 10.04, may work on later versions and other distributions/OSes. (Edit: This works for Ubuntu 14.04 as well.)

/etc/security/limits.conf:

elasticsearch - nofile 65535
elasticsearch - memlock unlimited

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

ES_HEAP_SIZE=512m
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited

/etc/elasticsearch/elasticsearch.yml:

bootstrap.mlockall: true
Floria answered 9/8, 2013 at 18:7 Comment(6)
This looks good. I also have the following advice about determining what ES_HEAP_SIZE should be: The rule of thumb is that the ElasticSearch heap should have around 50% of the available memory on the machine. ElasticSearch uses system caches heavily, so you should leave enough memory for them. (from asquera.de/opensource/2012/11/25/… )Phototypy
In CentOS, I see the configs that you mentioned under /etc/default sits under `/etc/sysconfig'Emanuel
On CentOS /etc/sysconfig/elasticsearch is the appropriate place to make these changes. The RPM even provides a default version of this file there too.Volitant
This is no longer applicable for Elasticsearch 5, you need this answer.Screen
For a Windows Service, also be aware of registry settings: #27129120Cadaver
This looks good, but I put my limits in specifically for elasticsearch user in /etc/security/limits.d/elasticsearch.confSansone
S
40

Create a new file with the extension .options inside /etc/elasticsearch/jvm.options.d and put the options there. For example:

sudo nano /etc/elasticsearch/jvm.options.d/custom.options

and put the content there:

# JVM Heap Size - see /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g

It will set the maximum heap size to 2GB. Don't forget to restart elasticsearch:

sudo systemctl restart elasticsearch

Now you can check the logs:

sudo cat /var/log/elasticsearch/elasticsearch.log | grep "heap size"

You'll see something like so:

heap size [2gb], compressed ordinary object pointers [true]

Doc

Star answered 29/5, 2021 at 11:47 Comment(5)
kudos for mentioning the ".options" filename, this was not in documentation and thus working for me, now it is. Thanks !Freehold
Thanks. This worked on Rocky 8, where the previous Centos 7 instructions did not. (Even though the sysconfig file existed)Sanyu
Thanks for that. This approach is only recommended by ES.Bioluminescence
In docker, the directory is /usr/share/elasticsearch/config/jvm.options.d.Ego
In Mac/Homebrew, in 2024, using the elastic/tap/elasticsearch-full tap, the directory is /opt/homebrew/etc/elasticsearchPeculate
A
28

For anyone looking to do this on Centos 7 or with another system running SystemD, you change it in

/etc/sysconfig/elasticsearch 

Uncomment the ES_HEAP_SIZE line, and set a value, eg:

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

(Ignore the comment about 1g max - that's the default)

Altazimuth answered 12/5, 2015 at 6:54 Comment(3)
I should add: I tried the approach above on ES 1.7 on CentOS 7, and it had no effectBeading
@Jonesome not sure what I can suggest - I am running ES 1.7.1 from the ES RPM Package on CentOS 7 and that's the path that this file exists in, and changing ES_HEAP_SIZE works as intended.Altazimuth
Note for users of EL8 (Rhel, Centos, Rocky, etc). Although sysconfig does exist as per this, changing it does not make the change. The change needs to be made in /etc/elasticsearch/jvm.options as per @farahmand's answer instead. Verification is made by: curl -sS "localhost:9200/_cat/nodes?h=heap*&v"Sanyu
A
15

Instructions for ubuntu 14.04:

sudo vim /etc/init.d/elasticsearch

Set

ES_HEAP_SIZE=512m

then in:

sudo vim /etc/elasticsearch/elasticsearch.yml

Set:

bootstrap.memory_lock: true

There are comments in the files for more info

Asceticism answered 17/9, 2016 at 12:24 Comment(0)
O
11

Previous answers were insufficient in my case, probably because I'm on Debian 8, while they were referred to some previous distribution.

On Debian 8 modify the service script normally place in /usr/lib/systemd/system/elasticsearch.service, and add Environment=ES_HEAP_SIZE=8G just below the other "Environment=*" lines.

Now reload the service script with systemctl daemon-reload and restart the service. The job should be done!

Oblivious answered 23/8, 2015 at 23:20 Comment(3)
thanks, you save my day! yes, this is the correct procedure for Debian 8Statius
Is there no other place to configure this but to change a file in /usr/?Leukas
Works like a charm on ES 1.7.6 / Ubuntu 16Brahmanism
Z
8
  • Elasticsearch will assign the entire heap specified in jvm.options via the Xms (minimum heap size) and Xmx (maximum heap size) settings.
    • -Xmx12g
    • -Xmx12g
  • Set the minimum heap size (Xms) and maximum heap size (Xmx) to be equal to each other.
  • Don’t set Xmx to above the cutoff that the JVM uses for compressed object pointers (compressed oops), the exact cutoff varies but is near 32 GB.

  • It is also possible to set the heap size via an environment variable

    • ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch
    • ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch
Zulmazulu answered 29/9, 2018 at 0:15 Comment(5)
Also no more than 50% of the physical RAMConstantin
Hi How i set environment variable like this .Variable name is ES_JAVA_OPTS and value : "-Xms2g -Xmx2g" ./bin/elasticsearch likeValvate
I recommend making the adjustment in the file jvm.options elastic.co/guide/en/elasticsearch/reference/current/…Cautious
I need something configurable, so environment variables are perfect, but I can't seem to make it work. I have an environment file that I'm passing to docker with --env-file argument, and I tried adding ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch there, but that just gives me Error: Could not find or load main class "-Xms2g. Any ideas?Gory
@lovrodoe: see below: https://mcmap.net/q/166369/-how-to-change-elasticsearch-max-memory-sizeOptical
L
7

File path to change heap size /etc/elasticsearch/jvm.options

If you are using nano then do sudo nano /etc/elasticsearch/jvm.options and update -Xms and -Xmx accordingly.

(You can use any file editor to edit it)

enter image description here

Losse answered 6/4, 2021 at 11:30 Comment(0)
H
6

If you use the service wrapper provided in Elasticsearch's Github repository, found at https://github.com/elasticsearch/elasticsearch-servicewrapper, then the conf file at elasticsearch-servicewrapper / service / elasticsearch.conf controls memory settings. At the top of elasticsearch.conf is a parameter:

set.default.ES_HEAP_SIZE=1024

Just reduce this parameter, say to "set.default.ES_HEAP_SIZE=512", to reduce Elasticsearch's allotted memory.

Note that if you use the elasticsearch-wrapper, the ES_HEAP_SIZE provided in elasticsearch.conf OVERRIDES ALL OTHER SETTINGS. This took me a bit to figure out, since from the documentation, it seemed that heap memory could be set from elasticsearch.yml.

If your service wrapper settings are set somewhere else, such as at /etc/default/elasticsearch as in James's example, then set the ES_HEAP_SIZE there.

Hackery answered 13/8, 2013 at 12:36 Comment(5)
what if u don't have any service at all? (ie just run bin/elasticsearch -d)Lacking
Note: elasticsearch-servicewrapper has been deprecated and much of the functionality added to elasticsearch.Uncouple
@HenleyChiu then just set ES_HEAP_SIZE environment variable before running it. ie export ES_HEAP_SIZE=1G; bin/elasticsearch -dAkanke
In the ES 1.7.x stock elasticsearch.conf (the one installed by the rpm on CentOS), there is no set.default at all. Does this approach work on ES 1.7?Beading
The above answer is misleading. Set ES_HEAP_SIZE in /etc/sysconfig/elasticsearchBeading
E
6

If you installed ES using the RPM/DEB packages as provided (as you seem to have), you can adjust this by editing the init script (/etc/init.d/elasticsearch on RHEL/CentOS). If you have a look in the file you'll see a block with the following:

export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS
export JAVA_HOME

To adjust the size, simply change the ES_HEAP_SIZE line to the following:

export ES_HEAP_SIZE=xM/xG

(where x is the number of MB/GB of RAM that you would like to allocate)

Example:

export ES_HEAP_SIZE=1G

Would allocate 1GB.

Once you have edited the script, save and exit, then restart the service. You can check if it has been correctly set by running the following:

ps aux | grep elasticsearch

And checking for the -Xms and -Xmx flags in the java process that returns:

/usr/bin/java -Xms1G -Xmx1G

Hope this helps :)

Exteriorize answered 1/4, 2015 at 11:41 Comment(2)
Don't do it this way. This is not a good place to make these types of changes. This is a giant hack! Might work, but it'll get potentially trashed whenever ES is updated.Volitant
I should add: I tried the approach above on ES 1.7 on CentOS 7, and it had no effect.Beading
K
4

In elasticsearch path home dir i.e. typically /usr/share/elasticsearch, There is a config file bin/elasticsearch.in.sh. Edit parameter ES_MIN_MEM, ES_MAX_MEM in this file to change -Xms2g, -Xmx4g respectively. And Please make sure you have restarted the node after this config change.

Killy answered 24/10, 2016 at 4:0 Comment(0)
C
4

Oneliner for Centos 7 & Elasticsearch 7 (2g = 2GB)

$ echo $'-Xms2g\n-Xmx2g' > /etc/elasticsearch/jvm.options.d/2gb.options

and then

$ service elasticsearch restart
Convoke answered 27/3, 2022 at 9:55 Comment(0)
M
2

If you are using docker-compose to run a ES cluster:

  • Open <your docker compose>.yml file
  • If you have set the volumes property, you won't lose anything. Otherwise, you must first move the indexes.
  • Look for this value ES_JAVA_OPTS under environment and change the value in all nodes, the result could be somethig like "ES_JAVA_OPTS=-Xms2g -Xmx2g"
  • rebuild all nodes docker-compose -f <your docker compose>.yml up -d
Motherwell answered 2/11, 2021 at 22:31 Comment(0)
O
1

If you use windows server, you can change Environment Variable, restart server to apply new Environment Value and start Elastic Service. More detail in Install Elastic in Windows Server

Obsequious answered 15/4, 2015 at 3:7 Comment(0)
O
1

In elasticsearch 2.x :

vi /etc/sysconfig/elasticsearch 

Go to the block of 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

Uncomment last line like

ES_HEAP_SIZE=2g
Overprize answered 26/2, 2018 at 11:11 Comment(0)
G
1

Update elastic configuration in path /etc/elasticsearch/jvm.options

################################################################
## IMPORTANT: JVM heap size
################################################################
##
## The heap size is automatically configured by Elasticsearch
## based on the available memory in your system and the roles
## each node is configured to fulfill. If specifying heap is
## required, it should be done through a file in jvm.options.d,
## and the min and max should be set to the same value. For
## example, to set the heap to 4 GB, create a new file in the
## jvm.options.d directory containing these lines:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################
-Xms1g
-Xmx1g

These configs mean you allocate 1GB RAM for elasticsearch service.

Gnotobiotics answered 1/8, 2021 at 14:53 Comment(0)
E
1

If you use ubuntu 15.04+ or any other distro that uses systemd, you can set the max memory size editing the elasticsearch systemd service and setting the max memory size using the ES_HEAP_SIZE environment variable, I tested it using ubuntu 20.04 and it works fine:

systemctl edit elasticsearch 

Add the environement variable ES_HEAP_SIZE with the desired max memory, here 2GB as example:

[Service]
Environment=ES_HEAP_SIZE=2G

Reload systemd daemon

systemd daemon-reload

Then restart elasticsearch

systemd restart elasticsearch

To check if it worked as expected:

systemd status elasticsearch

You should see in the status -Xmx2G:

 CGroup: /system.slice/elasticsearch.service
         └─2868 /usr/bin/java -Xms2G -Xmx2G
Eke answered 5/1, 2022 at 20:51 Comment(0)
R
1

Elastic Search 7.x and above, tested with Ubuntu 20

  1. Create a file in /etc/elasticsearch/jvm.options.d. The file name must ends with .options

    For example heap_limit.options

  2. Add these lines to the file

    ## Initial memory allocation
    
    -Xms1g
    
    ## Maximum memory allocation
    
    -Xmx1g
    
  3. Restart elastic search service

    sudo service elasticsearch restart

    or

    sudo systemctl restart elasticsearch

Rawdan answered 4/3, 2022 at 14:38 Comment(1)
With ES 7.17 you no longer need to specify the heap size at all, it automatically computes it. Note this automatic computation does not work (uses default -Xmx1g) when elasticsearch.yml has deprecated settings node.master=true node.data=true.Parasite
M
0

window 7 elasticsearch elastic search memories problem elasticsearch-7.14.1\config\jvm.options

add this
-Xms1g -Xmx1g

elasticsearch-7.14.1\config\elasticsearch.yml

uncomment bootstrap.memory_lock: true

and pest https://github.com/elastic/elasticsearch-servicewrapper download service file and pest lasticsearch-7.14.1\bin

bin\elasticsearch.bat enter

Manolo answered 16/9, 2021 at 17:25 Comment(0)
O
0

In case you run in the problem describe above when setting via environment variables via systemd:

I need something configurable, so environment variables are perfect, but I can't seem to make it work. I have an environment file that I'm passing to docker with --env-file argument, and I tried adding ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch there, but that just gives me Error: Could not find or load main class "-Xms2g. Any ideas? –

you need to escape the variables, like so:

systemd-escape -- "-Xmx2g -Xms2g" 

The resulting string should then work as systemd ENVIRONMENT parameter, like so:

Environment=ES_JAVA_OPTS=\x2dXmx2g\x20\x2dXms2g
Optical answered 28/3 at 14:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.