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 è:

  1. Individuare la causa del raggiungimento del limite di file aperti
  2. 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:

  1. Apri crx-quickstart/bin/start per la modifica
  2. 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:

  1. Controllare l'impostazione massima dei file aperti sul sistema operativo (se è inferiore a 20000, è consigliabile aumentarla).
    cat /proc/sys/fs/file-max
  2. Aggiungi questa riga a /etc/sysctl.conf per aumentare il valore massimo dei file aperti nel sistema:
    fs.file-max = 300000
  3. Esegui questo comando:
    sysctl -p
  4. 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:

  1. Accedi a http://localhost:4502/crxde come utente amministratore.
  2. Passa a /libs/granite/monitoring/config
  3. Fare clic con il pulsante destro del mouse ed eliminare ogni sottonodo di /libs/granite/monitoring/config
  4. Fai clic su Salva tutto. Riavvia CQ.
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f