エラー:開いているファイルが多すぎます | 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
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
メモ:この設定は、次回ユーザーがログインするまで有効になりません。
日システムの上限を増やす
ユーザーの上限は十分高いが、システム自体がファイルの最大数に達している場合があります。 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 を再起動します。