Erreur : Trop de fichiers ouverts | AEM

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

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, le 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 à collecter utile lsof output :

#!/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 résultat:

$`>`  ./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

Inspectez 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. Voir cet article pour plus d’informations sur Apache Commons HttpClient.

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, vérifiez 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 la variable 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. Augmenter la limite du système

Parfois, la limite 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 du nombre de fichiers ouverts 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 le nouveau nombre 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 de la souris et supprimez chaque sous-noeud de /libs/granite/monitoring/config
  4. Cliquez sur Tout enregistrer. Redémarrez CQ.

Sur cette page