Erreur : trop de fichiers ouverts | AEM

L’article traite du problème où les fichiers journaux contiennent l’erreur "Trop de fichiers" en raison de laquelle Adobe Experience Manager (AEM) ne répond pas.

Description description

Environnement

Adobe Experience Manager

Problème/Symptômes

Les fichiers journaux contiennent l’erreur 'Trop de fichiers' et Adobe Experience Manager (AEM) ne répond pas.

Résolution resolution

La solution à ce problème est la suivante :

  1. Découvrez ce qui fait que la limite de fichiers ouverts est atteinte.
  2. Augmentez la limite ou corrigez les bugs de l’application.

A. Rechercher les fichiers ou les sockets qui restent ouverts

Remarque : Les limites liées aux fichiers ouverts s’appliquent au total des fichiers ouverts, des tuyaux et des sockets, et pas seulement aux fichiers.

Sur la plateforme Linux, la commande Liste des fichiers ouverts (lsof) peut être utilisée pour déboguer les ressources qui sont conservées ouvertes par le processus.

Voici un exemple de script pour collecter une sortie lsof utile :

#!/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

Exemple de sortie :

$> ./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 la sortie du fichier lsof-sorted-counts-*.txt généré.  Elle indique les fichiers ou les sockets qui sont actuellement gardés ouverts par le processus.

Si vous trouvez des sockets ou des fichiers ouverts qui ne doivent pas encore être ouverts, cela est probablement dû à un bogue de l’application. Mettez à jour le code de votre application pour fermer les fichiers et les sockets après les avoir utilisés.

Le code personnalisé qui crée un service Web est une cause courante de la persistance des sockets ouverts. Dans de nombreux cas, des bibliothèques comme Apache Commons HttpClient sont utilisées, mais les connexions ne sont jamais fermées par les développeurs. Pour plus d'informations sur Apache Commons HttpClient, reportez-vous à cet article .

B. Augmentez la limite de la session shell

Vérifiez la limite de l’utilisateur pour le nombre maximal de fichiers ouverts, puis exécutez ce qui suit en tant que même utilisateur que le processus AEM s’exécute comme suit :

ulimit -Sn ulimit -Hn

Lors de l’utilisation du script de démarrage par défaut d’AEM/CQ, procédez comme suit pour augmenter la limite :

  1. Ouvrez crx-quickstart/bin/start pour modification.
  2. Ajoutez la variable CQ_MAX_OPEN_FILES en haut du script : CQ_MAX_OPEN_FILES=8192 export CQ_MAX_OPEN_FILES.

Si l’erreur -bash: ulimit: open files: cannot modify limit: Operation not permitted s’affiche lors du démarrage d’AEM, la configuration ci-dessus ne fonctionne pas.

Au lieu de cela, il est nécessaire d’augmenter la limite dans /etc/security/limits.conf. Voir ci-dessous pour plus d’informations sur la reconfiguration de la limite utilisateur.

Si vous utilisez un serveur d’applications tiers tel que JBoss ou Websphere, suivez les sections ci-dessous et vérifiez la documentation du fournisseur.

Remarque : Si aucune des configurations de cet article ne résout le problème, consultez les fichiers ouverts à l’aide de la commande lsof -p (-p est l’ID de processus du processus problématique). Il se peut que votre application laisse les descripteurs de fichiers ouverts. Si vous constatez que les descripteurs sont détenus principalement par AEM et non par votre application, contactez le support technique.

C. Augmentation des limites de l’utilisateur

Pour modifier le nombre maximal de fichiers ouverts pour les utilisateurs non-root, modifiez le file/etc/security/limits.conf. Vous pouvez définir la limite par utilisateur :

crx_process_username soft nofile 8092

crx_process_username hard nofile 20000

Remarque : Cette configuration ne prend effet que la prochaine fois que l’utilisateur se connecte.

D. Augmentation de la limite du système

Parfois, la limite de l’utilisateur est suffisamment élevée, mais le système lui-même a atteint son nombre maximum de fichiers. Exécutez ce qui suit en tant qu’utilisateur su/root :

  1. Vérifiez le paramètre d’ouverture de fichier maximal sur le système d’exploitation (s’il est inférieur à 20 000, il est logique d’augmenter ce paramètre).
    cat /proc/sys/fs/file-max
  2. Ajoutez la ligne suivante à /etc/sysctl.conf pour augmenter la valeur maximale du fichier d’ouverture du système :
    fs.file-max = 300000
  3. Exécutez cette commande :
    sysctl -p
  4. Vérifiez que la nouvelle valeur s’affiche lorsque vous exécutez cette commande :
    cat /proc/sys/fs/file-max

Remarque : Cette configuration ne prend effet que la prochaine fois que l’utilisateur se connecte.

Cause

La cause en est l'une des deux possibilités :

  • L’application ne ferme pas les ressources telles que les fichiers ou les sockets après les avoir utilisées.
  • Ou l’application nécessite plus de fichiers ouverts que ce qui est autorisé par le processus.

Informations supplémentaires

Cette erreur se produit lorsque le système ou l’utilisateur utilise son nombre maximal de fichiers gérés.

Vous pouvez également effectuer les opérations suivantes :

  1. Connectez-vous à http://localhost:4502/crxde en tant qu’utilisateur administrateur.
  2. Accédez à /libs/granite/monitoring/config
  3. Cliquez avec le bouton droit et supprimez chaque sous-noeud de /libs/granite/monitoring/config.
  4. Cliquez sur Enregistrer tout. Redémarrez CQ.
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f