最近、ElasticSearch 5.4(ES)は比較的新しいバージョンです。使用中に多くの問題がありますが、これは頭痛ですが、問題は最終的に解決されました。
質問1:Esclientがゆっくりと取得され、取得できません:子供のイベントループの作成に失敗しました
ビジネスはESインデックスをアップロードせずにファイルのバッチをアップロードする必要があるため、接続を取得し、インデックスを追加するたびに操作する必要があります。特に大きなバッチでは、買収の数は明らかに非常に多いです。この問題の主な理由は、ループでESを頻繁に操作することです。たとえば、バッチで100個のファイルを取得する必要があります。 ESクライアントを取得する時間を短縮するために、最終的にソリューションを採用しました。つまり、サービスが起動したときに接続を初期化し、一度に取得してから直接呼び出します。バッチファイル全体がアップロードされた後、ESインデックスが一度に1つのファイルを追加するのではなく、最終的に追加されます。この方法では、明らかに各バッチに接続を取得する必要はなく、実行効率が大幅に向上します。
まず、サービスが開始されると、起動クラスの静的ESクライアントを初期化します。
private static elasticsearchutil elasticsearchutil = new elasticsearchutil(); public static TransportClient Client = ElasticSearchutil.getClient();
次に、使用したときに直接呼び出します。
クライアントクライアント= main.client;
これにより、ESクライアントへの接続の数を大幅に削減し、それにより効率が向上します。
ESコードは次のとおりです。
public TransportClient getClient(){string [] iparr = configutil.getValue( "esip")。split( "、"); settings settings = settings.builder()。 .put(constants.esclustername、configutil.getValue( "clustername")) for(string ip:iparr){TransportAddress address = new inetsocketTransportaddress(inetAddresses.forstring(ip)、9300); client.addtransportaddresses(address);} return client;}質問2:メモリオーバーフロー:java.lang.outofmemory:新しいネイティブスレッドを作成できません
プロジェクト開発プロセス中、メモリオーバーフローは非常に面倒なものです。 ESの使用中に遭遇しましたが、特に大規模なストレステスト中に非常に頻繁でした。私はJVMメモリを最適化する多くの方法を考えましたが、効果はなく、問題はまだ解決されていませんでした。最後に、ソースコードを見るとき、私は理由を見つけました。これは、エラー報告の例外と組み合わせることで、ESで使用中に多数のスレッドが自動的に作成され、システムの容量を超えてメモリオーバーフローにつながったためです。ソースコードを研究するとき、ESによって作成されたスレッドの数を設定で制御できることがわかりました。 ES作成スレッドのデフォルト番号は次のとおりです。
thread_pool.generic.core =デフォルト値--- 4thread_pool.generic.max =デフォルト値 - min(512、max(4*プロセッサ番号、128))プロセッサ番号= CPUプロセッサ番号
CPUは10コアと40個のスレッドです
計算結果から判断すると、デフォルト値が使用される場合、ESが作成できるスレッドの数は大きな値であり、システム自体の容量をはるかに超えています。主に設定値を調整します。調整後、次のようにESのデフォルト値を変更します。
設定設定= settings.builder()。put( "thread_pool.generic.core"、5).put( "thread_pool.generic.max"、10).put( "processors"、5).put(constants.esclustertername、configutil.getValue( "clustername"))。これは、以前の設定settings = settings.builder()。put( "thread_pool.generic.core"、5).put(constants.esclustername、configutil.getValue( "clustername"))。build();
テスト後、ESは非常に少数のスレッドを作成し、開発ニーズを満たしましたが、メモリオーバーフローの問題は再びありませんでした。
ElasticSearch 5.4に基づく一般的な質問の上記の要約は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。