エラー:開いているファイルが多すぎます | AEM

この記事では、ログファイルに「ファイルが多すぎます」というエラーが含まれ、その結果Adobe Experience Manager(AEM)が応答しない問題について説明します。

説明 description

環境

Adobe Experience Manager

問題/症状

ログファイルに「ファイルが多すぎます」 エラーが含まれ、Adobe Experience Manager(AEM)が応答しません。

解決策 resolution

次に、この問題の解決策を示します。

  1. 開いているファイルの上限に達している原因を調べる
  2. 上限を増やすか、アプリケーションのバグを修正する。

A.開いたままになっているファイルまたはソケットを見つけ す。

注:開いているファイルの上限は、ファイルだけでなく、開いているファイル、パイプ、ソケットを組み合わせた合計に適用されます。

Linux プラットフォームでは、プロセスによって開かれたままになっているリソースをデバッグするために、List of Open Filelsof)コマンドを使用できます。

次に、有用な 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 スクリプトを使用している場合は、次のようにして上限を増やします。

  1. 編集のために crx-quickstart/bin/start を開きます
  2. スクリプトの先頭に変数 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 ユーザーとして、次のコマンドを実行します。

  1. オペレーティングシステムの開いているファイルの設定の最大値を確認します(20000 未満の場合は、この設定を増やすことは理にかなっています)。
    cat /proc/sys/fs/file-max
  2. /etc/sysctl.confに次の行を追加して、システムの開いているファイルの最大値を増やします:
    fs.file-max = 300000
  3. 次のコマンドを実行します。
    sysctl -p
  4. 次のコマンドを実行した場合に、新しい値が表示されることを確認します:
    cat /proc/sys/fs/file-max

メモ:この設定は、次回ユーザーがログインするまで有効になりません。

原因

原因は、次の 2 つの可能性のうちの 1 つです。

  • アプリケーションが、ファイルやソケットなどのリソースを使用した後、閉じていない。
  • または、アプリケーションが、プロセスで許可されているよりも多くの開いているファイルを必要としている。

追加情報

このエラーは、システムまたはユーザーが最大数のファイルハンドルを使用している際に発生します。

次の操作も実行できます。

  1. 管理者ユーザーとしてhttp://localhost:4502/crxdeにログインします。
  2. /libs/granite/monitoring/config を参照します
  3. /libs/granite/monitoring/config の各サブノードを右クリックして削除します。
  4. 「すべて保存」をクリックします。 CQ を再起動します。
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f