Ambiente
Adobe Experience Manager
Problema/Sintomi
I file di registro contengono l'errore "Troppi file e Adobe Experience Manager (AEM) non risponde.
La soluzione a questo problema consiste in:
A. Trova quali file o socket rimangono aperti
Nota: i limiti dei file aperti si applicano ai file aperti, ai tubi e alle prese combinati totali, non solo ai file.
Su piattaforma Linux, la Elenco dei file aperti (lsof
Il comando ) può essere utilizzato 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
Esamina l’output del file lsof-sorted-counts-*.txt
generato. Mostra quali file o socket sono attualmente aperti dal processo.
Se trovi i socket aperti o i file elencati che non dovrebbero ancora essere aperti, è probabile che sia dovuto a un bug dell'applicazione. Aggiorna il codice dell’applicazione per chiudere i file e i socket dopo averli utilizzati.
Una causa comune della presenza di socket aperti residui è il codice personalizzato che genera il servizio web. In molti casi, librerie come Apache Commons HttpClient
vengono utilizzati ma le connessioni non vengono mai chiuse dagli sviluppatori. Vedi articolo per maggiori dettagli su Apache Commons HttpClient
.
B. Aumenta il limite per la sessione della shell
Controlla il limite dell'utente per il numero massimo di file aperti, quindi esegui quanto segue come lo stesso utente che AEM processo viene eseguito come:
ulimit -Sn ulimit -Hn
Quando utilizzi lo script di avvio predefinito di AEM/CQ, effettua le operazioni seguenti per aumentare il limite:
crx-quickstart/bin/start
per la modificaCQ_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 come JBoss o Websphere, segui le sezioni seguenti e verifica con la documentazione del fornitore.
Nota: Se nessuna delle configurazioni di questo articolo risolve il problema, vedi quali file sono aperti utilizzando il comando lsof -p
(-p è l'id 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 il 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 diventerà effettiva solo al successivo accesso dell’utente.
D. Aumentare il limite del sistema
A volte, il limite utente è abbastanza alto, ma il sistema stesso ha raggiunto il suo numero massimo di file. Esegui quanto segue come utente su/root:
cat /proc/sys/fs/file-max
fs.file-max = 300000
sysctl -p
cat /proc/sys/fs/file-max
Nota: Questa configurazione ha effetto solo al successivo accesso dell'utente.
Causa
La causa è una delle due possibilità:
Informazioni aggiuntive
Questo errore si verifica quando il sistema o l'utente sta utilizzando i relativi handle di file con numero massimo.
Puoi anche effettuare le seguenti operazioni:
/libs/granite/monitoring/config
/libs/granite/monitoring/config