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:
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
Ä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]
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?
quelle
Antworten:
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:
Geben Sie das root-Passwort ein.
Jetzt sind Sie root und überprüfen den aktuellen Wert von: / proc / sys / vm / max_map_count
Lass es uns ändern:
Lassen Sie uns überprüfen:
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
setze alle Parameter in die rc.local Datei, Beispiel:
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
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:
Versuchen:
Es funktioniert auf Ubuntu.
Überprüfen:
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
quelle
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_count
sysctl 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:
quelle
Sie können den offiziellen Anweisungen folgen:
Um eine dauerhafte Änderung vorzunehmen, aktualisieren Sie die Einstellung von vm.max_map_count in /etc/sysctl.conf
Siehe https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html
quelle