Jak zmienić maksymalny rozmiar pamięci Elasticsearch

99

Mam serwer Apache z domyślną konfiguracją Elasticsearch i wszystko działa idealnie, poza tym, że domyślna konfiguracja ma maksymalny rozmiar 1 GB.

Nie mam tak dużej liczby dokumentów do przechowywania w Elasticsearch, więc chcę zmniejszyć ilość pamięci.

Widziałem, że muszę zmienić -Xmxparametr w konfiguracji Javy, ale nie wiem jak.

Widziałem, że mogę to wykonać:

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

Ale kiedy będę musiał ponownie uruchomić Elasticsearch, zostanie to utracone.

Czy można zmienić maksymalne użycie pamięci, gdy Elasticsearch jest zainstalowany jako usługa?

Patxi1980
źródło
Jaki system operacyjny i wersja? Wersja Elasticsearch? Jak zainstalowałeś Elasticsearch?
James Addison
1
Możesz chcieć zmniejszyć liczbę replik i odłamków, ponieważ nie ma żadnych zalet posiadania ich w konfiguracji z jednym węzłem, dodaj to do /etc/elasticsearch/elasticsearch.yaml: W index.number_of_shards: 1 index.number_of_replicas: 0 ten sposób oszczędzasz pamięć i procesor, nie wykonując niepotrzebnej pracy .
neo112

Odpowiedzi:

127

W ElasticSearch> = 5 dokumentacja uległa zmianie , co oznacza, że ​​żadna z powyższych odpowiedzi nie zadziałała.

Próbowałem zmieniających ES_HEAP_SIZEsię /etc/default/elasticsearchw etc/init.d/elasticsearch, ale kiedy wpadłem ps aux | grep elasticsearchwyjście nadal pokazał:

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

Musiałem wprowadzić te zmiany w:

/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
źródło
3
A dla Elasticsearch 5.2 na Mac OS 10.12 znalazłem ten plik w/usr/local/opt/elasticsearch/libexec/config/jvm.options
victorpolko
1
Mogę potwierdzić, że działa to dla instancji aws ami (zainstalowanej z RPM), ale najpierw ustaw MAX_LOCKED_MEMORY = unlimited w / etc / sysconfig / flexiblesearch and bootstrap.memory_lock: true in /etc/elasticsearch/elasticsearch.yml
mork
2
To nie działa w systemie Windows - poprawna odpowiedź jest tutaj: stackoverflow.com/questions/28798845/ ...
cbp
4
W przypadku instalacji homebrew plik znajduje się tutaj:/usr/local/etc/elasticsearch/jvm.options
Milovan Zogovic
117

Zaktualizowano 24 listopada 2016 r . : Elasticsearch 5 najwyraźniej zmienił sposób konfigurowania maszyny JVM. Zobacz tę odpowiedź tutaj . Poniższa odpowiedź nadal dotyczy wersji <5.

tirdadc, dziękuję za wskazanie tego w komentarzu poniżej.


Mam stronę z pastebinem, którą udostępniam innym, gdy zastanawiam się nad pamięcią i ES. Dla mnie zadziałało dobrze: http://pastebin.com/mNUGQCLY . Wkleję tutaj również zawartość:

Bibliografia:

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

Edytuj następujące pliki, aby zmodyfikować limity pamięci i liczby plików. Te instrukcje zakładają, że Ubuntu 10.04 może działać na nowszych wersjach i innych dystrybucjach / systemach operacyjnych. ( Edycja : działa to również w przypadku Ubuntu 14.04.)

/etc/security/limits.conf :

elasticsearch - nofile 65535
elasticsearch - memlock unlimited

/ etc / default / flexiblesearch (na CentOS / RH: / etc / sysconfig / flexiblesearch) :

ES_HEAP_SIZE=512m
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited

/etc/elasticsearch/elasticsearch.yml :

bootstrap.mlockall: true
James Addison
źródło
4
To wygląda dobrze. Mam również następującą radę dotyczącą określenia, jaka powinna być wartość ES_HEAP_SIZE: Ogólna zasada jest taka, że ​​sterta ElasticSearch powinna mieć około 50% dostępnej pamięci na komputerze. ElasticSearch intensywnie wykorzystuje systemowe pamięci podręczne, więc należy zostawić dla nich wystarczającą ilość pamięci. (z asquera.de/opensource/2012/11/25/… )
Tom
17
W CentOS widzę konfiguracje, o których wspomniałeś w /etc/defaultsekcji `/ etc / sysconfig '
Nishant,
5
Na CentOS /etc/sysconfig/elasticsearchjest odpowiednim miejscem do wprowadzenia tych zmian. RPM zapewnia nawet domyślną wersję tego pliku.
slm
5
To nie ma już zastosowania do Elasticsearch 5, potrzebujesz tej odpowiedzi .
tirdadc
2
Wygląda to dobrze, ale stawiam swoje ograniczenia specjalnie dla użytkownika /etc/security/limits.d/elasticsearch.conf
Flexiblesearch
26

Dla każdego, kto chce to zrobić na Centos 7 lub z innym systemem z SystemD, możesz to zmienić w

/etc/sysconfig/elasticsearch 

Odkomentuj wiersz ES_HEAP_SIZE i ustaw wartość, np .:

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

(Zignoruj ​​komentarz o 1g max - to ustawienie domyślne)


źródło
Powinienem dodać: wypróbowałem powyższe podejście na ES 1.7 na CentOS 7 i nie przyniosło to żadnego efektu
Jonesome Reinstate Monica
1
@Jonesome nie jestem pewien, co mogę zasugerować - używam ES 1.7.1 z pakietu ES RPM na CentOS 7 i to jest ścieżka, w której ten plik istnieje, a zmiana ES_HEAP_SIZE działa zgodnie z przeznaczeniem.
9

Instrukcje dla ubuntu 14.04:

sudo vim /etc/init.d/elasticsearch

Zestaw

ES_HEAP_SIZE=512m

potem w:

sudo vim /etc/elasticsearch/elasticsearch.yml

Zestaw:

bootstrap.memory_lock: true

Aby uzyskać więcej informacji, w plikach znajdują się komentarze

Stephen
źródło
9

Poprzednie odpowiedzi były w moim przypadku niewystarczające, prawdopodobnie dlatego, że korzystam z Debiana 8, podczas gdy zostały one odesłane do jakiejś wcześniejszej dystrybucji.

W Debianie 8 zmodyfikuj skrypt serwisowy, który normalnie umieszcza się w /usr/lib/systemd/system/elasticsearch.service, i dodaj Environment=ES_HEAP_SIZE=8G tuż pod innymi liniami "Environment = *".

Teraz przeładuj skrypt usługi za pomocą systemctl daemon-reloadi uruchom ponownie usługę. Praca powinna być wykonana!

claudod
źródło
1
dzięki, ratujesz mój dzień! Tak, jest to właściwa procedura dla Debiana 8
faster2b
Czy nie ma innego miejsca, w którym można to skonfigurować, jak tylko zmienić plik /usr/?
Martin Schröder
6

Jeśli używasz opakowania usługi udostępnionego w repozytorium Github Elasticsearch, które można znaleźć pod adresem https://github.com/elasticsearch/elasticsearch-servicewrapper , wówczas plik conf w elasticsearch-servicewrapper / service / flexiblesearch.conf kontroluje ustawienia pamięci. U góry pliku flexiblesearch.conf znajduje się parametr:

set.default.ES_HEAP_SIZE=1024

Po prostu zmniejsz ten parametr, powiedzmy do „set.default.ES_HEAP_SIZE = 512”, aby zmniejszyć ilość przydzielonej pamięci Elasticsearch.

Zwróć uwagę, że jeśli korzystasz z elastycznego wyszukiwania, ES_HEAP_SIZE podany w elasticsearch.conf ZASTĘPUJE WSZYSTKIE INNE USTAWIENIA. Zajęło mi to trochę czasu, ponieważ z dokumentacji wydawało się, że pamięć sterty można ustawić z pliku flexiblesearch.yml.

Jeśli ustawienia opakowania usługi są ustawione w innym miejscu, na przykład w / etc / default / flexiblesearch, jak w przykładzie Jamesa, ustaw tam ES_HEAP_SIZE.

Scott Rice
źródło
2
co jeśli w ogóle nie masz żadnej usługi? (tzn. po prostu uruchom bin / flexiblesearch -d)
Henley Chiu
@HenleyChiu następnie ustaw zmienną środowiskową ES_HEAP_SIZE przed jej uruchomieniem. tj.export ES_HEAP_SIZE=1G; bin/elasticsearch -d
Andrey Regentov
W magazynie ES 1.7.x elastsearch.conf (tym zainstalowanym przez rpm na CentOS) nie ma w ogóle set.default. Czy to podejście działa w ES 1.7?
Jonesome Przywraca Monikę
Powyższa odpowiedź jest myląca. Ustaw ES_HEAP_SIZE w / etc / sysconfig /
flexiblesearch
6

Jeśli zainstalowałeś ES przy użyciu dostarczonych pakietów RPM / DEB (jak się wydaje), możesz to zmienić, edytując skrypt inicjujący ( /etc/init.d/elasticsearch on RHEL/CentOS). Jeśli zajrzysz do pliku, zobaczysz blok z następującymi elementami:

export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS
export JAVA_HOME

Aby dostosować rozmiar, po prostu zmień ES_HEAP_SIZElinię na następującą:

export ES_HEAP_SIZE=xM/xG

(gdzie x to liczba MB / GB pamięci RAM, którą chcesz przydzielić)

Przykład:

export ES_HEAP_SIZE=1G

Przydzieliłby 1 GB.

Po wyedytowaniu skryptu zapisz i wyjdź, a następnie uruchom ponownie usługę. Możesz sprawdzić, czy został ustawiony poprawnie, uruchamiając następujące polecenie:

ps aux | grep elasticsearch

I sprawdzanie flag -Xms i -Xmx w procesie java, który zwraca:

/usr/bin/java -Xms1G -Xmx1G

Mam nadzieję że to pomoże :)

gl1tchh
źródło
1
Nie rób tego w ten sposób. To nie jest dobre miejsce na tego typu zmiany. To jest gigantyczny hack! Może działać, ale zostanie potencjalnie usunięty po zaktualizowaniu ES.
slm
1
Powinienem dodać: próbowałem powyższego podejścia na ES 1.7 na CentOS 7 i nie dało to żadnego efektu.
Jonesome Przywróć Monikę
3
  • Elasticsearch przypisze całą stertę określoną w jvm.options za pomocą ustawień Xms (minimalny rozmiar sterty) i Xmx (maksymalny rozmiar sterty).
    • -Xmx12g
    • -Xmx12g
  • Ustaw minimalny rozmiar sterty (Xms) i maksymalny rozmiar sterty (Xmx) tak, aby były równe.
  • Nie ustawiaj Xmx powyżej wartości odcięcia, której JVM używa do skompresowanych wskaźników obiektów (skompresowane oops), dokładna wartość odcięcia jest różna, ale wynosi blisko 32 GB.

  • Możliwe jest również ustawienie wielkości sterty za pomocą zmiennej środowiskowej

    • ES_JAVA_OPTS = "- Xms2g -Xmx2g" ./bin/elasticsearch
    • ES_JAVA_OPTS = "- Xms4000m -Xmx4000m" ./bin/elasticsearch
Satyendra Sharma
źródło
Również nie więcej niż 50% fizycznej pamięci RAM
Achi Even-dar
Cześć, jak ustawić zmienną środowiskową taką jak ta. Nazwa zmiennej to ES_JAVA_OPTS i wartość: „-Xms2g -Xmx2g” ./bin/elasticsearch like
Manikandan
Jak również potwierdzam, rozmiar stosu został poprawnie zaktualizowany
Manikandan
2

W katalogu głównym ścieżki elastycznej wyszukiwania, tj. Zazwyczaj /usr/share/elasticsearchznajduje się plik konfiguracyjny bin/elasticsearch.in.sh. Edycja parametrów ES_MIN_MEM, ES_MAX_MEMw tym pliku do zmian -Xms2g, -Xmx4godpowiednio. I upewnij się, że ponownie uruchomiłeś węzeł po tej zmianie konfiguracji.

Amit Sharma
źródło
1

Jeśli używasz serwera Windows, możesz zmienić zmienną środowiskową, zrestartować serwer, aby zastosować nową wartość środowiska i uruchomić Elastic Service. Więcej szczegółów w artykule Instalacja elastyczna w systemie Windows Server

Thoai Ngo
źródło
1

W elasticsearch 2.x:

vi /etc/sysconfig/elasticsearch 

Przejdź do bloku kodu

# 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

Odkomentuj ostatnią linię jak

ES_HEAP_SIZE=2g
Ankush
źródło