Trop d'erreurs de fichiers ouverts mais lsof affiche un nombre légal de fichiers ouverts
Mon programme Java est un échec avec
Caused by: java.io.IOException: Too many open files
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:883)...
Ici sont les traits les plus importants de /etc/security/limits.conf
. Ils ont mis le max des fichiers d'un utilisateur à 500k:
root soft nofile 500000
root hard nofile 500000
* soft nofile 500000
* hard nofile 500000
J'ai couru lsof
à compter le nombre de fichiers ouverts, à la fois globalement et par le processus de jvm. J'ai examiné les compteurs dans /proc/sys/fs
. Tout semble OK. Mon processus ne doit 4301 des fichiers ouverts et la limite est de 500 k:
:~# lsof | wc -l
5526
:~# lsof -uusername | wc -l
4301
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-nr
4736 0 744363
C'est une Ubuntu server 11.04. J'ai même redémarré donc je suis positif ces paramètres sont utilisés.
Je ne sais pas si c'est pertinent, mais le processus a commencé par un arriviste script, qui démarre le processus en utilisant setuidgid, comme ceci:
exec setuidgid username java $JAVA_OPTS -jar myprogram.jar
Ce que je suis absent?
source d'informationauteur hughw
Vous devez vous connecter pour publier un commentaire.
Il s'avère que le problème est que mon programme était en cours d'exécution comme un arriviste script d'initialisation, et que le
exec
strophe de ne pas se prévaloir d'un shell.ulimit
et les paramètres de limites.conf s'appliquent uniquement pour les processus utilisateur en ligne de commande.J'ai vérifié cela en modifiant l'exec strophe à
java qui s'exécute dans le nom d'utilisateur par défaut du shell. Qui a permis au programme d'utiliser autant ouvrir les fichiers comme il faut.
Je l'ai vu mentionné que vous pouvez également appeler
ulimit -n
avant l'invocation de la commande; pour un arriviste script je pense que vous devez utiliser unescript
strophe à la place.J'ai trouvé un meilleur diagnostic de
lsof
êtrels /proc/{pid}/fd | wc -l
pour obtenir un nombre de descripteur de fichier ouvert. Par le suivi que j'ai pu voir que des échecs droit à 4096 ouvrir fds. Je ne sais pas où ce 4096 vient; il n'est pas dans /etc n'importe où; je suppose que c'est compilé dans le noyau.J'ai cet extrait de bash, au sommet d'un serveur de script de création: