Fess 15.1でクロールが遅いのでチューニングの勘所を探ってみた

どうも、Tです。

Fessのクロール設定とパフォーマンスチューニングに必要な知識をつけるため検証してみた備忘録です。

全文検索の対象(ファイル・Webなど)やFessが動作している環境、他の設定影響によりこの通りにならない可能性が高いです。時間の計測もしていますが、環境によって大きくずれてきます。あくまで参考にご参照ください。

スポンサーリンク
アドセンス1

環境

Fess 15.1

# dnf list installed | grep fess
fess.noarch 15.1.0-1 @@commandline

やりたいこと

Fessをデフォルト設定で使っていたところ、クロール処理のパフォーマンスがかなり悪いので、設定によってどのような違いがあるのか?チューニングは可能なのか?を探ってみました。

 Fessは商用サポート(有料)でパフォーマンスチューニングなどのサービスを受けることもできるようですが、利益を生み出さない自分範囲の利用にお金をだせないので自力で頑張って調べることにしました。
商用サポート
Fess は Apache ライセンスで提供されるオープンソースで、個人や商用向けでも無料でご自由にご利用いただけます。 N2SM, Inc. は以下を提供しています。 N2 Search: Fessの商用製品版 検索ソリューションのサポート: Fess や Elasticsearch のカスタマイズおよび構築支援等

Fessは、Javaで作られているためJavaエンジニアであれば、コードを読みながら解析することもできそうですが、あまり得意な分野ではないため実際に動かしながら確認しています。

Fessで全文検索できるようになるまでには、大きく下記のような処理が行われます。

  1. Fessのクローラーでクロール対象(ファイルやWebの情報)を収集する
  2. クロールしたものをインデックスとしてOpenSearchに保存する
  3. FessからOpenSearchに保存したインデックスを利用して検索が可能になる

クローラージョブでは、1~2の処理を行っているため、この辺りの時間短縮を狙って確認しました。

結果

記事が長いので先に結果を記載しておきます。

気になる方は記事の内容をご確認ください。

改善状況

小さいファイルに関してはチューニングにより改善できましたが、大きいファイルに関してはチューニングで改善できませんでした。

クロール対象デフォルト設定チューニング後やったこと
1KBのテキストファイル1000個5分30秒
  • スレッド数の変更
  • 間隔の変更
  • CPU使用率上限を無制限に変更
1MBのテキストファイル1000個16分16分

チューニングの検討順番

優先順検討方針注意点
1CPU使用率上限の緩和CPU利用率の上限を可能な限り緩和する。可能であれば制限なしが良いと感じる。

デフォルト50%のCPU使用率上限が設けられて、処理の待ち時間が発生する頻度を減らすことできる。クロール対象が多い場合は、大きな削減が見込まれる。

他のサービスも動いている場合やクロール中にFessで検索を行う場合はパフォーマンス影響が発生する可能性がある。
2間隔の短縮クロール先が許容できる範囲で間隔を0ミリ秒に近づける。対象ドキュメントが大きいサイズの場合は、効果が薄い?
3スレッド数の増加CPUコア数を超えて大き目のスレッド数にする。対象ドキュメントが大きいサイズの場合は、効果が薄い?

スレッド数が多すぎると逆に遅くなる可能性があるため計測しながら調整が必要。

4複数クローラージョブを同時実行本記事では確認していないが、クローラー対象が複数ある場合は、ジョブを並行で処理することによってトータル時間短縮が見込まれる。同時に動作するスレッド数も増加するため、多くなりすぎないようにする。
5CPUを増やす。クローラー処理はCPU(スレッド数)が多ければ多いほど、同時に処理できるため時間短縮が見込まれる。対象ドキュメントが大きいサイズの場合は、効果が薄い?

わからなかった問題

対象のドキュメントのサイズが大きい場合は、クローラーではなくIndexUpdateの処理がボトルネックになっているようですが、これの対応方法がわかりませんでした。

OpenSearchへインデックスを渡す頻度?サイズ?を増やすことができれば、改善できそうな気がするのですが…。

Fessサーバースペック

今回の確認に使用したFessサーバのスペックになります。

項目備考
OSOracle Linux Server release 9.6
ロケーションProxmox VE上の仮想マシン
CPU4コア推奨値最低
メモリ16GB推奨値最低
ディスク100GB推奨値最低は500GB以上

仮想マシンのディスクは、Proxmox VEに装備しているSSDにディレクトリタイプのストレージを作成して割り当てています。

テストファイル作成

Fessは、ファイル共有やWebなどさまざまなものを収集可能ですが、今回は確認のしやすいさからOSのファイルシステム上のファイルをクロールして確認しています。

テストに利用したファイルは下記になります。

項目小さいファイル大きいファイル
作成場所/fess-test/small/fess-test/large
ファイル種類テキストテキスト
サンプルファイルsmall_1KB.txtlarge_1MB.txt
1ファイルサイズ1KB1MB
ファイル数1000ファイル1000ファイル

Fessの検索テスト用にデータが公開されていたので、テキストファイルをそれぞれ上記のサイズになるようにテキストコピペしました。

GitHub - codelibs/fess-testdata: Test Data Repository for Crawling/Parsing
Test Data Repository for Crawling/Parsing. Contribute to codelibs/fess-testdata development by creating an account on GitHub.

小さいファイル作成

小さいテスト用ファイルを作成します。適用なディレクトリを作成し、テスト用ファイルを配置します。

# cd /fess-test/small/
# ls -lha
total 4.0K
drwxr-xr-x 2 root root   27 Aug  8 11:22 .
drwxr-xr-x 4 root root   32 Aug  8 10:44 ..
-rw-r--r-- 1 root root 1.1K Aug  8 10:50 small_1KB.txt

1000ファイルになるようにコピーします。

# for i in {1..999};do cp small_1KB.txt small_1KB_${i}.txt;done

1万ファイル作成できました。

# ls -1 | wc -l
1000

容量は4MBほどです。現代はだいたいブロックが4KBで書き込まれていると思うので、想定通りです。

# du -sh .
4.0M .

大きいファイル作成

大きいテスト用ファイルを作成します。適用なディレクトリを作成し、テスト用ファイルを配置します。

# cd /fess-test/large/
# ls -lha
total 1.1M
drwxr-xr-x 2 root root   27 Aug  8 10:44 .
drwxr-xr-x 4 root root   32 Aug  8 10:44 ..
-rw-r--r-- 1 root root 1.1M Aug  8 10:44 large_1MB.txt

1000ファイルになるようにコピーします。

# for i in {1..999};do cp large_1MB.txt large_1MB_${i}.txt;done

1万ファイル作成できました。

# ls -1 | wc -l
1000

容量は1GBほどです。こちらも代替想定の容量になりました。

# du -sh .
1004M .

前提

共通設定値

Fessはインストール後のデフォルト設定で確認しています。

小さいファイルと大きいファイルの領域のクロールで比較していくため、下記2つのファイルシステムのクロール設定を利用します。

クローラ名クロール対象とするパス
Smallファイルfile:/fess-test/small
Largeファイルfile:/fess-test/large

それぞれ別のジョブとして実行できるように、クロール設定下部の「新しいジョブの作成」からデフォルトでジョブを作成しています。

実施順番

確認は下記の順番で実施するようにしています。

  1. 小さいファイルでインデックス作成
  2. インデックス作成の時間を確認
  3. インデックスをすべて削除
  4. 大きいファイルインデックス作成
  5. インデックス作成の時間を確認
  6. インデックスをすべて削除
  7. 次の確認内容を実施(以下、1から実施)

インデックス作成にかかった時間は、「システム情報」->「ジョブログ」画面で確認できる開始時間・終了時間から確認しています。秒数はざっくりまとめました。

インデックスの削除方法については、下記の記事にまとめました。

Fessで作成されたインデックスをすべて削除してみた
どうも、Tです。 Fessの管理画面からインデックス情報を削除してみた備忘録です。 環境 Fess # dnf list...

クロール設定のチューニング

デフォルト値

クローラ名スレッド数間隔ジョブにかかった時間
Smallファイル51000ミリ秒5分
Largeファイル51000ミリ秒16分

Largeファイルの方は、テキストの量も多いため時間が長くなっています。

また、ファイルが大きい場合、IndexUpdaterというOpenSearchへ保存している(と思われる)処理が長く、OpenSearchのCPU使用率も高くなるような動きになっています。

スレッド数変更

クローラの設定にあるスレッド数とは、クローラが実行するスレッド数です。つまり、スレッド数が5の場合、ジョブで実行すると5ファイルずつファイルの収集をしていきます。

今回、CPUは4コアしかありませんが、スレッド数を増やすことでCPUの空きなどをうまいこと使ってくれてジョブの時間が短くなるか確認しました。

今回は、OSのファイルシステム上のファイルが対象のため、どんどんスレッド数を増やして確認しましたが、Webやファイル共有の場合、あまりに多すぎると接続先が高負荷になったり、制限にかかる可能性が高いので注意が必要です。
クローラ名スレッド数間隔ジョブにかかった時間
Smallファイル101000ミリ秒3分
202分
301分30秒
Largeファイル1014分
2014分
3014分

スレッド数を増やすことでジョブの時間を短くできることは確認できました。物理コア以上のスレッド数を指定しても、よい感じで処理してくれているようです。

しかし、スレッド数を増やしても倍々で早くなるわけであはりませんでした。特にLargeファイルについては、10スレッドでは多少時間短縮されましたが、20スレッド以上では誤差レベルでした。ある程度の改善の期待はあるものの劇的に改善するものではないこと、スレッド数を増やしすぎるとコンテキストスイッチのコストが増えて、逆に遅くなてしまう可能性もあるため、計測しながら調整する必要がありそうです。

間隔変更

間隔はドキュメントをクロールする間隔です。デフォルトの1000ミリ秒で、スレッドが5の場合、1秒間隔で5つのファイル(5スレッド分)のファイルを取得するようになります。

間隔を短くすることでジョブの時間が短くなるか確認しました。

今回は、OSのファイルシステム上のファイルが対象のため、どんどん短くして確認しましたが、Webやファイル共有の場合、あまりに短すぎると接続先が高負荷になったり、制限にかかる可能性が高いので注意が必要です。
クローラ名スレッド数間隔ジョブにかかった時間
Smallファイル5
500ミリ秒3分
100ミリ秒1分
0ミリ秒1分
Largeファイル500ミリ秒14分
100ミリ秒13分30秒
0ミリ秒13分30秒 

間隔を短くすることでジョブ時間を短くできることを確認できました。Smallファイルでは明かに改善されているため、チューニングする際は、まず検討したい項目になりそうです。クロール先の負荷や要件を満たす範囲で可能な限り短くするのが良いと思われます。

Largeファイルについては、多少の改善はありましたが500ミリ秒以下は誤差レベルです。間隔では、ファイルをクロールする時間を短くしていますが、ファイルが大きいとIndexUpdaterのOpenSearchへのインデックス登録に時間を要してしまうのがネックになっていると思われます。

スレッド数・間隔変更

スレッド数と間隔の両方を変更して、どの程度まで改善できるか確認しました。

クローラ名スレッド数間隔ジョブにかかった時間
Smallファイル300ミリ秒1分
Largeファイル13分30秒

目立った改善は見られませんでした。Smallファイルについては間隔が短く早く処理が行われているため、CPUに空きがなくスレッドが良い感じに回れていないためと思われます。Largeファイルについては、やはりIndexUpdaterの処理がネックになっていると思われます。

Fess自身のチューニング

CPU使用率上限変更

Fessでは、デフォルト設定でCPU使用率が50%を超えると処理に待ち時間が発生します。このCPU使用率の上限を引き上げることで処理時間が短くなるか確認しました。

クローラ名スレッド数間隔CPU使用率上限ジョブにかかった時間
Smallファイル300ミリ秒
0
(無制限)
30秒
Largeファイル16分

CPU使用率を無制限にしても100%に張り付くなどは確認できませんでしたが、1000ファイルと少ないためかもしれません。

Smallファイルに関しては体感としても明らかに早くなっていると感じましたが、Largeファイルに関してはむしろ遅くなりました…なぜ?

CPUコアの増強

Fessのチューニングだけでは限界を感じたので、CPUコアを2倍の8コアに増やして速くなるか確認しました。

クローラ名スレッド数間隔CPU使用率上限ジョブにかかった時間
Smallファイル300ミリ秒
0
(無制限)
約20秒
Largeファイル13分

Smallファイルは明らかに速くなりました。Largeファイルについては、スレッド数や間隔変更時とほぼかわりませんでした。

Appendix

リソース確認

Fessのパフォーマンスは、CPU・メモリおよびそれらのリソースを使うFessで動くJavaプロセスの状況を見ながら確認していく必要があります。サーバOSのリソース状況についてはdstatコマンドを使って確認しました。dstatは、CPUコア毎とメモリを同時に出力できなかったため別々に確認しています。

CPUリソースは、下記のようにCPUコアを指定することで、コア毎の利用状況を確認できます。

 # dstat -t -C 0,1,2,3

メモリリソースは、下記のコマンドで確認しました。

# dstat -tv

ログ確認

管理画面からはどの程度インデックス化されているか、どのような処理が行われているかわかりません。

チューニングの際は、ログファイルを確認しながらジョブを実行するとわかりやすいです。

ログ内容
/var/log/fess/fess-crawler.logFessのクロールに関するログです。

リソース不足など何か問題があればこのログに出力されます

/var/log/fess/fess-urls.logクロールされているドキュメントのログです。fess-crawler.logにもクロール状況は出力されていますが、こちらはドキュメントのみのログのため見やすいです。

https://www.chazine.com/archives/4355

/var/log/opensearch/opensearch.logOpenSearchのログです。FessからOpenSearchにインデックスしているあたりでリソース不足などあればこちらに出力されます。

Fess回りのログは、ログレベルを変更することもできるため、下記を参照すると良いです。

システム関連の設定
Fess がデフォルトで利用するポートは 8080 になります。 変更する場合は、Linux 環境であれば bin/fess.in.sh の Windows 環境であれば bin\fess.in.bat の を変更します。 Windows 環境でサービス登録して使用する場合は bin\service.bat のポートも...
ログの設定
Fess が出力するログファイルを以下にまとめます。 Table: ログファイル一覧 (webapps/fess/WEB-INF/logs) ファイル名 内容 fess.out 管理画面や検索画面で操作した時のログなどが出力される。 fess_crawler.out クロール時のログ。クロール実行時のログが出力される。...
簡単導入! OSS全文検索サーバFess入門(28) ログファイルの参照方法
今回は、Fessを構築/運用するにあたり、よくご質問いただく問題について、ログの見方や解決方法をご紹介します。

差分クロールが一般的な認識の差分とは違う問題

Fessには、「最終更新日時の確認」という設定項目があります。当初、最初のクロールに時間がかかっても差分が短くなるなら良いかと考えていました。

https://fess.codelibs.org/ja/15.1/admin/general-guide.html

最終更新日時の確認
差分クロールを行う場合に有効にします。

差分クロールだと、クロール処理から外れると考えていましたがクロール処理の対象になります。この辺り理解ができなかったのですが、下記の記事が非常に参考になりました。

Fess 差分クロールを考える - Qiita
コメント欄にも情報があります。あわせてご覧くださいませ。 結論 最終更新日時の確認 差分クロールを行う場合に有効にします。 公式ドキュメントには上記のように記載されているが、あくまでクロールを行った際にインデックスの作成を行うか否かの判定にのみ影響してい...
十数万件規模のファイルクロール方法について
こんにちは。 頭記についてお伺いさせて下さい。 ■システム構成 ・ファイル検索サーバ:1台(Windows Server 2012上のfess+elasticsearch(非商用)) ・検索対象のファイルサーバ:3台 現在、社内でのナレッジ共有を目的とし、上記構成のファイル検索システムを構築中です。検索対象フ...
簡単導入! OSS全文検索サーバFess入門(19) CSVファイルのクロール
データをExcelで管理したり、利用しているサービス内のデータをCSVファイルとしてダウンロードしたりと、CSVファイルを扱う場面は何かと多いと思います。Fessでは、CSVファイルをデータソースとしてクロール対象にすることが可能です。今回は、CSVファイルのクロール方法について説明します。

参考

Fess Configuration Properties
This document describes the configuration properties of Fess. The default values can be found in fess_config.properties See table bellow for the list of configu...
インデックス生成が遅い? - 今日のひとこと
Fessのインデックス生成が遅い的なコメントをもらうケースがあるので、コメントしておきます。Fessでのインデックス生成プロセスはクロールと (Solrでの) インデックス生成がパラレルに実行されています。まぁ、実際に多 … "インデックス生成が遅い?" の続きを読む
ファイルサーバークロール速度、処理間隔
(from osdn.net/users/skomatsu) 共有フォルダクロール処理テスト評価を行っています。 以下わかれば可能情報教授いただけると助かります。 <現状課題> ・大量データ蓄積ファイルサーバー、クロールテスト中。 システム保管用データ1.6Tほど、ファイル&フォルダ沢山あり ・クロール処理...
目標達成: 100万ドキュメント - 今日のひとこと
目標としていた100万ドキュメントのクロールおよびインデックス化を達成することができました。先月くらいからあれやこれやとチューニングをし続け、ようやく達成できました。テストするにも1回やると数日かかるので、かなり時間がか … "目標達成: 100万ドキュメント" の続きを読む
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
FessはSolrベースの全文検索システムです。 Solrベースの全文検索システムを構築する上で遭遇する問題などを含めて、Fessについてご紹介します。 - Download as a PDF or view online for free
検索サーバの最適化のツボを教えて下さい。
(from osdn.net/users/xfedora) PC環境で詰める最高のメモリ32G、i7、SSD、x64 Win7 などで自分の財布でできるまでの環境を作りました。 そこで、Fessの各構成フレームのパラメータをいじって、最高のクロール性能を引き出せないか教えていただきたくよろしくお願いいたします。 ...
全文検索FESSのチューニング|Umino Shachi
最初に チューニングとか偉そうなことを書いてはいるものの、 私は全然中身を熟知していないし、トライアンドエラーでなんとか動かしているくらいのレベル感なのでそんなに大したものではありません。 こればかりは環境にもよるのであくまでもここでこんな設定ができるくらいの参考として書き残しておくものです。 Opensearch...
https://bibo-log.info/20200116/

まとめ

実際の環境では、ドキュメントサイズは大小混合しているので、スレッド数・間隔を変更しながら調整するしかなさそうです。

最後はCPU数のマシンパワーでぶん殴るしかなさそうなのが残念というか…まだ見つけられていないパラメーターがあるかもしれないので探していきたいです…。

スポンサーリンク
アドセンス1
アドセンス1
ブログランキング・にほんブログ村へ

シェアする

フォローする