Erreur : Trop de fichiers ouverts | AEM

Description

Environnement
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

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.

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.


Recherchez les fichiers ou les sockets qui restent ouverts

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

Sur la plateforme Linux, la 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 permettant de collecter des sorties lsof utiles :

 

| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | #!/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 :
 
1
2
3
4
5
6
$ ./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.

 Augmenter 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 celui pour le processus AEM :

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 le modifier.
  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: Ouvrir les fichiers : Impossible de modifier la limite : Opération non autorisée" lors du démarrage de l’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.


 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.


 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.


 Informations supplémentaires

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

TÉLÉCHARGER
Obtenir le fichier 
Script Shell que vous pouvez utiliser pour surveiller l’utilisation des fichiers ouverts. N’utilisez ce script que si l’erreur « Trop de fichiers ouverts »persiste même après avoir augmenté la limite maximum. Vous pouvez également l’utiliser si vous pensez que CRX ou votre application laisse les descripteurs de fichiers ouverts. Avant d’utiliser le script, configurez les variables suivantes : JAVA_HOME, QUICKSTART_PATH, OUTPUT_DIR, USER, MAX_FILES_THRESHOLD. Pour utiliser le script, configurez-le comme une tâche cron.

Sur cette page