错误:打开的文件过多 | AEM

文章解决了日志文件包含错误“文件太多”,导致Adobe Experience Manager (AEM)未响应的问题。

描述 description

环境

Adobe Experience Manager

问题/症状

日志文件包含错误“文件太多”,并且Adobe Experience Manager (AEM)没有响应。

解决方法 resolution

这个问题的解决方法是:

  1. 找出导致达到打开文件限制的原因
  2. 要么增加限制,要么修复应用程序错误。

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 的默认启动脚本时,请执行以下操作以增加限制:

  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

注意:此配置在用户下次登录时才会生效。

天增加系统限制

有时,用户限制足够高,但系统本身已达到其最大文件数。 以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