La limite maximale du descripteur de file ne colle pas

Nos systèmes basés sur le cloud utilisent Java et exigent plus de 1024 pour la limite maximale du descripteur de file. Sur l'un de nos systèmes virtuels, chaque fois que nous essayons de faire ce changement, je peux l'amener à changer et il sera persistant pendant le premier redémarrage (ne pas avoir testé plusieurs fois), mais si nous arrêtons et commençons notre application java, la limite semble être réinitialisé à 1024.

Informations sur le système: Linux mx.xen16.node01002 3.1.0-1.2-xen # 1 SMP Jeu Nov 3 14:45:45 UTC 2011 (187dde0) x86_64 GNU / Linux

Voici les étapes que j'ai sockets:

édité /etc/sysctl.conf et fs.file-max ajouté ajouté = 4096

Avant d'appliquer, vérifié la limite pour le process (PID 1530):

racine 1530 6.7 31.0 1351472 165244 pts / 0 Sl 17:12 0:58 java

cat / proc / 1530 / limites

Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes unlimited unlimited processes Max open files 1024 1024 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 16382 16382 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us 

Maintenant, j'applique le changement avec:

sudo sysctl -p

fs.file-max = 4096 (ok, il faut le définir)

Je lance maintenant un redémarrage

Lorsque le système revient, l'application java démarre automatiquement et l'utilisation du nouveau PID I vérifie les limites à nouveau.

 Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 3818 3818 processes Max open files 4096 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 3818 3818 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us 

La limite est définie correctement, mais si je démarre et arrête l'application java, la valeur par défaut est 1024. Il n'y a aucun problème avec l'application java. C'est l'un des nombreux systèmes basés sur le cloud identique à travers le monde, chacun étant une copy de celui-ci. Cette VM réside chez Gigatux. Nous avons plusieurs autres systèmes identiques à Giga exécutant le même operating system, la même version et la même application et la même version d'application. Seul celui-ci se comporte de façon étrange. Aidez-nous.

* METTRE À JOUR *

J'ai supprimé la déclaration de la fin de la recommandation sysctl.conf par David. Si je délivre ulimit -n, la limite est en effet réglée sur 4092. Si je regarde dans /etc/security/limits.conf, vous pouvez également voir les limites configurées ici.

 * hard nofile 4096 * soft nofile 4096 

Pourtant, si je redémarre le process java, il rest par défaut de 1024.

 agent@mx:~$ cat /proc/2432/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes unlimited unlimited processes Max open files 1024 1024 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 16382 16382 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us agent@mx:~$ echo -n $SHELL ' ' && ulimit -n /bin/bash 4096 

* METTRE À JOUR *

D'accord, je pense que cela peut être corrigé. J'ai changé ce qui suit:

 * hard nofile 4096 * soft nofile 4096 

Retour à la list suivante:

 root hard nofile 4096 root soft nofile 4096 

et le problème semble être résolu

Il y a deux endroits où la limite est définie, vous avez changé l'une d'entre elles (sysctl), mais vous avez oublié que l'environnement shell que Java exécute crée également sa propre limite qui peut être égale ou inférieure à la limite du système:

 composed-~$ echo -n $SHELL ' ' && ulimit -n /usr/local/bin/bash 1024 

Donc, découvrez le shell Java lancé depuis, et définissez la limite avec la command shell embeddede. Par exemple "ulimit" en bash.

D'accord, je pense que cela peut être corrigé. J'ai changé ce qui suit:

 * hard nofile 4096 * soft nofile 4096 

Retour à la list suivante:

 root hard nofile 4096 root soft nofile 4096 

et le problème semble être résolu