Entorno
Adobe Experience Manager
Problema/Síntomas
Los archivos de registro contienen el error "Demasiados archivos' y Adobe Experience Manager (AEM) no responde.
La solución a este problema es:
A. Averigüe qué archivos o sockets se dejan abiertos
Nota: Los límites de archivos abiertos se aplican al total de archivos abiertos combinados, tuberías y sockets, no solo a los archivos.
En la plataforma Linux, la variable Lista de archivos abiertos (lsof
) se puede utilizar para depurar qué recursos mantiene abiertos el proceso.
Este es un ejemplo de secuencia de comandos para recopilar elementos útiles lsof
output:
#!/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
Salida de ejemplo:
$`>` ./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
Inspeccione la salida del archivo lsof-sorted-counts-*.txt
generado. Muestra qué archivos o sockets mantiene actualmente abiertos el proceso.
Si encuentra sockets abiertos o archivos listados que aún no deberían estar abiertos, es probable que se deba a un error de aplicación. Actualice el código de su aplicación para cerrar los archivos y sockets después de usarlos.
Una causa común de los sockets abiertos persistentes es el código personalizado que hace el servicio web. En muchos casos, bibliotecas como Apache Commons HttpClient
se utilizan, pero los desarrolladores nunca cierran las conexiones. Consulte este artículo para obtener más información sobre Apache Commons HttpClient
.
B. Aumento del límite para la sesión shell
Compruebe el límite del usuario para el máximo de archivos abiertos y, a continuación, ejecute lo siguiente como el mismo usuario que AEM proceso se ejecuta como:
ulimit -Sn ulimit -Hn
Cuando use el script de inicio predeterminado de AEM/CQ, haga lo siguiente para aumentar el límite:
crx-quickstart/bin/start
para editarloCQ_MAX_OPEN_FILES
en la parte superior del script: CQ_MAX_OPEN_FILES=8192 export CQ_MAX_OPEN_FILES
Si ve el error -bash: ulimit: open files: cannot modify limit: Operation not permitted
al iniciar AEM, la configuración anterior no funciona.
En su lugar, es necesario aumentar el límite en /etc/security/limits.conf
. A continuación hay detalles sobre cómo reconfigurar el límite de usuarios.
Si está usando un servidor de aplicaciones de terceros como JBoss o Websphere, siga las secciones a continuación y verifique con la documentación del proveedor.
Nota: Si ninguna de las configuraciones de este artículo resuelve el problema, entonces vea qué archivos están abiertos usando el comando lsof -p
(-p es el id de proceso del proceso problemático). Puede ser que su aplicación esté dejando abiertos los gestores de archivos. Si ve que los controladores los gestiona principalmente AEM y no su aplicación, póngase en contacto con el servicio de asistencia.
C. Aumentar los límites del usuario
Para cambiar el número máximo de archivos abiertos para usuarios que no sean raíz, cambie la variable file/etc/security/limits.conf
. Puede establecer el límite por usuario:
crx_process_username soft nofile 8092
crx_process_username hard nofile 20000
Nota: Esta configuración no tendrá efecto hasta la próxima vez que el usuario inicie sesión.
D. Aumentar el límite del sistema
A veces, el límite de usuarios es lo suficientemente alto, pero el propio sistema ha alcanzado su número máximo de archivos. Ejecute lo siguiente como su/root user:
cat /proc/sys/fs/file-max
fs.file-max = 300000
sysctl -p
cat /proc/sys/fs/file-max
Nota: Esta configuración no tendrá efecto hasta la próxima vez que el usuario inicie sesión.
Causa
La causa es una de las dos posibilidades:
Más información
Este error se produce cuando el sistema o el usuario utiliza su número máximo de controladores de archivos.
También puede hacer lo siguiente:
/libs/granite/monitoring/config
/libs/granite/monitoring/config