錯誤:開啟的檔案過多 | AEM

文章解決記錄檔包含錯誤的問題。檔案過多'造成Adobe Experience Manager (AEM)沒有回應。

說明 description

環境

Adobe Experience Manager

問題/症狀

記錄檔包含錯誤'檔案過多  而Adobe Experience Manager (AEM)沒有回應。

解決方法 resolution

這個問題的解決方案是:

  1. 找出導致達到開啟檔案上限的原因
  2. 可增加上限或者修復應用程式錯誤。

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 的預設開始指令碼時,請執行以下操作以增加上限:

  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.增加使用者的限制

若要變更非根使用者最大開啟檔案數,請變更 file/etc/security/limits.conf. 您可以為每個使用者設定上限:

crx_process_username soft nofile 8092

crx_process_username hard nofile 20000

注意:此設定在使用者下次登入時才會生效。

D.提高系統限制

有時,使用者限制夠高,但系統本身已達到其最大檔案數。 以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

注意:此設定在使用者下次登入時才會生效。

原因

原因是以下兩種可能性之一:

  • 應用程式在使用檔案或通訊端等資源後沒有將其關閉。
  • 或者應用程式需要比流程允許的更多開啟的檔案。

其他資訊

當系統或使用者使用其最大數量的檔案控制代碼時,會發生此錯誤。

您也可以執行下列動作:

  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