2016-04-28 4 views
0

My ES 2.3.1インスタンスはヒープの97%を使用しているため、ほとんど常にガベージコレクションが行われ、リクエストが成功することはありません。私は何がすべての記憶を食べているのか分かりません。 field_dataの使用法はまったくありません。Groovyスクリプトのためにたくさんのメモリを使用するElasticsearch

ここに私のnode statsです。

さらに詳しい情報をお知らせください。どんな助けもありがとう。ありがとう!

EDIT:

ここではElasticsearch JVMのヒープオフに基づいてリーク容疑者レポートのスクリーンショットです。 Groovyスクリプトに関連するメモリリークのようです。これはElasticsearch自体の問題ですか?それとも、私はクライアントに何か間違っている可能性がありますか? leak suspects report

EDIT:

はここで私が使用しているスクリプトです。これであれば、更新値が失効しないように指定したIDのネストされたオブジェクトの現在のバージョンを置き換える:

def found = false; 
if (ctx._source.my_field != null) { 
    for (int i = 0; i < ctx._source.my_field.size(); i++) {  
     if (ctx._source.my_field[i].id == 1) {  
      found = true;  
      if (ctx._source.my_field[i].timestamp < 201605011912488050) {   
       ctx._source.my_field[i] = jsonMap  } 
      else {   
       ctx.op = "none"  
      }  
     } 
    }; 
    if (!found) { 
     ctx._source.my_field += jsonMap; 
    } 
} else { 
    ctx._source.my_field = [jsonMap]; 
}; 

更新が古くない場合にこれは単に定期的なフィールドを更新:

if (ctx._source.my_field2 == null || ctx._source.my_field2.timestamp < 201605011913320690) { 
    ctx._source.my_field2 = jsonMap 
} else { 
    ctx.op = "none" 
} 

上記の両方のケースでは、マップ(ja hereのように)を経由して渡されたjsonオブジェクトでフィールドを更新しています。私が作成し、次のコードでマップを渡しています:

Map<?, ?> jsonMap = new ObjectMapper().readValue(updateJson.toString(), HashMap.class); 
Map<String, Object> params = ImmutableMap.of("jsonMap", jsonMap); 
return new Script(script, ScriptService.ScriptType.INLINE, null, params); 

EDIT:情報の

さらにいくつかのビット:

1)最初のスクリプトはをループネストされた文書の数があります通常はO(1)であり、O(10)以下である。スクリプトを実行するには

2)、私が最初にupdateRequestを作成しています:getIndexRequestForDocumentUpsert(...)はちょうど新しい文書がどうなるかについての簡単な(非スクリプト)インデックス要求を返す

UpdateRequest updateRequest = new UpdateRequest() 
    .index(index) 
    .type(documentType) 
    .id(documentId.toString()) 
    .script(script) 
    .retryOnConflict(5) 
    .upsert(getIndexRequestForDocumentUpsert(...)); 

。これらのUpdateRequestは、最大100件の更新を含むバルク更新要求に追加されます。

3)最後に重要なのは、このヒープダンプは、インデックスへの更新(またはクエリ)が行われてから2日後に行われたことに注意してください。そのため、単純な過度の負荷ではなく漏れの匂いがします。

+0

本当に統計からはわかりません。ヒープ・ダンプを取って、あなたのコンテンツを見るためにyourkitまたはEclipse MATを使うことをお勧めします。 –

+0

@AndreiStefanは、メモリアナライザのリーク疑惑報告書からスクリーンショットを追加しました。 Githubに関する問題を開く価値があると思いますか? – PeteyPabPro

+0

いくつかのGroovyスクリプトを使用して、クライアント側で重い作業をしています。 –

答えて

0

Githubでissueを開きました。明らかに、これはGroovyのメモリリークが原因です。