Problème

Les fichiers journaux contiennent l’erreur « Trop de fichiers » et AEM ne répond pas.

Cause

La cause est l’une de ces deux possibilités :

  • L’application ne ferme pas les ressources telles que les fichiers ou les sockets après leur utilisation.
  • Ou bien l’application requiert plus de fichiers ouverts que ce qui est permis par le processus.

Solution

La solution à ce problème est :

  1. Découvrir ce qui est à l’origine de la limitation du nombre de dossiers ouverts.
  2. Augmenter la limite ou corriger les bugs de l’application.

Trouver quels fichiers ou sockets sont restés ouverts

** Notez que les limites de fichiers ouverts s’appliquent au total combiné des fichiers ouverts, des canaux et des sockets ; et pas seulement aux fichiers.

Sur la plate-forme Linux, la commande lsof peut être utilisée pour déboguer les ressources maintenues ouvertes par le processus.

Voici un exemple de script pour collecter des sorties lsof utiles :

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

Examinez la sortie du fichier lsof-sorted-counts-*.txt généré.  Il indique quels fichiers ou sockets sont actuellement maintenus ouverts par le processus.

Si vous trouvez des sockets ou des fichiers ouverts qui ne devraient plus l’être, c’est probablement dû à un bogue de l’application.  Mettez à jour votre code d’application pour fermer les fichiers et les sockets après utilisation.

Une cause courante du maintien des sockets ouverts est le code personnalisé qui fait le service web.  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.  Consultez cet article pour plus d’informations sur Apache HttpClient.

Augmentation de la limite de la session de shell

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

ulimit -Sn ulimit -Hn

Lorsque vous utilisez le 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 éditer.
  2. Ajouter la variable CQ_MAX_OPEN_FILES au début 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, alors, la configuration ci-dessus ne fonctionne pas.

Il est plutôt nécessaire d’augmenter la limite dans /etc/security/limits.conf. Pour plus d’informations sur la façon de reconfigurer la limite utilisateur, voir ci-dessous.

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, consulter les fichiers ouverts à l’aide de la commande lsof -p. (-p est l’ID du processus problématique). Il se peut que votre application laisse la gestion des fichiers ouverte. Si vous constatez que la gestion est principalement assurée par AEM et non par votre application, contactez le support technique.

Augmenter les limites de l’utilisateur

Pour modifier le nombre maximum de fichiers ouverts pour les utilisateurs non autorisés, modifier le fichier /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 lors de la prochaine connexion de l’utilisateur.

Augmentation de la limite du système

Parfois, la limite utilisateur est suffisante, mais le système a atteint sa limite maximale de fichiers. Exécuter l’élément suivant en tant qu’utilisateur su/root :

  1. Vérifier la valeur maximale de fichier ouvert sur le système d’exploitation (si elle est inférieure à 20000, il est logique d’augmenter ce paramètre).

    cat /proc/sys/fs/file-max

  2. Ajouter la ligne suivante /etc/sysctl.conf afin d’augmenter la valeur maximale de fichiers ouverts dans le système :

    fs.file-max = 300000

  3. Exécuter la commande suivante :

    sysctl -p

  4. Vérifier que la nouvelle valeur s’affiche lors de l’exécution de cette commande :

    cat /proc/sys/fs/file-max

Remarque :

Cette configuration ne prend effet que lors de la prochaine connexion de l’utilisateur.

Informations supplémentaires

Cette erreur se produit lorsque le système, ou l’utilisateur, utilise la limite maximale de fichiers gérés.

Telechargement

Ce produit est distribué sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage à l’identique 3.0 non transposé  Les publications Twitter™ et Facebook ne sont pas couvertes par les dispositions Creative Commons.

Mentions légales   |   Politique de confidentialité en ligne