Kürzlich ist Elasticsearch 5.4 (ES) eine relativ neue Version. Es gibt viele Probleme beim Gebrauch, das Kopfschmerz ist, aber das Problem wurde schließlich gelöst.
Frage 1: Esclient ist nur langsam zu werden, und der Kunde kann nicht erhalten werden
Da das Unternehmen eine Stapel von Dateien hochladen muss, ohne einen ES -Index hochzuladen, müssen Sie eine Verbindung erhalten und dann jedes Mal arbeiten, wenn Sie einen Index hinzufügen. Insbesondere in großen Chargen ist die Anzahl der Akquisitionen offensichtlich sehr groß. Der Hauptgrund für dieses Problem ist, dass wir ES häufig in Schleifen betreiben. Zum Beispiel müssen wir 100 Dateien in einer Stapel erhalten. Um den Zeitpunkt des Erhalts von ES -Client zu verkürzen, haben wir schließlich eine Lösung übernommen, dh die Verbindung initialisieren, wenn der Dienst startet, sie gleichzeitig erhalten und dann direkt später aufrufen. Nachdem die gesamte Stapeldatei hochgeladen wurde, wird der ES -Index endgültig hinzugefügt, anstatt jeweils eine Datei hinzuzufügen. Diese Methode erfordert offensichtlich nicht jede Stapel, um Verbindungen zu erhalten, was die Ausführungseffizienz erheblich verbessert.
Zunächst initialisieren wir den statischen ES -Client in der Startkurs:
private static elasticsearchutil elasticsearchutil = new ElasticSearchUtil (); öffentliches statisches Transportclient Client = Elasticsearchutil.getClient ();
Rufen Sie es dann direkt an, wenn Sie verwendet werden:
Client Client = main.client;
Dies kann die Anzahl der Verbindungen zum ES -Kunden erheblich verringern und damit die Effizienz verbessern.
Der ES -Code ist wie folgt:
public transportclient getClient () {String [] iparr = configUtil.getValue ("ESIP"). Split (","); Einstellungen Einstellungen = Settings.builder (). .put (constants.escluStername, configUtil.getValue ("CluSername")). Build (); TransportClient Client = new PrebuiltTransportClient (Einstellungen); für (String IP: IParr) {transportAddress address = new InetSocketTransportAddress (inetadDresses.ForString (IP), 9300); Client.AddtranSportAddresse (Adresse);} return client;}Frage 2: Speicherüberlauf: java.lang.outofMemory: Kann keinen neuen nativen Thread erstellen
Während des Projektentwicklungsprozesses ist der Speicherüberlauf eine sehr problematische Sache. Ich habe es während der Verwendung von ES begegnet, und es war sehr häufig, insbesondere bei großen Stresstests. Ich dachte an viele Möglichkeiten, das JVM -Gedächtnis zu optimieren, aber es gab keinen Einfluss, und das Problem war immer noch nicht gelöst. Als ich mich den Quellcode ansah, fand ich schließlich einen Grund. In Kombination mit Ausnahmen der Fehlerberichterstattung liegt dies daran, dass während der Verwendung mit ES automatisch eine große Anzahl von Threads erstellt wurde, was die Kapazität des Systems überschritt, was zum Speicherüberlauf führte. Beim Untersuchung des Quellcodes stellte ich fest, dass die Anzahl der von ES erstellten Threads durch Einstellungen gesteuert werden kann. Hier ist die Standardzahl der ES -Erstellungsfäden:
thread_pool.generic.core = Standardwert --- 4Thread_pool.generic.max = Standardwert-min (512, max (4*Prozessornummer, 128)) Prozessornummer = CPU-Prozessornummer
Unsere CPU sind 10 Kerne und 40 Fäden
Nach den Berechnungsergebnissen zu urteilen, ist die Anzahl der Threads, die ES erzeugen können, ein großer Wert, der weit über die Kapazität des Systems selbst hinausgeht. Es passt hauptsächlich den Einstellwert an. Nach der Einstellung ändern wir den Standardwert von ES wie folgt:
Einstellungen Einstellungen = Settings.builder (). Put ("Thread_pool.generic.core", 5) .put ("Thread_pool.generic.max", 10) .put ("Prozessoren", 5) .put (constants.escluStername, configUtil.getValue ("clustername")). Build (); Dies sind die vorherigen Einstellungen Einstellungen = Settings.builder (). Put ("Thread_pool.generic.core", 5) .put (Constants.escluStername, configUtil.getValue ("CluSername")). Build ();Nach dem Testen erstellte ES eine sehr kleine Anzahl von Threads und erfüllte unsere Entwicklungsbedürfnisse, und es gab kein Problem mit dem Speicherüberlauf.
Die obige Zusammenfassung der gemeinsamen Fragen, die auf Elasticsearch 5.4 basieren, ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.