My ES 2.3.1インスタンスはヒープの97%を使用しているため、ほとんど常にガベージコレクションが行われ、リクエストが成功することはありません。私は何がすべての記憶を食べているのか分かりません。 field_dataの使用法はまったくありません。Groovyスクリプトのためにたくさんのメモリを使用するElasticsearch
ここに私のnode statsです。
さらに詳しい情報をお知らせください。どんな助けもありがとう。ありがとう!
EDIT:
ここではElasticsearch JVMのヒープオフに基づいてリーク容疑者レポートのスクリーンショットです。 Groovyスクリプトに関連するメモリリークのようです。これはElasticsearch自体の問題ですか?それとも、私はクライアントに何か間違っている可能性がありますか?
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日後に行われたことに注意してください。そのため、単純な過度の負荷ではなく漏れの匂いがします。
本当に統計からはわかりません。ヒープ・ダンプを取って、あなたのコンテンツを見るためにyourkitまたはEclipse MATを使うことをお勧めします。 –
@AndreiStefanは、メモリアナライザのリーク疑惑報告書からスクリーンショットを追加しました。 Githubに関する問題を開く価値があると思いますか? – PeteyPabPro
いくつかのGroovyスクリプトを使用して、クライアント側で重い作業をしています。 –