Errore: Troppi file aperti | AEM

Ultimo aggiornamento: 2023-05-17

Descrizione

Ambiente
Adobe Experience Manager

Problema/Sintomi
I file di registro contengono l'errore "Troppi file e Adobe Experience Manager (AEM) non risponde.

Risoluzione

La soluzione a questo problema consiste in:

  1. Individuare la causa del raggiungimento del limite di file aperti
  2. Aumentare il limite o risolvere i bug dell’applicazione.

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 (lsofIl 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:

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

  1. Controlla l’impostazione massima dei file aperti sul sistema operativo (se è inferiore a 20.000, è opportuno aumentarla):
    cat /proc/sys/fs/file-max
  2. Aggiungi questa riga a /etc/sysctl.conf per aumentare il valore massimo del file aperto del 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 sta utilizzando i relativi handle di file con numero massimo.

Puoi anche effettuare le seguenti operazioni:

  1. Accedi a http://localhost:4502/crxde come utente amministratore.
  2. Sfoglia per /libs/granite/monitoring/config
  3. Fai clic con il pulsante destro del mouse ed elimina ogni sotto-nodo di /libs/granite/monitoring/config
  4. Fai clic su Salva tutto. Riavvia CQ.

In questa pagina