Too many open files

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.

 

Catégorie
Tag