Errore: troppi file aperti | AEM
L'articolo risolve il problema relativo all'errore 'Troppi file' nei file di registro, a causa del quale Adobe Experience Manager (AEM) non risponde.
Descrizione description
Ambiente
Adobe Experience Manager
Problema/Sintomi
I file di log contengono l'errore 'Troppi file' e Adobe Experience Manager (AEM) non risponde.
Risoluzione resolution
La soluzione a questo problema è:
- Individuare la causa del raggiungimento del limite di file aperti
- Aumentare il limite o risolvere i bug dell’applicazione.
A. Trovare i file o i socket rimasti aperti
Nota: i limiti per i file aperti si applicano al totale di file, pipe e socket aperti, non solo ai file.
Sulla piattaforma Linux è possibile utilizzare il comando Elenco di file aperti (lsof
) per eseguire il debug delle risorse aperte dal processo.
Di seguito è riportato uno script di esempio per raccogliere output lsof
utili:
#!/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
Output di esempio:
$> ./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: output del file lsof-sorted-counts-*.txt
generato. Mostra quali file o socket sono attualmente aperti dal processo.
Se trovi socket aperti o file elencati che non dovrebbero essere ancora aperti, è probabile che sia dovuto a un bug dell’applicazione. Aggiorna il codice dell’applicazione per chiudere file e socket dopo averli utilizzati.
Una causa comune della presenza di socket aperti residui è il codice personalizzato che genera il servizio web. In molti casi vengono utilizzate librerie come Apache Commons HttpClient
, ma le connessioni non vengono mai chiuse dagli sviluppatori. Consulta questo articolo per informazioni dettagliate su Apache Commons HttpClient
.
B. Aumentare il limite per la sessione della shell
Verificare il limite dell'utente per il numero massimo di file aperti, quindi eseguire il comando seguente come lo stesso utente che esegue il processo AEM:
ulimit -Sn ulimit -Hn
Quando utilizzi lo script di avvio predefinito di AEM/CQ, effettua le operazioni seguenti per aumentare il limite:
- Apri
crx-quickstart/bin/start
per la modifica - Aggiungi la variabile
CQ_MAX_OPEN_FILES
nella parte superiore dello script:CQ_MAX_OPEN_FILES=8192 export CQ_MAX_OPEN_FILES
Se all’avvio di AEM visualizzi l’errore -bash: ulimit: open files: cannot modify limit: Operation not permitted
, la configurazione precedente non funziona.
È quindi necessario aumentare il limite in /etc/security/limits.conf
. Per maggiori dettagli su come riconfigurare il limite dell’utente, vedi di seguito.
Se utilizzi un server applicazioni di terze parti, ad esempio JBoss o Websphere, consulta le sezioni seguenti e verifica la documentazione del fornitore.
Nota: se nessuna delle configurazioni descritte in questo articolo è in grado di risolvere il problema, verificare i file aperti tramite il comando lsof -p
(-p è l'ID processo del processo problematico). È possibile che l’applicazione lasci aperti gli handle di file. Se noti che gli handle sono tenuti aperti principalmente da AEM e non dalla tua applicazione, contatta il supporto.
C. Aumentare i limiti dell'utente
Per modificare il numero massimo di file aperti per gli utenti non root, modificare file/etc/security/limits.conf
. Puoi impostare il limite per ogni utente:
crx_process_username soft nofile 8092
crx_process_username hard nofile 20000
Nota: questa configurazione ha effetto solo al successivo accesso dell’utente.
G. Aumentare il limite di sistema
A volte il limite utente è sufficientemente alto, ma il sistema ha raggiunto il numero massimo di file. Esegui la procedura seguente come utente su/root:
- Controllare l'impostazione massima dei file aperti sul sistema operativo (se è inferiore a 20000, è consigliabile aumentarla).
cat /proc/sys/fs/file-max
- Aggiungi questa riga a /etc/sysctl.conf per aumentare il valore massimo dei file aperti nel sistema:
fs.file-max = 300000
- Esegui questo comando:
sysctl -p
- Verifica che il nuovo valore venga visualizzato quando esegui questo comando:
cat /proc/sys/fs/file-max
Nota: questa configurazione ha effetto solo al successivo accesso dell’utente.
Causa
La causa è una delle due possibilità:
- L’applicazione non riesce a chiudere le risorse, come file o socket, dopo averle utilizzate.
- L’applicazione richiede un numero di file aperti superiore a quello consentito dal processo.
Informazioni aggiuntive
Questo errore si verifica quando il sistema o l’utente utilizza il numero massimo di handle di file.
È inoltre possibile effettuare le seguenti operazioni:
- Accedi a http://localhost:4502/crxde come utente amministratore.
- Passa a
/libs/granite/monitoring/config
- Fare clic con il pulsante destro del mouse ed eliminare ogni sottonodo di
/libs/granite/monitoring/config
- Fai clic su Salva tutto. Riavvia CQ.