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.
La solution à ce problème est la suivante :
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 :
crx-quickstart/bin/start
pour modification.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 :
cat /proc/sys/fs/file-max
fs.file-max = 300000
sysctl -p
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 :
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 :
/libs/granite/monitoring/config
/libs/granite/monitoring/config