Lors d'une intervention chez un client, j'ai été confronté à une série de messages d'erreurs dans les logs Tomcat :
ERROR [org.apache.tomcat.util.net.PoolTcpEndpoint] <Endpoint null ignored exception: java.net.SocketException: Too many open files> at java.net.ServerSocket.createImpl(ServerSocket.java:255) at java.net.ServerSocket.getImpl(ServerSocket.java:205)
Tout cela arrivant sur une séance de tests avec 6 (oui, SIX) utilisateurs. Application développée autour du BPM Intalio.
D'après les logs, ce ne sont pas uniquement des fichiers, mais également des sockets qui sont ouverts.
La limite est donnée par la commande
ulimit -n
Dans notre cas, la limite (par défaut) était fixée à 1024.
Il est possible de modifier la valeur pour chaque utilisateur, via
ulimit -S -n <valeur> Exemple: ulimit -S -n 4096
Il est également possible de savoir le nombre de descripteurs de fichiers utilisés par un programme, en deux commandes :
ps -eo pid,args | grep <mon programme> # on récupère le PID lsof -p <PID> | wc -l
Par exemple, pour avoir le nombre de descripteur utilisés par LibreOffice :
$ ps -eo pid,args | grep soffice 9201 /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe=7 9213 grep soffice vliefooghe@laptop-vliefooghe: ~$ lsof -p 9201 | wc -l 247
247 descripteurs utilisés, rien que pour le traitement de texte.
Au final, le script de démarrage du serveur Tomcat a été modifié, en ajoutant la ligne suivante :
ulimit -S -n 10240
Ceci nous laisse une certaine marge, en attendant de pouvoir refaire une séance de tests et de mesurer la valeur réelle.