エラー:開いているファイルが多すぎる| AEM
この記事では、Adobe Experience Manager(AEM)が応答しない結果として、ログファイルに「ファイルが多すぎます」というエラーが含まれる問題を解決します。
説明 description
環境
Adobe Experience Manager
問題/症状
ログ ファイルに「ファイルが多すぎます」 エラーが含まれており、Adobe Experience Manager (AEM)が応答しません。
解決策 resolution
この問題の解決策は次のとおりです。
- 開いているファイルの上限に達している原因を調べる
- 上限を増やすか、アプリケーションのバグを修正する。
A.開いたままになっているファイルまたはソケットを検索します
注意 – 開いているファイルの制限は、ファイルだけでなく、開いているファイル、パイプ、ソケットを組み合わせた合計に適用されます。
Linux プラットフォームでは、List of Open File (lsof) コマンドを使用して、プロセスによって開かれているリソースをデバッグできます。
便利なlsof出力を収集するためのサンプルスクリプトを次に示します。
#!/bin/bash
if [ $# -eq 0 ]
then
echo "No PID specified"
echo "Run command with PID, for example:"
echo "lsof-script.sh 12345"
exit 2
fi
JAVA_PROCESS_PID=$1
lsof -p $JAVA_PROCESS_PID > lsof-output-$JAVA_PROCESS_PID.txt
echo "Files open by the process:"
cat lsof-output-$JAVA_PROCESS_PID.txt | wc -l
echo "Generated output file with counts of grouped open files lsof-sorted-counts-$JAVA_PROCESS_PID.txt"
cat lsof-output-$JAVA_PROCESS_PID.txt | awk '{print $9}' | sed -e "s/\(.*\)\(segmentstore\).*$/\1\2/" | sed -e "s/\(.*\)\(repository[ /] index\).*$/\1\2/" | sed -e "s/\(.*\)\(felix[ /] bundle\).*$/\1\2/" | sed -e "s/\(.*\)\([ /] lib\).*$/\1\2/" | sed -e "s/\(.*\)\([ /] logs\).*$/\1\2/" | sed -e "s/\(.*\)\([ /] ext\).*$/\1\2/" | sort | uniq -c | sort -rn -k1 > lsof-sorted-counts-$JAVA_PROCESS_PID.txt
echo "Total open files in OS:"
lsof | wc -l
サンプル出力:
$> ./lsof-script.sh 18070
Files open by the process:
1995
Generated output file with counts of grouped open files: lsof-sorted-counts-18070.txt
Total open files in OS:
18399
生成されたlsof-sorted-counts-*.txt ファイルの出力を調べます。 これは、どのファイルやソケットが、現在、プロセスによって開かれたままになっているかを示します。
まだ開いてはいけない開いているソケットやファイルが見つかった場合は、アプリケーションのバグが原因である可能性があります。 アプリケーションコードを更新して、ファイルとソケットを使用した後に閉じてください。
オープンなソケットが残る一般的な原因は、web サービスを作成するカスタムコードです。 多くの場合、Apache Commons HttpClientなどのライブラリが使用されますが、開発者が接続を閉じることはありません。 Apache Commons HttpClientについて詳しくは、この記事を参照してください。
B.シェルセッションの制限を増やします
開いているファイルの最大数についてユーザーの制限を確認し、AEM プロセスが実行されるのと同じユーザーとして次の操作を実行します。
ulimit -Sn ulimit -Hn
AEM/CQ のデフォルトの start スクリプトを使用している場合は、次のようにして上限を増やします。
- 編集のために
crx-quickstart/bin/startを開きます - スクリプトの先頭に変数
CQ_MAX_OPEN_FILESを追加します。CQ_MAX_OPEN_FILES=8192 export CQ_MAX_OPEN_FILES
AEM の起動時に -bash: ulimit: open files: cannot modify limit: Operation not permitted というエラーが表示される場合は、前述の設定は動作しません。
代わりに、/etc/security/limits.conf で上限を増やす必要があります。 ユーザーの上限の再設定方法について詳しくは、後述の説明を参照してください。
JBossやWebsphereなどのサードパーティ製アプリケーションサーバーを使用している場合は、以下の節に従い、ベンダーのドキュメントで確認してください。
注意:この記事の設定のいずれも問題を解決しない場合は、コマンド lsof -pを使用してどのファイルが開いているかを確認してください( – pは問題のあるプロセスのプロセス ID)。 アプリケーションがファイルハンドルを開いたままにしている可能性があります。 ハンドルが主にアプリケーションではなく AEM によって保持されていることがわかった場合は、サポートにお問い合わせください。
C.ユーザーの制限を増やします
ルート以外のユーザーの開いているファイルの最大数を変更するには、file/etc/security/limits.confを変更します。 ユーザーごとに上限を設定できます。
crx_process_username soft nofile 8092
crx_process_username hard nofile 20000
注意:この設定は、ユーザーが次回ログインするまで有効になりません。
D.システム制限を増やします
場合によっては、ユーザーの制限が十分に高くなっていますが、システム自体は最大数のファイルに達しています。 su/root ユーザーとして次を実行します。
- オペレーティングシステムの最大開くファイル設定を確認してください(20000以下の場合は、この設定を増やすのが理にかなっています)。
cat /proc/sys/fs/file-max - この行を/etc/sysctl.confに追加して、システムのオープン ファイルの最大値を増やします。
fs.file-max = 300000 - 次のコマンドを実行します。
sysctl -p - 次のコマンドを実行する際に、新しい値が表示されていることを確認します。
cat /proc/sys/fs/file-max
注意:この設定は、ユーザーが次回ログインするまで有効になりません。
原因:
原因は2つの可能性のうちの1つです。
- アプリケーションが、ファイルやソケットなどのリソースを使用した後、閉じていない。
- または、アプリケーションが、プロセスで許可されているよりも多くの開いているファイルを必要としている。
追加情報
このエラーは、システムまたはユーザーが最大数のファイルハンドルを使用している場合に発生します。
次の操作も実行できます。
- http://localhost:4502/crxdeに管理者ユーザーとしてログインします。
/libs/granite/monitoring/configを参照/libs/granite/monitoring/configの各サブノードを右クリックして削除- 「すべて保存」をクリックします。 CQを再起動します。