錯誤:開啟的檔案過多 | 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 的預設開始指令碼時,請執行以下操作以增加上限:
- 開啟
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是有問題的處理序的處理序識別碼)。 可能是您的應用程式使得檔案控制代碼處於開啟狀態。如果您發現這些控制代碼主要由 AEM 而不是您的應用程式持有,請和支援人員聯絡。
C。增加使用者的限制
若要變更非根使用者最大開啟檔案數,請變更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
注意:此設定在使用者下次登入時才會生效。
原因
原因是以下兩種可能性之一:
- 應用程式在使用檔案或通訊端等資源後沒有將其關閉。
- 或者應用程式需要比流程允許的更多開啟的檔案。
其他資訊
當系統或使用者使用其最大數量的檔案控制代碼時,會發生此錯誤。
您也可以執行下列動作:
- 以管理員使用者身分登入http://localhost:4502/crxde 。
- 瀏覽至
/libs/granite/monitoring/config
- 用滑鼠右鍵按一下並刪除
/libs/granite/monitoring/config
的每個子節點 - 按一下「儲存全部」。 重新啟動CQ。