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 :
- Découvrez ce qui fait que la limite de fichiers ouverts est atteinte.
- 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 :
- Ouvrez
crx-quickstart/bin/start
pour modification. - 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 :
- 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
- Ajoutez la ligne suivante à /etc/sysctl.conf pour augmenter la valeur maximale du fichier d’ouverture du système :
fs.file-max = 300000
- Exécutez cette commande :
sysctl -p
- 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 :
- Connectez-vous à http://localhost:4502/crxde en tant qu’utilisateur administrateur.
- Accédez à
/libs/granite/monitoring/config
- Cliquez avec le bouton droit et supprimez chaque sous-noeud de
/libs/granite/monitoring/config
. - Cliquez sur Enregistrer tout. Redémarrez CQ.