错误:打开的文件过多 | 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 的默认启动脚本时,请执行以下操作以增加限制:
- 打开
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。增加用户的限制
要更改非根用户的最大打开文件数,请更改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。