วิธีเปลี่ยนขนาดหน่วยความจำสูงสุดของ Elasticsearch


100

ฉันมีเซิร์ฟเวอร์ Apache ที่มีการกำหนดค่าเริ่มต้นของ Elasticsearch และทุกอย่างทำงานได้อย่างสมบูรณ์ยกเว้นว่าการกำหนดค่าเริ่มต้นมีขนาดสูงสุด 1GB

ฉันไม่มีเอกสารจำนวนมากที่จะจัดเก็บใน Elasticsearch ดังนั้นฉันจึงต้องการลดหน่วยความจำ

ฉันเห็นว่าฉันต้องเปลี่ยน-Xmxพารามิเตอร์ในการกำหนดค่า Java แต่ฉันไม่รู้ว่าจะทำอย่างไร

ฉันเห็นแล้วว่าฉันสามารถดำเนินการได้:

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

แต่เมื่อฉันต้องรีสตาร์ท Elasticsearch สิ่งนี้จะหายไป

เป็นไปได้ไหมที่จะเปลี่ยนการใช้หน่วยความจำสูงสุดเมื่อติดตั้ง Elasticsearch เป็นบริการ


ระบบปฏิบัติการและเวอร์ชันใด รุ่น Elasticsearch? คุณติดตั้ง Elasticsearch ได้อย่างไร?
James Addison

1
คุณอาจต้องการลดจำนวนของจำลองและชิ้นส่วนลงเนื่องจากไม่มีส่วนที่เหลือในการตั้งค่าโหนด 1 โหนดให้เพิ่มสิ่งนี้ใน /etc/elasticsearch/elasticsearch.yaml: index.number_of_shards: 1 index.number_of_replicas: 0 วิธีนี้ช่วยให้คุณประหยัดหน่วยความจำและซีพียูโดยไม่ทำงานที่ไม่จำเป็น .
neo112

คำตอบ:


129

ในElasticSearch> = 5เอกสารมีการเปลี่ยนแปลงซึ่งหมายความว่าคำตอบข้างต้นไม่ได้ผลสำหรับฉัน

ฉันพยายามเปลี่ยนES_HEAP_SIZEเข้า/etc/default/elasticsearchและetc/init.d/elasticsearchออก แต่เมื่อฉันรันps aux | grep elasticsearchเอาต์พุตยังคงแสดง:

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

ฉันต้องทำการเปลี่ยนแปลงเหล่านี้ใน:

/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

3
และสำหรับ Elasticsearch 5.2 บน Mac OS 10.12 ฉันพบไฟล์นี้ใน/usr/local/opt/elasticsearch/libexec/config/jvm.options
victorpolko

1
ฉันยืนยันได้ว่าสิ่งนี้ใช้ได้กับอินสแตนซ์ aws ami (ติดตั้งด้วย RPM) แต่ชุดแรก MAX_LOCKED_MEMORY = ไม่ จำกัด ใน / etc / sysconfig / elasticsearch และ bootstrap.memory_lock: true ใน /etc/elasticsearch/elasticsearch.yml
mork

2
สิ่งนี้ใช้ไม่ได้ใน Windows - คำตอบที่ถูกต้องอยู่ที่นี่: stackoverflow.com/questions/28798845/…
cbp

4
สำหรับการติดตั้ง homebrew ไฟล์อยู่ที่นี่:/usr/local/etc/elasticsearch/jvm.options
Milovan Zogovic

117

อัปเดตเมื่อวันที่ 24 พฤศจิกายน 2559 : Elasticsearch 5 ได้เปลี่ยนวิธีกำหนดค่า JVM ดูคำตอบได้ที่นี่ คำตอบด้านล่างยังคงใช้ได้กับเวอร์ชัน <5

tirdadc ขอขอบคุณที่ชี้ให้เห็นในความคิดเห็นของคุณด้านล่าง


ฉันมีเพจ pastebin ที่แชร์กับคนอื่นเมื่อสงสัยเกี่ยวกับหน่วยความจำและ ES มันทำงานตกลงสำหรับฉัน: http://pastebin.com/mNUGQCLY ฉันจะวางเนื้อหาที่นี่เช่นกัน:

อ้างอิง:

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

แก้ไขไฟล์ต่อไปนี้เพื่อแก้ไขขีด จำกัด หน่วยความจำและจำนวนไฟล์ คำแนะนำเหล่านี้ถือว่า Ubuntu 10.04 อาจทำงานในเวอร์ชันที่ใหม่กว่าและการกระจาย / ระบบปฏิบัติการอื่น ๆ ( แก้ไข : ใช้ได้กับ Ubuntu 14.04 เช่นกัน)

/etc/security/limits.conf :

elasticsearch - nofile 65535
elasticsearch - memlock unlimited

/ etc / default / elasticsearch (บน CentOS / RH: / etc / sysconfig / elasticsearch) :

ES_HEAP_SIZE=512m
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited

/etc/elasticsearch/elasticsearch.yml :

bootstrap.mlockall: true

4
แบบนี้ก็ดูดี ฉันยังมีคำแนะนำต่อไปนี้เกี่ยวกับการพิจารณาว่า ES_HEAP_SIZE ควรเป็นอย่างไรกฎทั่วไปคือฮีป ElasticSearch ควรมีประมาณ 50% ของหน่วยความจำที่มีอยู่ในเครื่อง ElasticSearch ใช้แคชของระบบอย่างมากดังนั้นคุณควรมีหน่วยความจำเพียงพอสำหรับพวกเขา (จากasquera.de/opensource/2012/11/25/… )
ทอม

17
ใน CentOS ฉันเห็นการกำหนดค่าที่คุณกล่าวถึง/etc/defaultอยู่ภายใต้ `/ etc / sysconfig '
Nishant

5
บน CentOS /etc/sysconfig/elasticsearchเป็นสถานที่ที่เหมาะสมในการเปลี่ยนแปลงเหล่านี้ RPM ยังให้เวอร์ชันเริ่มต้นของไฟล์นี้ด้วย
slm

5
สิ่งนี้ใช้ไม่ได้กับ Elasticsearch 5 อีกต่อไปคุณต้องการคำตอบนี้
tirdadc

2
สิ่งนี้ดูดี แต่ฉันใส่ขีด จำกัด สำหรับผู้ใช้ elasticsearch โดยเฉพาะ/etc/security/limits.d/elasticsearch.conf
radtek

26

สำหรับใครก็ตามที่ต้องการทำสิ่งนี้บน Centos 7 หรือด้วยระบบอื่นที่ใช้ SystemD คุณสามารถเปลี่ยนได้

/etc/sysconfig/elasticsearch 

ยกเลิกการใส่ข้อคิดเห็นในบรรทัด ES_HEAP_SIZE และตั้งค่าเช่น:

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

(ละเว้นความคิดเห็นเกี่ยวกับ 1g สูงสุด - นั่นคือค่าเริ่มต้น)


ฉันควรเพิ่ม: ฉันลองใช้แนวทางข้างต้นกับ ES 1.7 บน CentOS 7 แล้วและไม่มีผลใด ๆ
Jonesome Reinstate Monica

1
บางคนไม่แน่ใจว่าฉันสามารถแนะนำอะไรได้บ้าง - ฉันใช้ ES 1.7.1 จากแพ็คเกจ ES RPM บน CentOS 7 และนั่นคือเส้นทางที่มีไฟล์นี้อยู่และการเปลี่ยน ES_HEAP_SIZE ก็ใช้ได้ตามที่ตั้งใจไว้

9

คำแนะนำสำหรับubuntu 14.04:

sudo vim /etc/init.d/elasticsearch

ชุด

ES_HEAP_SIZE=512m

จากนั้นใน:

sudo vim /etc/elasticsearch/elasticsearch.yml

ชุด:

bootstrap.memory_lock: true

มีความคิดเห็นในไฟล์สำหรับข้อมูลเพิ่มเติม


9

คำตอบก่อนหน้านี้ไม่เพียงพอในกรณีของฉันอาจเป็นเพราะฉันใช้ Debian 8 ในขณะที่พวกเขาอ้างถึงการแจกจ่ายก่อนหน้านี้

ในDebian 8 ให้แก้ไขสคริปต์บริการตามปกติ/usr/lib/systemd/system/elasticsearch.serviceและเพิ่มEnvironment=ES_HEAP_SIZE=8G ด้านล่างบรรทัด "Environment = *" อื่น ๆ

ตอนนี้โหลดสคริปต์บริการsystemctl daemon-reloadใหม่และเริ่มบริการใหม่ งานควรทำ!


1
ขอบคุณคุณช่วยวันของฉัน! ใช่นี่เป็นขั้นตอนที่ถูกต้องสำหรับ Debian 8
เร็วขึ้น 2b

ไม่มีที่อื่นในการกำหนดค่านี้นอกจากเปลี่ยนไฟล์ใน/usr/?
Martin Schröder

6

หากคุณใช้ service wrapper ที่มีให้ในที่เก็บ Github ของ Elasticsearch พบได้ที่https://github.com/elasticsearch/elasticsearch-servicewrapperไฟล์ conf ที่ elasticsearch-servicewrapper / service / elasticsearch.conf จะควบคุมการตั้งค่าหน่วยความจำ ที่ด้านบนของ elasticsearch.conf คือพารามิเตอร์:

set.default.ES_HEAP_SIZE=1024

เพียงลดพารามิเตอร์นี้พูดกับ "set.default.ES_HEAP_SIZE = 512" เพื่อลดหน่วยความจำที่จัดสรรของ Elasticsearch

โปรดทราบว่าหากคุณใช้ elasticsearch-wrapper ES_HEAP_SIZE ที่ให้ไว้ใน elasticsearch.conf OVERRIDES All Other SETTINGS ฉันต้องใช้เวลาพอสมควรเนื่องจากจากเอกสารดูเหมือนว่าหน่วยความจำฮีปสามารถตั้งค่าได้จาก elasticsearch.yml

หากการตั้งค่า service wrapper ของคุณถูกตั้งค่าไว้ที่อื่นเช่นที่ / etc / default / elasticsearch ตามตัวอย่างของ James ให้ตั้งค่า ES_HEAP_SIZE ที่นั่น


2
ถ้าคุณไม่มีบริการเลยล่ะ? (เช่นเรียกใช้ bin / elasticsearch -d)
Henley Chiu


@HenleyChiu จากนั้นตั้งค่าตัวแปรสภาพแวดล้อม ES_HEAP_SIZE ก่อนที่จะรัน คือexport ES_HEAP_SIZE=1G; bin/elasticsearch -d
Andrey Regentov

ใน ES 1.7.x stock elasticsearch.conf (อันที่ติดตั้งโดยรอบต่อนาทีบน CentOS) ไม่มี set.default เลย แนวทางนี้ใช้ได้กับ ES 1.7 หรือไม่
Jonesome Reinstate Monica

คำตอบข้างต้นทำให้เข้าใจผิด ตั้งค่า ES_HEAP_SIZE ใน / etc / sysconfig / elasticsearch
Jonesome Reinstate Monica

6

หากคุณติดตั้ง ES โดยใช้แพ็กเกจ RPM / DEB ตามที่ให้มา (ตามที่คุณมี) คุณสามารถปรับได้โดยแก้ไขสคริปต์ init ( /etc/init.d/elasticsearch on RHEL/CentOS) หากคุณดูในไฟล์คุณจะเห็นบล็อกดังต่อไปนี้:

export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS
export JAVA_HOME

ในการปรับขนาดเพียงแค่เปลี่ยนES_HEAP_SIZEบรรทัดดังต่อไปนี้:

export ES_HEAP_SIZE=xM/xG

(โดยที่ x คือจำนวน MB / GB ของ RAM ที่คุณต้องการจัดสรร)

ตัวอย่าง:

export ES_HEAP_SIZE=1G

จะจัดสรร 1GB

เมื่อคุณแก้ไขสคริปต์แล้วให้บันทึกและออกจากนั้นเริ่มบริการใหม่ คุณสามารถตรวจสอบว่าตั้งค่าถูกต้องหรือไม่โดยเรียกใช้สิ่งต่อไปนี้:

ps aux | grep elasticsearch

และตรวจสอบแฟล็ก -Xms และ -Xmx ในกระบวนการ java ที่ส่งคืน:

/usr/bin/java -Xms1G -Xmx1G

หวังว่านี่จะช่วยได้ :)


1
อย่าทำแบบนี้ นี่ไม่ใช่สถานที่ที่ดีในการเปลี่ยนแปลงประเภทนี้ นี่คือแฮ็กยักษ์! อาจใช้งานได้ แต่อาจถูกทิ้งในถังขยะเมื่อมีการอัปเดต ES
slm

1
ฉันควรเพิ่ม: ฉันลองใช้แนวทางข้างต้นกับ ES 1.7 บน CentOS 7 แล้ว แต่ก็ไม่มีผล
Jonesome Reinstate Monica

3
  • Elasticsearch จะกำหนดฮีปทั้งหมดที่ระบุใน jvm.options ผ่านการตั้งค่า Xms (ขนาดฮีปขั้นต่ำ) และ Xmx (ขนาดฮีปสูงสุด)
    • -Xmx12 ก
    • -Xmx12 ก
  • กำหนดขนาดฮีปต่ำสุด (Xms) และขนาดฮีพสูงสุด (Xmx) ให้เท่ากัน
  • อย่าตั้งค่า Xmx ให้อยู่เหนือจุดตัดที่ JVM ใช้สำหรับพอยน์เตอร์ออบเจ็กต์ที่ถูกบีบอัด (บีบอัด oops) จุดตัดที่แน่นอนจะแตกต่างกันไป แต่จะอยู่ใกล้ 32 GB

  • นอกจากนี้ยังสามารถตั้งค่าขนาดฮีปผ่านตัวแปรสภาพแวดล้อม

    • ES_JAVA_OPTS = "- Xms2g -Xmx2g" ./bin/elasticsearch
    • ES_JAVA_OPTS = "- Xms4000m -Xmx4000m" ./bin/elasticsearch

นอกจากนี้ยังไม่เกิน 50% ของ RAM จริง
Achi Even-dar

สวัสดีฉันตั้งค่าตัวแปรสภาพแวดล้อมเช่นนี้ได้อย่างไรชื่อตัวแปรคือ ES_JAVA_OPTS และค่า: "-Xms2g -Xmx2g" ./bin/elasticsearch เช่น
Manikandan

ฉันจะยืนยันได้อย่างไรว่าขนาดฮีปอัปเดตอย่างถูกต้อง
Manikandan

2

ใน elasticsearch home dir โดยทั่วไป/usr/share/elasticsearchมีไฟล์ config bin/elasticsearch.in.shอยู่ แก้ไขพารามิเตอร์ES_MIN_MEM, ES_MAX_MEMในแฟ้มนี้เพื่อเปลี่ยน-Xms2g, -Xmx4gตามลำดับ และโปรดตรวจสอบให้แน่ใจว่าคุณได้เริ่มต้นโหนดใหม่หลังจากการเปลี่ยนแปลงการกำหนดค่านี้



1

ใน elasticsearch 2.x:

vi /etc/sysconfig/elasticsearch 

ไปที่บล็อกของรหัส

# 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

ไม่ใส่ข้อคิดเห็นบรรทัดสุดท้ายเช่น

ES_HEAP_SIZE=2g
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.