SolrJを使用してメモリとスレッドがリークしている

トピック作成者:ks-solruserml-bot (2024/06/18 19:57 投稿)
10
CloseClose

(The bot translated the original post https://lists.apache.org/thread/52w46jfy8dnv8ql3pn70d9v0jflj5wl1 into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

みなさん、こんにちは、

このシンプルなコードがメモリとスレッドのリークを引き起こしています(スレッドが「スリープ」状態のままになります):

for (int j = 0; j < 10000; j++) {
    SolrClient solrClient = new HttpSolrClient.Builder("foo-bar").build();
}

なぜこうなるのか分かりますか?unbuild()やrelease()のようなメソッドを呼び出す必要があるのでしょうか?

使用しているのはSolr 8.11.1です。

よろしくお願いします。

Steven

返信投稿者:ks-solruserml-bot (2024/06/18 19:58 投稿)

JVMを完全に停止させる必要があります。それが唯一の確実な方法です。

要約すると、新しいHttpSolrClientによって消費されたすべてのメモリとスレッドは、それらの使用を停止してからJVMが終了するまでの間に解放されます。これはすべてのガベージコレクション方式のランタイムの特徴であり、バグではありません。

(PythonのVMのような参照カウント方式のものは少しマシですが、それでも特定のオブジェクトが望むときにガベージコレクターによって解放される保証はありません。)

Dima

返信投稿者:ks-solruserml-bot (2024/06/18 19:58 投稿)

そのコードは10,000台の異なるSolrサーバーと通信していますか?

各サーバーごとに1つのSolrClientを作成し、そのサーバーへのすべての通信に対して再利用してください。SolrClientは接続のプールを保持します。

wunder
Walter Underwood
wunder@wunderwood.org
http://observer.wunderwood.org/ (私のブログ)

返信投稿者:ks-solruserml-bot (2024/06/18 19:58 投稿)

SolrClientにはclose()メソッドがあります。

返信投稿者:ks-solruserml-bot (2024/06/18 19:58 投稿)

なぜ複数のクライアントオブジェクトを作成しているのですか?

Walterが言ったように、HttpSolrClientを使用する場合、各Solrインスタンスに対してアプリケーション全体で1つのクライアントオブジェクトが必要です。このクライアントオブジェクトは完全にスレッドセーフであり、そのインスタンス上のどのコア/コレクションにもアクセスできます。以前のクライアントオブジェクトを使用した後で新しいクライアントオブジェクトを作成する必要はありません。そのクライアントはプログラムの寿命全体で使用できます。

CloudSolrClientを使用している場合、SolrCloudクラスターごとに1つのクライアントオブジェクトが必要です。そのクライアントはクラスター内の任意のコレクションにアクセスでき、クラスターの変更(サーバーの追加/削除、サーバーのダウンや復帰、コレクションの追加、削除、変更など)をリアルタイムで認識します。HttpSolrClientと同様にスレッドセーフです。

また、Mikeが言ったように、SolrClientにはclose()メソッドがあります。もしクローズされたクライアントがオブジェクトやスレッドを保持している場合、それはほぼ間違いなくバグと見なされるでしょう。

ありがとうございます。

Shawn

返信投稿者:ks-solruserml-bot (2024/06/18 19:58 投稿)

再利用するべきです。

返信投稿者:ks-solruserml-bot (2024/06/18 19:59 投稿)

必要なすべてのクライアントを作成して、ずっと再利用してください。
ところで、Solrクライアントの使用に関するベストプラクティスはどこかに書かれているはずです。

Ciao,
Vincenzo

返信投稿者:ks-solruserml-bot (2024/06/18 19:59 投稿)

こんにちは、Steven、

さらに、数年前のActivateでJason Gerlowski氏の優れたトークもお勧めします。彼はSolrJを説明し、いくつかのベストプラクティス、異なるタイプのクライアント、一般的な間違いについて説明しています。これはSolrJの使用を始める良い出発点になるはずです。公式ドキュメントにもいくつかのコード例があります。

https://solr.apache.org/guide/8_11/using-solrj.html

https://www.youtube.com/watch?v=ACPUR_GL5zM

ありがとうございます。

Dwane

返信投稿者:ks-solruserml-bot (2024/06/18 19:59 投稿)

こんにちは、

SolrClientを閉じることは推奨されていないと記憶しています。

私たちも同じ問題を抱えています。物理メモリが20 GBまで上昇し、Solrに呼び出しを行うアプリケーションサーバーもスレッドを占有して遅くなります。この問題は、Solr 4.10.4からSolr 8.8.2にアップグレードした後に発生しています。私たちはインデックス作成、検索にそれぞれ別々のCloud Solrクライアントを作成し、再利用しています。

よろしくお願いします。
Reej

返信投稿者:ks-solruserml-bot (2024/06/18 19:59 投稿)

みなさん、

このトピックについてフォローアップしたいと思います。皆さんのフィードバックに感謝し、私の問題が解決した方法を共有します。もし他の誰かが同じ問題に直面した場合に役立てばと思います。個々のフィードバックに返信する代わりに、ここでまとめることが最善だと考えました。

私が扱っているコードは私が継承したレガシーです。したがって、SolrClientを再利用するためにリファクタリングすることは考えられません。問題は、solrClient.close() の呼び出しを追加することで解決しました。Solrのコードをよく知らないので、これがバグであるかどうかを判断することはできませんが、APIユーザーとしては、オブジェクトを使用した後にclose()を呼び出さなければならないと明記されていない限り、その必要はありません。この点については、Solrに詳しい方々に判断していただきたいと思います。

このトピックでの皆さんの助けに再度感謝します。

Steven

返信投稿者:ks-solruserml-bot (2024/06/18 19:59 投稿)

SolrClientはClosableを実装しており、使用が終わったらclose()を呼び出さないとリソースがリークします。

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2024 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?