問題

ログファイルにはエラー「Too many files」が含まれていて、AEM が応答しません。

原因

原因は、次の 2 つの可能性のいずれかです。

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

解決策

この問題の解決策は次のとおりです。

  1. 開いているファイルの制限に達していることを確認します
  2. 制限を増やすか、アプリケーションのバグを修正します。

開いているファイルまたはソケットを検索します

** 開いているファイルの制限は、ファイルだけでなく、開いたファイル、パイプおよびソケットの合計数にも適用されます。

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

生成された lsof-sorted-counts-*.txt ファイルの出力を検査します。  プロセスによって現在開いているファイルまたはソケットが表示されます。

まだ開いてはいけない、開いているソケットまたはファイルが一覧にある場合は、アプリケーションのバグが原因である可能性があります。  使用後にファイルとソケットを閉じるように、アプリケーションコードを更新します。

開いているソケットを長引かせる一般的な原因は、Web サービスを作成するカスタムコードです。  多くの場合、Apache Commons HttpClient などのライブラリは使用されますが、開発者によって接続が閉じられることは決してありません。  Apache Commons HttpClient について詳しくは、この記事を参照してください。

シェルセッションの制限を増やす

ユーザーの開いているファイルの上限数を確認し、AEM プロセスが実行されるユーザーと同じユーザーとして以下を実行します。

ulimit -Sn ulimit -Hn

AEM/CQ のデフォルトの開始スクリプトを使用する場合は、次の手順を実行して上限を引き上げます。

  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 によって保持されている場合は、サポートにお問い合わせください。

ユーザーの上限を引き上げる

ルート以外のユーザーの最大オープンファイル数を変更するには、/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

注意:

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

追加情報

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

ダウンロード

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

リーガルノーティス   |   プライバシーポリシー