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

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

A lire également