En ce moment, je sais comment:
- trouver la limite de fichiers ouverts par processus:
ulimit -n
- compter tous les fichiers ouverts par tous les processus:
lsof | wc -l
- obtenir le nombre maximum autorisé de fichiers ouverts:
cat /proc/sys/fs/file-max
Ma question est la suivante: pourquoi existe-t-il une limite de fichiers ouverts dans Linux?
open-files
limit
Xanpeng
la source
la source
Réponses:
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 intégré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 exempleecho 800000 > /proc/sys/fs/file-max
).la source
/.../file-max
une valeur assez grande tant que la mémoire n'est pas utilisée?file-max
semble être la taille de la RAM divisée par 10k. Comme la vraie mémoire utilisée par gestionnaire de fichiers devrait être beaucoup plus petite (taille destruct file
plus de la mémoire dépendante du pilote), cela semble être une limite assez conservatrice.Veuillez noter que
lsof | wc -l
résume de nombreuses entrées dupliquées (les processus forkés peuvent partager des descripteurs de fichier, etc.). Ce nombre pourrait être beaucoup plus élevé que la limite fixée 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 fichiers ouverts sur un maximum de 65 536 fichiers, bien que lsof en signale un nombre beaucoup plus important:
la source
lsof
allons signaler plusieurs fichiers deux fois ou plus, par exemple/dev/null
, vous pouvez tenter votre chance avec:lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
pour obtenir le nombre non dupliqué de fichiers ouverts.Je pense que c'est en grande partie pour des raisons historiques.
Un descripteur de fichier Unix est une petite
int
valeur, retournée par des fonctions telles queopen
etcreat
, et transmis àread
,write
,close
, et ainsi de suite.Au moins dans les premières versions d'Unix, un descripteur de fichier était simplement un index dans un tableau de structures de taille fixe par processus, chaque structure contenant des informations sur un fichier ouvert. Si je me souviens bien, certains des premiers systèmes limitaient la taille de ce tableau à une vingtaine.
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 par inertie.
la source
fileno
etfdopen
, je m'attendrais à ce qu'elles soient presque interchangeables.int
descripteur ou un fichierFILE*
. Si vous avez plus de 20 fichiers ouverts viaopen()
,fdopen()
échoueriez-vous?