Solution 1 :
file-max
est le maximum de descripteurs de fichiers (FD) appliqué au niveau du noyau, qui ne peut pas être dépassé par tous les processus sans augmenter. Le ulimit
est appliqué au niveau du processus, qui peut être inférieur au file-max
.
Il n'y a aucun risque d'impact sur les performances en augmentant file-max
. Les distributions modernes ont un FD maximum assez élevé, alors que dans le passé, il fallait recompiler et modifier le noyau pour dépasser 1024. Je n'augmenterais pas à l'échelle du système à moins que vous n'ayez un besoin technique.
La configuration par processus doit souvent être ajustée pour servir un démon particulier, qu'il s'agisse d'une base de données ou d'un serveur Web. Si vous supprimez entièrement la limite, ce démon pourrait potentiellement épuiser toutes les ressources système disponibles ; ce qui signifie que vous ne pourrez pas résoudre le problème, sauf en appuyant sur le bouton de réinitialisation ou en redémarrant. Bien sûr, l'un ou l'autre risque d'entraîner la corruption de tous les fichiers ouverts.
Solution 2 :
La limitation d'ulimit est par utilisateur unique. Ainsi, user1, quel que soit le nombre de connexions ou de processus en cours d'exécution, serait limité à 1024. C'est combiné.
Je ne suis pas sûr de bien comprendre le sens de cette phrase (l'anglais n'est pas ma langue maternelle) Si cette phrase signifie que la configuration ulimit pour les descripteurs de fichiers n'est pas une limitation par processus, la réponse acceptée (AFAIK) est fausse.
Ce que je veux dire, c'est que si un utilisateur a lancé 4 processus et que la configuration ulimit pour les FD est de 1024, chaque processus peut ouvrir 1024 FD. L'utilisateur ne sera pas limité à 1024 FD mais aux processus lancés par cet utilisateur.
Par exemple :
[email protected]:~$ ulimit -n
1024
[email protected]:~$ lsof | grep $USER | wc -l
8145
Voici un exemple perl où nous atteignons la limite (il s'agit d'une limite par processus) :
#!/usr/bin/perl
$count = 0;
@filedescriptors;
while ($count <= 1024) {
$FILE = ${count};
open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
push(@filedescriptors, $FILE);
$count ++;
}
Résultat :
FDs: 1021 Too many open files at ./test.pl line 8.
1021 car il y avait 3 descripteurs de fichiers ouverts avant d'atteindre la boucle while (stdout, stdin et stderr)
Désolé si je me trompe complètement ou si j'ai mal compris la réponse.