J’ai récemment eu une petite mésaventure avec une limitation méconnue de Debian ou de Ubuntu
En effet ces sytèmes sont par défaut limités en nombre de fichiers ouvert en simultanés
Si vous souhaitez ouvrir 10000 fichiers en même temps, cela bloquera avant la plupart du temps
Comment augmenter le nombre maximum de fichiers ouverts sur Debian?
Par défaut la limite sur Debian est fixée à 1024 fichiers ouverts en simultanés au maximum
Il faut donc utiliser quelques astuces pour en ouvrir plus
La commande ulimit devrait suffir la plupart du temps, mais pas toujours
Nous allons donc voir dans cet article les quelques options utiles de la commande ulimit, ainsi que d’autres configurations à modification pour fixer votre propre limite sans avoir besoin de ulimit
Table des matières
La limite par défaut sur Debian
Bien, la première chose à savoir c’est que la limite par défaut est de 1024
C’est à dire que vous pouvez avoir jusqu’a 1024 fichiers ouverts en simultanés, pas plus
Si vous créer un script qui doit modifier 10000 fichiers en même temps (c’est à dire sans les ouvrir/fermer à chaque écriture), vous serez rapidement bloqué, et seulement les 1000 premiers environs seront mis à jour
Cette limite peut être affichée avec la commande suivante:
# ulimit -n 1024
La commande ulimit permet entre autres d’afficher la limite actuelle
Nous verrons dans le paragraphe suivant qu’il y a d’autres options intéressantes
Enfin pour en finir avec la théorie, vous devez aussi savoir qu’il existe en réalité deux limites sur les sytèmes Linux:
- Une limite « soft »: qui correspond à la valeur courante fixée par l’utilisateur, et qui peut être modifiée au début de chaque script (nous verrons plus tard comment)
- Une limite « hard »: qui correspond à valeur maximale que l’utilisateur pourra demander
C’est à dire que si votre limite soft est à 1024 et votre limite hard à 5000
Vous pourrez essayez de changer la limite temporairement à 10000 mais ca ne fonctionnera pas
Si vous avez besoin de faire quelque chose comme ca, nous verrons par la suite comment augmenter ces deux limites
La commande ulimit
Je vous ai déjà montré un exemple de ce que la commande ulimit permet de faire juste avant
Il s’agit en fait d’une commande qui permet de connaître de de définir les limites du sytème pour le process en cours (un script par exemple)
Afficher la limite actuelle
Je vous ai déjà plus ou moins donné cette commande
A savoir qu’il existe des variantes pour connaitre les limites soft et hard:
# ulimit -n 1024 # ulimit -Sn 1024 # ulimit -Hn 1048576
Comme vous l’aurez deviner, S implique la limite « Soft », et H la limite « Hard »
Modifier la limite
Le moyen le plus simple pour modifier la limite temporairement est d’utiliser cette commande:
# ulimit -n10000
Cela vous permettra en théorie de pouvoir ouvrir jusqu’a 10000 fichiers en même temps
Mais ce n’est pas très fiable
Je vous parlais d’une mésaventure en introduction et c’est exactement l’erreur que j’ai faite
J’avais un script qui devait modifier 60000 fichiers en même temps, pour des raisons de performance je n’ouvrais/fermait pas le fichier à chaque écriture
J’ouvrais tout au début, écrivait ce qu’il me fallait durant le script, et refermait à la fin
Seulement je me suis rendu compte bien trop tard que souvent cela ne fonctionnait pas, et que j’avais en général seulement 1% des fichiers qui étaient correctement modifiés
Si c’est votre cas, qu’il ne s’agit pas d’un changement temporaire sous vos yeux, mais d’un process qui va tourner en automatique par la suite, je vous conseille donc plutôt d’appliquer les modifications proposées dans le chapitre suivant
Fixer votre propre limite de manière permanente
Pour plus de fiabilité et de simplicité il est possible d’inscrire votre limite dans la configuration de votre système, et elle sera ainsi toujours valable
Pour cela, vous devez suivre la procédure suivante :
- Modifier le fichier /etc/security/limits.conf
nano /etc/security/limits.conf
- Coller les lignes suivantes (ou modifier les si déjà présentes):
* soft nofile 100000 * hard nofile 100000 root soft nofile 100000 root hard nofile 100000
J’ai indiqué une limite globale à 100k, à vous d’adapter suivant vos besoins
- Modifier le fichier /etc/pam.d/common-session
nano /etc/pam.d/common-session
- Ajouter la ligne suivante:
session required pam_limits.so
- Modifier le fichier /etc/pam.d/common-session-noninteractive
nano /etc/pam.d/common-session-noninteractive
- Ajouter la ligne suivante:
session required pam_limits.so
- Redémarrer ensuite votre ordinateur ou votre serveur
Après le redémarrage, les nouvelles limites seront appliquées directement, l’usage de la commande ulimit ne sera plus indispensable
# ulimit -n 100000
Autres commandes utiles
Si vous voulez vous assurer qu’un processus tourne bien avec la limite que vous lui avez imposé, il est possible de surveiller cela
Tout d’abord vous devez trouvez le PID de votre programme, par exemple avec la commande suivante:
ps aux | grep <nom du processus>
Le PID est le numéro indiqué dans la deuxième colonne du résultat affiché
Voici un exemple:
# ps aux | grep mysql mysql 872 5.8 0.7 1109100 470276 ? Ssl Jun15 14028:57 /usr/sbin/mysqld
Mon PID par la suite sera donc le 872
Afin de vérifier les limites actives, j’utilise la commande suivante :
# cat /proc/872/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 256767 256767 processes Max open files 16364 16364 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 256767 256767 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
Pensez à remplacer 872 par votre propre PID
Le tableau affiché vous indique toutes les limites appliquées au processus
Dans mon cas je peux voir que le « max open files » (nombres maximum de fichiers ouverts en simultanés) est à 16364 sur les deux limites (soft et hard)
Cela vous permet de vérifier que le nombre est bien celui désiré
Conclusion
Vous savez maintenant comment connaître et ajuster le nombre maximum de fichiers ouverts en simultané sur un système Linux type Debian ou Ubuntu
J’espère que cet article vous aura aidé, car j’ai eu du mal à trouver certaines de ces infos, c’est pourquoi j’ai décidé de tout résumer ici
Je sais que j’ai eu plusieurs fois affaire à cette limite fourbe qui n’est pas forcément quelque chose auquel on pense facilement, mais qui peut créer pas mal de problèmes
Après j’avoue en avoir eu besoin sur des scripts très spécifiques, la plupart du temps ca ne devrait pas poser de problèmes