エラー:開いているファイルが多すぎます | AEM
この記事では、ログファイルにエラー「ファイルが多すぎます」というエラーが発生し、Adobe Experience Manager(AEM) が応答しない問題を修正しました。
説明 description
環境
Adobe Experience Manager
問題/症状
ログファイルにはエラー「ファイルが多すぎます' Adobe Experience Manager(AEM) が応答しない問題を修正しました。
解決策 resolution
この問題の解決策は次のとおりです。
- 開いているファイルの上限に達している原因を調べる
- 上限を増やすか、アプリケーションのバグを修正する。
A.開いたままのファイルまたはソケットを探します。
注記:開くファイルの制限は、ファイルだけでなく、合計で開くファイル、パイプ、およびソケットに適用されます。
Linux プラットフォームでは、 開いているファイルのリスト (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
Inspectで生成された 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.ユーザーの制限を増やす
root 以外のユーザーが開くファイルの最大数を変更するには、 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 を再起動します。