En ce moment, je sais comment:
ulimit -n
lsof | wc -l
cat /proc/sys/fs/file-max
Ma question est: pourquoi y a-t-il une limite de fichiers ouverts sous Linux?
La raison en est que le système d'exploitation a besoin de mémoire pour gérer chaque fichier ouvert, et la mémoire est une ressource limitée - en particulier sur les systèmes embarqués.
En tant qu'utilisateur root, vous pouvez modifier le nombre maximal de fichiers ouverts par processus (via ulimit -n
) et par système (par exemple echo 800000 > /proc/sys/fs/file-max
).
Veuillez noter que lsof | wc -l
résume un grand nombre d'entrées dupliquées (les processus fourchus peuvent partager des descripteurs de fichiers, etc.). Ce nombre pourrait être bien supérieur à la limite définie dans /proc/sys/fs/file-max
.
Pour obtenir le nombre actuel de fichiers ouverts du point de vue du noyau Linux, procédez comme suit:
cat /proc/sys/fs/file-nr
Exemple: ce serveur contient 40096 des 65536 fichiers ouverts au maximum, bien que lsof signale un nombre beaucoup plus élevé:
# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr
40096 0 65536
# lsof | wc -l
521504
Je pense que c'est en grande partie pour des raisons historiques.
Un descripteur de fichier Unix est une petite valeur int
, renvoyée par des fonctions comme open
et creat
, et passée à read
, write
, close
, etc.
Au moins dans les premières versions d'Unix, un descripteur de fichier était simplement un index dans un tableau de structures par processus de taille fixe, où chaque structure contient des informations sur un fichier ouvert. Si je me souviens bien, certains des premiers systèmes limitaient la taille de ce tableau à environ 20.
Les systèmes plus modernes ont des limites plus élevées, mais ont conservé le même schéma général, en grande partie hors d'inertie.