Vm.max_map_count für Elasticsearch kann nicht geändert werden

14

Vorgeschichte

Ich habe Elasticsearch und SugarCRM7 unter CentOS 6.5. Jeden Tag habe ich das gleiche Problem: Java OutofMemory Fehler. Dies geschieht aufgrund des kleinen vm.max_map_count-Werts (65530) nur, wenn 262144 empfohlen wird.

Problem

Das Problem ist, dass vm.max_map_count unveränderlich zu sein scheint:

  1. Wechsel unter root

    sudo sysctl -w vm.max_map_count=262144
    

    kehrt zurück

    Fehler: Berechtigung für Schlüssel 'vm.max_map_count' verweigert

    Während

    ps aux | grep java
    

    Gibt nur den Grep-Prozess zurück

  2. Änderung beim Start von elasticsearch

    sudo service elasticsearch start
    

    Gibt auch einen Fehler zurück

    Fehler: Berechtigung für Schlüssel 'vm.max_map_count' verweigert

    Elasticsuche starten: [OK]

  3. Manuelle Änderungen per Datei (Dirty-Dirty-Hack):

    sudo vi /proc/sys/vm/max_map_count
    

    Geht auch nicht:

    "/ proc / sys / vm / max_map_count" [schreibgeschützt] 1L, 6C

    - INSERT - W10: Warnung: Eine schreibgeschützte Datei ändern

    E45: 'readonly' Option ist gesetzt (add! To override)

    "/ proc / sys / vm / max_map_count" E212: Datei kann nicht zum Schreiben geöffnet werden

    Während

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

    Kehrt zurück

    -rw-r - r-- 1 root root 0 Apr 10 09:36 max_map_count

    (Aber ich denke, das kann normal sein, wenn Linux über das Verzeichnis / proc spricht.)

Wie kann ich den Wert dieser Variablen ändern? Elasticsearch jede Nacht neu zu starten ist keine gute Idee ... Oder weiß zumindest jemand, warum dieser Fehler auftritt?

Valentina
quelle
3
Was für eine Maschine ist das? Virtuell? Wenn ja, welche Art von Virtualisierung wird verwendet? Beachten Sie, dass einige Virtualisierungen, z. B. OpenVZ-Container, Ihren Container einschränken und es Ihnen nicht ermöglichen, den Kernel und andere Dinge auf niedriger Ebene zu optimieren.
Miroslav Koškár
@MiroslavKoskar weiß ich leider nicht. Wie kann ich das herausfinden?
Valentina
@MiroslavKoskar Vergessen zu erwähnen - die Maschine ist natürlich virtuell
Valentina
1
Wie finde ich es heraus? Nun, wo wird es gehostet? Dies sollte ziemlich offensichtlich sein, da dies normalerweise Teil Ihres Vertrags mit Ihrem Hosting-Anbieter ist. Wenn Sie immer noch Zweifel haben, wenden Sie sich an den Support Ihres Hosting-Anbieters. IMHO ist dies der beste Ausgangspunkt (da dies in der Regel Teil des Geschäfts ist und Sie wahrscheinlich dafür bezahlen).
Miroslav Koškár
@MiroslavKoskar naja, der Anbieter antwortete ohne die Technik zu erwähnen, dass sie mir bei diesem Problem nicht weiterhelfen kann (das ist eher vernünftig). Vielen Dank für Ihre Hilfe
Valentina

Antworten:

13

Sie sind fast da. Es spielt keine Rolle, ob es sich um eine virtuelle oder eine physische Maschine handelt. Diese Einstellungen können immer geändert werden.

Ich werde 3 Methoden zeigen.

Einige Vorinformationen:

1) Es ist besser, wenn möglich als root auszuführen.

2) / proc unter Unix ist kein echtes Dateisystem, es ist ein In-Memory-Kernel-Dateisystem, aber es scheint wie ein normales Festplatten-Dateisystem zu sein. Sie können es "gefälschtes Dateisystem" oder "spezielles Dateisystem" nennen. Sie können diese gefälschten Dateien nicht mit vi oder einem anderen Editor bearbeiten, da es sich nicht um Dateien handelt, sondern nur um Dateien. Ich habe vor Jahren das gleiche Problem gehabt.

Es ist jedoch einfach, ihre Werte zu ändern. Sie müssen lediglich eine andere Art von "Mechanik" verwenden, um sie zu bearbeiten.

Ich werde erklären: Zuerst muss ich root sein: (sudo funktioniert in einigen Distributionen, aber nicht in anderen Distributionen, wie Sie sie ausprobiert haben. Diese erste Methode ist universell und funktioniert auf jedem Linux-, MacOS- oder Unix-basierten Betriebssystem Ich hoffe, Sie haben Zugriff auf das root-Passwort.

Bei der Eingabeaufforderung fortfahren:

    $ su root

Geben Sie das root-Passwort ein.

Jetzt sind Sie root und überprüfen den aktuellen Wert von: / proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

Lass es uns ändern:

    echo 262144 > /proc/sys/vm/max_map_count

Lassen Sie uns überprüfen:

    cat /proc/sys/vm/max_map_count
    262144

Es ist fertig! Und es ist bereits angewendet und funktionsfähig. Durch Ändern der Werte einer Pseudodatei unter / proc werden die Einstellungen sofort aktiv. Sie bleiben jedoch nach einem Neustart nicht erhalten. Sie können mit Werten spielen und Leistungsänderungen an elasticsearh oder anderen Anwendungs- oder Systemmetriken messen . Optimieren Sie Ihr System, schreiben Sie die Werte auf Papier und behalten Sie die besten Werte bei. Wenn Sie einen Fehler machen, starten Sie den Computer neu und alle Werte werden wiederhergestellt. Starten Sie erneut, bis alle gewünschten Werte optimal sind. Unter / proc gibt es eine Menge Parameter, die auf Festplatte und Speicher abgestimmt werden können. Und sie machen einen großen Unterschied und steigern die Leistung, wenn Sie sie gut abstimmen (und Zeit dafür haben). Sie sind auf dem richtigen Weg.

Wenn Sie zufrieden sind, machen wir sie dauerhaft:

Erste Methode:

mit /etc/rc.local

    vi /etc/rc.local 

setze alle Parameter in die rc.local Datei, Beispiel:

    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

Beenden Sie den vi-Editor und speichern Sie die Datei.

Diese Parameter werden bei jedem Neustart festgelegt, nachdem alle Init-Dienste gestartet wurden, kurz bevor die Anmeldeaufforderung angezeigt wird.

( Die Datei /etc/rc.local wird nach allen Linux- Startdiensten ausgeführt. Sie funktioniert möglicherweise nicht, wenn elasticsearch vor der Ausführung als Dienst gestartet wird. Diese Methode kann jedoch in einem anderen Setup hilfreich sein, wenn Sie dies in Zukunft benötigen, oder Sie können sie auf diese Weise verwenden indem Sie sie in Ihr elasticsearch-Init-Skript einfügen, da das Init-Skript als root ausgeführt wird.

Sie können sie jetzt auch kopieren und für sofortige Änderungen einfügen. Die obigen Parameter sind gültig, eingestellt und laufen auf meinem Apache Cassandra Server. Wenn Sie möchten, versuchen Sie sie als Ausgangspunkt, um Ihre Einstellungen zu optimieren.

Zweite Methode, um sie dauerhaft zu machen:

Die Parameter werden jetzt VOR jedem Start-Service unter Linux eingestellt.

Bearbeite /etc/sysctl.conf , setze Parameter hinein

 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

Machen Sie mit den anderen weiter, speichern Sie /etc/sysctl.conf , starten Sie Ihren Server neu, um die Änderungen zu übernehmen, oder führen Sie Folgendes aus : sysctl -p , um die Änderungen ohne Neustart zu übernehmen. Sie sind über Neustarts hinweg permanent.

Zwei der oben genannten Methoden sind am gebräuchlichsten. Es gibt noch eine andere, die möglicherweise bei Ihnen funktioniert. Sie verwenden sudo , fast so, wie Sie es getan haben:

Anstatt von:

  sudo sysctl -w vm.max_map_count=262144

Versuchen:

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

Es funktioniert auf Ubuntu.

Überprüfen:

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

Hoffe, ich habe irgendwie geholfen, zumindest indem ich die 3 verschiedenen Optionen angegeben habe, um mit dem Problem umzugehen, da es Ihre Frage fast ein Jahr alt ist;)

Grüße, Rafael Prado

user62739
quelle
3
Sie haben dies bereits getan , und es ist fehlgeschlagen.
Michael Hampton
1
Hallo Michael, ja du hast recht. Zuerst verstand ich, dass das Problem mit den CentOS- und Unix-Benutzerberechtigungen des Betriebssystems zusammenhängt, also folgte ich dieser Zeile bei meiner Antwort. Bei neueren Informationen liegt der Schwerpunkt des Problems jedoch auf dem "Host" OpenVZ, wodurch einige Einstellungen eingeschränkt werden. Mein Wissen bezieht sich auf Centos und VmWare, aber nicht auf OpenVZ.
User62739
4

Ich denke, Ihre "virtuelle Maschine" ist tatsächlich ein OpenVZ-Container (den Sie überprüfen können, indem Sie ausführen virt-what).

In diesem Fall können Sie vm.max_map_countsysctl oder viele andere nicht ändern . Die Werte sind fest.

Dies ist ein bekanntes Problem mit Elasticsearch ( Problem Nr. 4978 ). Es ist nicht nur Elasticsearch. Es ist allgemein bekannt, dass Java-Apps bei verschiedenen OpenVZ-Anbietern eine schlechte Leistung erbringen, vor allem, weil die Hosts häufig schlecht eingestellt sind und Sie nichts dagegen tun können. Ein Kommentator zu diesem Thema gab an, was genau meine Empfehlung wäre:

joshuajonah hat kommentiert am Oct 20, 2015
This is insane. Ich schätze, ich werde auf ein KVM-VPS umsteigen.

Michael Hampton
quelle