概要
Java アプリケーションでは、プロセスごとに使用する最大ヒープメモリを設定する必要があります。 Fess では、以下の3つのコンポーネントでそれぞれメモリ設定を行います。
Fess ウェブアプリケーション
クローラープロセス
OpenSearch
適切なメモリ設定を行うことで、パフォーマンスの向上と安定した動作を実現できます。
Fess ウェブアプリケーションのメモリ設定
設定が必要な場合
以下のような場合にメモリサイズの調整を検討してください。
fess.logに OutOfMemory エラーが記録される大量の同時アクセスを処理する必要がある
管理画面の操作が遅い、またはタイムアウトする
デフォルトのメモリサイズは、一般的な利用では十分ですが、負荷が高い環境では増量が必要です。
環境変数による設定
環境変数 FESS_HEAP_SIZE を設定します。
export FESS_HEAP_SIZE=2g
単位:
m: メガバイトg: ギガバイト
RPM/DEBパッケージの場合
RPMパッケージでインストールした場合は、/etc/sysconfig/fess を編集します。
FESS_HEAP_SIZE=2g
DEBパッケージの場合は、/etc/default/fess を編集します。
FESS_HEAP_SIZE=2g
警告
メモリサイズを変更した後は、Fess サービスを再起動する必要があります。
推奨メモリサイズ
| 環境 | 推奨ヒープサイズ | 備考 |
|---|---|---|
| 開発・テスト環境 | 512m〜1g | 小規模なインデックス |
| 小規模本番環境 | 1g〜2g | 数万〜数十万ドキュメント |
| 中規模本番環境 | 2g〜4g | 数十万〜数百万ドキュメント |
| 大規模本番環境 | 4g〜8g | 数百万以上のドキュメント |
クローラーのメモリ設定
設定が必要な場合
以下のような場合にクローラーのメモリサイズを増やす必要があります。
並列クロール数を増やす場合
大きなファイルをクロールする場合
クロール実行中に OutOfMemory エラーが発生する場合
設定方法
app/WEB-INF/classes/fess_config.properties または /etc/fess/fess_config.properties を編集します。
jvm.crawler.options=-Xmx512m
例えば、1GB に変更する場合:
jvm.crawler.options=-Xmx1g
注釈
この設定は、クローラープロセス単位(スケジューラーのジョブ単位)で適用されます。 複数のクロールジョブを同時に実行する場合は、それぞれのジョブで指定したメモリが使用されます。
推奨設定
通常のWebクロール: 512m〜1g
大量並列クロール: 1g〜2g
大きなファイルのクロール: 2g〜4g
詳細なJVMオプション
クローラーの詳細なJVMオプションは、jvm.crawler.options で設定できます。 デフォルトの設定には、以下のような最適化が含まれています。
主要なオプション:
| オプション | 説明 |
|---|---|
-Xms128m -Xmx512m | 初期ヒープサイズと最大ヒープサイズ |
-XX:MaxMetaspaceSize=128m | Metaspaceの最大サイズ |
-XX:+UseG1GC | G1ガベージコレクタの使用 |
-XX:MaxGCPauseMillis=60000 | GC停止時間の目標値(60秒) |
-XX:-HeapDumpOnOutOfMemoryError | OutOfMemory時のヒープダンプを無効化 |
OpenSearch のメモリ設定
重要な考慮事項
OpenSearch では、以下の2点を考慮してメモリを設定する必要があります。
Javaヒープメモリ: OpenSearch のプロセスで使用
OSファイルシステムキャッシュ: 検索パフォーマンスに重要
警告
Javaヒープメモリを大きくしすぎると、OSファイルシステムキャッシュに 使用できるメモリが減少し、検索パフォーマンスが低下します。
設定方法
Linux環境
OpenSearch のヒープメモリは、環境変数またはOpenSearch の設定ファイルで指定します。
環境変数で設定:
export OPENSEARCH_HEAP_SIZE=2g
または、config/jvm.options を編集:
-Xms2g
-Xmx2g
注釈
最小ヒープサイズ(-Xms)と最大ヒープサイズ(-Xmx)は同じ値に設定することを推奨します。
Windows環境
config\jvm.options ファイルを編集します。
-Xms2g
-Xmx2g
推奨メモリサイズ
| インデックスサイズ | 推奨ヒープサイズ | 推奨合計メモリ |
|---|---|---|
| 〜10GB | 2g | 4GB以上 |
| 10GB〜50GB | 4g | 8GB以上 |
| 50GB〜100GB | 8g | 16GB以上 |
| 100GB以上 | 16g〜31g | 32GB以上 |
警告
OpenSearch のヒープメモリは 32GB を超えないように設定してください。 32GB を超えると、Compressed OOP が無効になりメモリ効率が低下します。
ベストプラクティス
物理メモリの50%をヒープに割り当て
サーバーの物理メモリの約50%を OpenSearch のヒープに割り当てます。 残りはOSとファイルシステムキャッシュに使用されます。
最大31GBまで
ヒープサイズは最大31GBまでとし、それ以上必要な場合はノードを増やします。
本番環境での確認
OpenSearch の公式ドキュメントを参照し、環境に応じた最適な設定を行ってください。
サジェスト・サムネイル処理のメモリ設定
サジェスト生成プロセス
サジェスト生成処理のメモリ設定は、jvm.suggest.options で設定します。
jvm.suggest.options=-Xmx256m
デフォルトでは以下の設定が使用されます:
初期ヒープ: 128MB
最大ヒープ: 256MB
Metaspace最大: 128MB
サムネイル生成プロセス
サムネイル生成処理のメモリ設定は、jvm.thumbnail.options で設定します。
jvm.thumbnail.options=-Xmx256m
デフォルトでは以下の設定が使用されます:
初期ヒープ: 128MB
最大ヒープ: 256MB
Metaspace最大: 128MB
注釈
サムネイル生成で大きな画像を処理する場合は、メモリを増やす必要があります。
メモリ監視とチューニング
メモリ使用状況の確認
Fess のメモリ使用状況
管理画面の「システム情報」で確認できます。
または、JVMの監視ツールを使用:
jps -l # Fessプロセスを確認
jstat -gcutil <PID> 1000 # GC統計を1秒ごとに表示
OpenSearchのメモリ使用状況
curl -X GET "localhost:9201/_nodes/stats/jvm?pretty"
curl -X GET "localhost:9201/_cat/nodes?v&h=heap.percent,ram.percent"
メモリ不足の兆候
以下のような症状が現れた場合、メモリ不足の可能性があります。
Fess ウェブアプリケーション:
レスポンスが遅い
OutOfMemoryErrorがログに記録されるプロセスが予期せず終了する
クローラー:
クロールが途中で停止する
OutOfMemoryErrorがfess_crawler.logに記録される大きなファイルのクロールに失敗する
OpenSearch:
検索が遅い
インデックス作成が遅い
circuit_breaker_exceptionエラーが発生する
チューニング手順
現在のメモリ使用状況を確認
各コンポーネントのメモリ使用状況を監視します。
ボトルネックを特定
どのコンポーネントがメモリ不足かを特定します。
段階的に増加
一度に大きく増やすのではなく、25-50%ずつ増やして効果を確認します。
システム全体のバランスを考慮
各コンポーネントの合計メモリが物理メモリを超えないようにします。
継続的な監視
メモリ使用状況を継続的に監視し、必要に応じて調整します。
メモリリーク対策
メモリリークが疑われる場合:
ヒープダンプの取得
jmap -dump:format=b,file=heap.bin <PID>
ヒープダンプの分析
Eclipse Memory Analyzer (MAT) などのツールで分析します。
問題の報告
メモリリークを発見した場合は、GitHub Issuesで報告してください。
トラブルシューティング
OutOfMemoryError が発生する
Fess ウェブアプリケーション:
FESS_HEAP_SIZEを増やします。同時アクセス数を制限します。
ログレベルを下げて、ログ出力によるメモリ使用を減らします。
クローラー:
jvm.crawler.optionsの-Xmxを増やします。並列クロール数を減らします。
大きなファイルを除外するようクロール設定を調整します。
OpenSearch:
ヒープサイズを増やします(最大31GBまで)。
インデックスのシャード数を見直します。
クエリの複雑さを確認します。
GCによる停止時間が長い
G1GCの設定を調整します。
ヒープサイズを適切に設定します(大きすぎても小さすぎてもGCが頻発)。
より新しいJavaバージョンへの更新を検討します。
メモリ設定後も性能が改善しない
CPU、ディスクI/O、ネットワークなど他のリソースを確認します。
インデックスの最適化を行います。
クエリやクロール設定を見直します。
参考情報
ポートとネットワーク設定 - ポートとネットワーク設定
クローラー詳細設定 - クローラー詳細設定
ログ設定 - ログ設定