セグメントマージが発生したタイミングを追跡するには? | KandaSearch Community Support Forum

セグメントマージが発生したタイミングを追跡するには?

トピック作成者:ks-solruserml-bot (2024/12/28 18:08 投稿)
6
OpenOpen

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

セグメントマージが発生したタイミングについて、より詳しい情報を取得しようとしています。

現時点で私が頼れるのは、Solrのデータディレクトリが存在するパーティションの使用ディスク容量が時折増加し、その数分後に再び減少する、という事実だけです。

log4j2.xmlorg.apache.lucene 用のロガーを追加してみました:

<RollingFile
  name="RollingFileLucene"
  fileName="${sys:solr.log.dir}/lucene.log"
  filePattern="${sys:solr.log.dir}/lucene.log.%i" >
  <PatternLayout>
    <Pattern>
      %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t)
      [%X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%n
    </Pattern>
  </PatternLayout>
  <Policies>
    <OnStartupTriggeringPolicy />
    <SizeBasedTriggeringPolicy size="32 MB"/>
  </Policies>
</RollingFile>

<Logger name="org.apache.lucene" level="DEBUG">
  <AppenderRef ref="RollingFileLucene"/>
</Logger>

この設定で lucene.log ファイルは作成されますが、中身は空のままです。何か見落としている点があるのでしょうか?

ログ(またはJMX? 他の方法?)でセグメントマージの追跡ができると、特定の動作やレイテンシー関連の観察を行う際に非常に役立ちます。

何か助言をいただけると幸いです。

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

返信投稿者:ks-solruserml-bot (2024/12/28 18:09 投稿)

LuceneコアはJDK以外の依存関係がゼロです。そのため、Solrのようなロギング機能は実際には持っていません。

ただし、Solrには InfoStreamロギング の仕組みがあり、まさに求めている情報を取得することができます。Solrに付属している log4j2.xml には、以下の行があります:

<AsyncLogger name="org.apache.solr.update.LoggingInfoStream" level="off"/>

ここで "off" の代わりにどのレベルを設定すべきかははっきりしませんが、おそらく info または debug のどちらかでしょう。

生成されたログエントリは、Solrの他のログと一緒に solr.log に記録されるはずです。

ありがとう、
Shawn

返信投稿者:ks-solruserml-bot (2024/12/28 18:09 投稿)

これが良いアイデアかどうかはわかりませんが、現在使用している MergePolicy を拡張またはラップして、マージが行われた際に任意の方法で通知を受け取るようにすることも試せるかもしれません。
参考リンクはこちらです:
https://solr.apache.org/guide/solr/latest/configuration-guide/index-segments-merging.html#mergepolicyfactory

返信投稿者:ks-solruserml-bot (2024/12/28 18:09 投稿)

デバッグレベルでこれを設定し、別のファイルにログを出力するようにしましたが、今のところ何も出力されていません。ファイルは作成されましたが、サイズは0バイトです。しばらく様子を見て、何か出力されるか確認してみます。

ロガーは非同期(async)にした方が良いでしょうか?すべてのロガーが同期(sync)で設定されたカスタムセットアップを引き継いでいます。

ありがとうございます。
Koen

返信投稿者:ks-solruserml-bot (2024/12/28 18:09 投稿)

Shawnがすでに述べたことに追加すると、solrconfig.xml<infoStream>true</infoStream> を設定することもできます。もし solrconfig が Solrのサンプルとして提供される techproducts 設定をベースにしているなら、<indexConfig> セクション内にすでに存在するはずです。もしなければ、手動で追加することもできます。

これにより、Luceneのログが solr.log に流れるようになります。Luceneの ConcurrentMergeScheduler にあるマージスレッドは「Lucene Merge Thread」という名前になっているので、ログ内でこれを探せば必要な情報が得られるはずです。

Rahul

返信投稿者:ks-solruserml-bot (2024/12/28 18:10 投稿)

試してみます、Rahulさん、ありがとうございます。

よろしく、
Koen

返信投稿者:ks-solruserml-bot (2024/12/28 18:10 投稿)

これを適用したところ、以下のようなログが表示されるようになりました:

o.a.s.u.LoggingInfoStream [DW][commitScheduler-48-thread-1]:
commitScheduler-48-thread-1 finishFullFlush success=true

o.a.s.u.LoggingInfoStream [MP][commitScheduler-48-thread-1]:
findMerges: 10 segments
...

o.a.s.u.LoggingInfoStream [MP][commitScheduler-48-thread-1]:
allowedSegmentCount=13 vs count=10 (eligible count=10)

o.a.s.u.LoggingInfoStream [MS][commitScheduler-48-thread-1]:
now merge

これが求めていた指標だと思います。

さまざまなマージポリシーやファクトリー用に追加のロガーを設定しても、特に追加のログは出力されませんでした。

ありがとうございます。
Koen

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

KandaSearch

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

投稿の削除

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