ไม่สามารถเปลี่ยน vm.max_map_count สำหรับ elasticsearch


14

ประวัติศาสตร์

ฉันมี ElasticSearch และ SugarCRM7 ทำงานบน CentOS 6.5 ทุกวันฉันประสบปัญหาเดียวกัน: ข้อผิดพลาด java outOfMemory สิ่งนี้เกิดขึ้นเนื่องจากค่า vm.max_map_count ขนาดเล็ก 65530 เฉพาะเมื่อแนะนำ 262144

ปัญหา

ปัญหาคือ vm.max_map_count ดูเหมือนว่าไม่สามารถเปลี่ยนแปลงได้:

  1. เปลี่ยนภายใต้ราก

    sudo sysctl -w vm.max_map_count=262144
    

    ผลตอบแทน

    ข้อผิดพลาด: สิทธิ์ถูกปฏิเสธในคีย์ 'vm.max_map_count'

    ในขณะที่

    ps aux | grep java
    

    ส่งคืนเฉพาะกระบวนการ grep

  2. เปลี่ยนเมื่อเริ่มต้น elasticsearch

    sudo service elasticsearch start
    

    ส่งคืนข้อผิดพลาดเช่นกัน

    ข้อผิดพลาด: สิทธิ์ถูกปฏิเสธในคีย์ 'vm.max_map_count'

    การเริ่มต้น ElasticSearch: [ตกลง]

  3. การเปลี่ยนแปลงด้วยตนเองผ่านไฟล์ (แฮ็คที่สกปรกสกปรก):

    sudo vi /proc/sys/vm/max_map_count
    

    ไม่ทำงานอย่างใดอย่างหนึ่ง:

    "/ proc / sys / vm / max_map_count" [อ่านได้อย่างเดียว] 1L, 6C

    - INSERT - W10: คำเตือน: การเปลี่ยนไฟล์แบบอ่านอย่างเดียว

    E45: ตั้งค่าตัวเลือก 'อ่านได้อย่างเดียว' (เพิ่ม! เพื่อลบล้าง)

    "/ proc / sys / vm / max_map_count" E212: ไม่สามารถเปิดไฟล์เพื่อเขียน

    ในขณะที่

    ls -la /proc/sys/vm/ | grep max_map_count
    

    ผลตอบแทน

    -rw-r - r-- 1 รูทราก 0 เม.ย. 10 09:36 max_map_count

    (แต่ฉันคิดว่านี่เป็นเรื่องปกติสำหรับ linux ที่พูดถึงไดเรกทอรี / proc)

ดังนั้นฉันจะเปลี่ยนค่าของตัวแปรนี้ได้อย่างไร การเริ่มต้นใช้งาน ElasticSearch ทุกคืนไม่ใช่ความคิดที่ดี ... หรืออย่างน้อยก็อาจมีคนรู้ว่าทำไมข้อผิดพลาดนี้เกิดขึ้น?


3
มันเป็นเครื่องจักรชนิดใด? เสมือน? ถ้าใช้ virtualization ประเภทใด โปรดทราบว่าการจำลองเสมือนบางอย่างเช่นคอนเทนเนอร์ OpenVZ กำหนดข้อ จำกัด ไว้ในคอนเทนเนอร์ของคุณและไม่อนุญาตให้คุณ "ปรับแต่ง" เคอร์เนลและสิ่งอื่น ๆ ในระดับต่ำ
Miroslav Koškár

@MiroslavKoskar ฉันไม่ทราบว่าน่าเสียดาย ฉันจะทราบได้อย่างไร
Valentina

@MiroslavKoskar ลืมที่จะพูดถึง - เครื่องเป็นเสมือนแน่นอน
Valentina

1
จะหาได้อย่างไร? แล้วมันถูกโฮสต์ไว้ที่ไหน? ควรจะค่อนข้างชัดเจนเพราะมักจะเป็นส่วนหนึ่งของสัญญากับผู้ให้บริการโฮสต์ของคุณ หากยังมีข้อสงสัยติดต่อผู้ให้บริการโฮสติ้งของคุณ IMHO เป็นจุดเริ่มต้นที่ดีที่สุด (เนื่องจากปกติแล้วจะเป็นส่วนหนึ่งของข้อตกลงและสิ่งที่คุณน่าจะจ่าย)
Miroslav Koškár

@ MiroslavKoskar ดีผู้ให้บริการตอบโดยไม่ต้องพูดถึงเทคโนโลยีที่พวกเขาไม่สามารถช่วยฉันด้วยปัญหานี้ (นั่นค่อนข้างสมเหตุสมผล) ขอบคุณสำหรับความช่วยเหลือของคุณ
Valentina

คำตอบ:


13

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

ฉันจะแสดง 3 วิธี

ข้อมูลเบื้องต้นบางอย่าง:

1) จะดีกว่าถ้าใช้งานรูทหากเป็นไปได้

2) / procบน unix ไม่ใช่ระบบไฟล์จริงมันเป็นระบบไฟล์เคอร์เนลในหน่วยความจำ แต่ดูเหมือนว่าจะเป็นระบบไฟล์ดิสก์ปกติ คุณสามารถเรียกมันว่า 'ระบบแฟ้มปลอม' หรือ 'ระบบแฟ้มพิเศษ' คุณไม่สามารถแก้ไขไฟล์ปลอมเหล่านั้นด้วย vi หรือโปรแกรมแก้ไขอื่น ๆ เพราะไม่ใช่ไฟล์พวกเขาดูเหมือนไฟล์ ฉันติดอยู่กับปัญหาเดียวกันปีที่ผ่านมา

แต่มันง่ายในการเปลี่ยนค่าของพวกเขาเพียงแค่ต้องการ 'กลศาสตร์' อีกชนิดหนึ่งเพื่อแก้ไข

ฉันจะอธิบาย: ก่อนอื่นต้องเป็น root: (sudo ทำงานใน distros บางอย่าง แต่ไม่ได้อยู่ใน distros อื่น ๆ อย่างที่คุณลองวิธีแรกนี้เป็นสากลและใช้ได้กับ Linux, MacOS หรือ Unix ใด ๆ ก็ตาม . หวังว่าคุณจะสามารถเข้าถึงรหัสผ่านรูทได้

ดำเนินการทันทีที่:

    $ su root

ป้อนรหัสผ่านรูท

ตอนนี้คุณเป็นรูทลองตรวจสอบค่าปัจจุบันของ: / proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

มาเปลี่ยนกันเถอะ:

    echo 262144 > /proc/sys/vm/max_map_count

ตรวจสอบกันเลย:

    cat /proc/sys/vm/max_map_count
    262144

มันจบแล้ว! และมันถูกนำไปใช้และใช้งานได้แล้ว ด้วยการเปลี่ยนค่าของไฟล์หลอกใด ๆ ภายใต้ / proc การตั้งค่าจะเปิดใช้งานทันที แต่พวกเขาจะไม่คงอยู่หลังจากรีบูต คุณสามารถเล่นกับค่าและวัดการเปลี่ยนแปลงประสิทธิภาพได้ที่elasticsearhหรือแอปพลิเคชันหรือตัวชี้วัดระบบอื่น ๆ ไปปรับระบบของคุณเขียนค่าลงในกระดาษบางแผ่นรักษาค่าที่ดีที่สุด ในความผิดพลาดใด ๆ ให้รีบูตและพวกเขาทั้งหมดจะกลับไปเป็นค่าดั้งเดิมและเริ่มต้นอีกครั้งจนกว่าค่าที่ต้องการทั้งหมดจะดีที่สุด มีพารามิเตอร์ที่ปรับได้ดิสก์และหน่วยความจำจำนวนมากภายใต้ / proc และพวกเขาสร้างความแตกต่างและประสิทธิภาพที่เพิ่มขึ้นอย่างมากหากคุณปรับมันให้ดี (และมีเวลาทำ) คุณกำลังอยู่บนทางที่ถูกต้อง.

เมื่อพอใจแล้วให้พวกมันถาวร:

วิธีแรก:

ใช้/etc/rc.local

    vi /etc/rc.local 

วางพารามิเตอร์ทั้งหมดไว้ในไฟล์ rc.local ตัวอย่าง:

    echo 220000000 > /proc/sys/vm/dirty_background_bytes
    echo 320000000 > /proc/sys/vm/dirty_bytes
    echo 0 > /proc/sys/vm/dirty_background_ratio
    echo 0 > /proc/sys/vm/dirty_ratio
    echo 500 > /proc/sys/vm/dirty_writeback_centisecs
    echo 4500 > /proc/sys/vm/dirty_expire_centisecs
    echo 1 > /proc/sys/net/ipv4/tcp_rfc1337
    echo 10 > /proc/sys/vm/swappiness
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 0 > /proc/sys/vm/zone_reclaim_mode
    echo deadline > /sys/block/sda/queue/scheduler
    echo 8 > /sys/class/block/sda/queue/read_ahead_kb
    echo 1048575 > /proc/sys/vm/max_map_count

ตัวแก้ไข exit ของ vi กำลังบันทึกไฟล์

พารามิเตอร์เหล่านั้นจะถูกตั้งค่าในการรีบูตทุกครั้งหลังจากที่บริการ init ทั้งหมดเริ่มต้นขึ้นก่อนที่ข้อความแจ้งการเข้าสู่ระบบจะปรากฏขึ้น

( ไฟล์/etc/rc.localถูกเรียกใช้หลังจากบริการเริ่มต้นของ linux ทั้งหมดอาจไม่ทำงานหาก elasticsearch เริ่มต้นก่อนเป็นบริการ แต่วิธีนี้จะมีประโยชน์ในการตั้งค่าอื่นหากคุณต้องการในอนาคตหรือคุณสามารถใช้เช่นนี้ โดยใส่ไว้ในสคริปต์เริ่มต้นของ elasticsearch เนื่องจากสคริปต์ init ทำงานเป็นรูทดังนั้นจึงเป็นไวยากรณ์เดียวกันข้างต้นเพื่อใช้ภายในสคริปต์ init)

คุณสามารถคัดลอกและวางเพื่อเปลี่ยนแปลงได้ทันที พารามิเตอร์ด้านบนนั้นถูกต้องปรับและทำงานบนเซิร์ฟเวอร์ apache Cassandra ของฉัน หากคุณต้องการลองเป็นจุดเริ่มต้นในการปรับแต่งของคุณ

วิธีที่สองเพื่อทำให้ถาวร:

ตอนนี้พารามิเตอร์จะถูกตั้งค่าก่อนที่จะเริ่มบริการใด ๆ บน linux

แก้ไข/etc/sysctl.confใส่พารามิเตอร์เข้าไป

 vm.max_map_count=1048575
 vm.zone_reclaim_mode=0
 vm.dirty_background_bytes=220000000
 vm.dirty_background_ratio=0
 vm.dirty_bytes=320000000
 vm.dirty_ratio=0
 vm.swappiness=10

ไปกับคนอื่น ๆ ต่อไปบันทึก/etc/sysctl.confรีบูทเซิร์ฟเวอร์ของคุณเพื่อใช้การเปลี่ยนแปลงหรือดำเนินการ: sysctl -pเพื่อใช้การเปลี่ยนแปลงโดยไม่ต้องรีบูต พวกเขาจะถาวรตลอดการเรียบ

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

แทน:

  sudo sysctl -w vm.max_map_count=262144

ลอง:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count

มันทำงานบนอูบุนตู

ตรวจสอบ:

   user@naos:~$ cat /proc/sys/vm/max_map_count
   262144

หวังว่าฉันได้ช่วยทางอย่างน้อยโดยให้ 3 ตัวเลือกที่แตกต่างกันเพื่อจัดการกับปัญหาเนื่องจากเกือบคำถามของคุณปี;)

ขอแสดงความนับถือ Rafael Prado


3
พวกเขาทำสิ่งนี้ไปแล้วและมันก็ล้มเหลว
Michael Hampton

1
สวัสดี Michael ใช่คุณพูดถูก ฉันเข้าใจในตอนแรกว่าปัญหาเกี่ยวข้องกับระบบปฏิบัติการ CentOS และการอนุญาตของผู้ใช้ unix ดังนั้นฉันจึงทำตามคำสั่งนั้น แต่ข้อมูลที่ใหม่กว่านั้นให้ความสำคัญกับปัญหาใน "โฮสต์" OpenVZ ซึ่ง จำกัด การตั้งค่าบางอย่าง ความรู้ของฉันอยู่ที่ Centos และ VmWare แต่ไม่ใช่ใน OpenVZ
user62739

4

ฉันคิดว่า "เครื่องเสมือน" ของคุณเป็นภาชนะ OpenVZ (ซึ่งคุณสามารถตรวจสอบได้ด้วยการใช้งานvirt-what)

ในกรณีนี้คุณไม่สามารถเปลี่ยนvm.max_map_countsysctl หรืออื่น ๆ อีกมากมาย ค่าได้รับการแก้ไข

นี่เป็นปัญหาที่รู้จักกันดีกับ elasticsearch ( ฉบับที่ 4978 ) มันไม่ใช่แค่ Elasticsearch แอป Java เป็นที่รู้จักกันดีว่าทำงานได้ไม่ดีกับผู้ให้บริการ OpenVZ ต่างๆส่วนใหญ่เป็นเพราะโฮสต์มักจะได้รับการปรับแต่งที่แย่และไม่มีอะไรที่คุณสามารถทำได้ ผู้วิจารณ์คนหนึ่งในปัญหานั้นได้สะท้อนสิ่งที่ฉันแนะนำ:

joshuajonah แสดงความคิดเห็นเมื่อ 20 ต.ค. 2558
นี่เป็นบ้า ฉันเดาว่าฉันจะเปลี่ยนเป็น KVM VPS


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