2010-10-21 16 views
12

On m'a dit que mon serveur a refusé d'accepter les connexions réseau client à un port spécifique pourrait être dû à l'absence de descripteurs de fichiers. Je levai les yeux ce que cela est tout au sujet et lu à ce sujet ici: http://www.netadmintools.com/art295.htmlComment fonctionnent les limites des descripteurs de fichiers Linux?

Je testé mon système et je suis arrivé ceci:

cat /proc/sys/fs/file-nr 
1088 0 331287 

Qu'est-ce que cela signifie? Ma limite est assez élevée mais j'ai 0 descripteur de fichier disponible? Pourquoi? Comment puis-je résoudre ceci pour mon serveur?

La deuxième colonne reste à 0 même après avoir éteint mon serveur, elle reste même à 0 même après un démarrage!

+0

Veuillez consulter http://serverfault.com/questions/190435/how-to-increase-open-files-limit-for-process-from-1024-to-10240 - – Jayan

+0

Avez-vous de nouveaux résultats concernant votre problème? Est-ce que l'une des réponses a aidé? –

Répondre

11

Vous voulez regarder/proc/sys/fs/file-max à la place

De récentes linux/Documentation/sysctl/fs.txt:

file-max & fichier-nr:

Le noyau alloue dynamiquement les handles de fichiers, mais il ne les libère pas encore .

La valeur de fichier-max indique le nombre maximal de handles de fichier que le noyau Linux va allouer. Lorsque vous obtenez beaucoup de messages d'erreur sur l'épuisement des handles de fichiers, vous pouvez souhaitez augmenter cette limite.

Historiquement, les trois valeurs de fichier-nr indiquaient le nombre de descripteurs de fichier alloués , le nombre de handles de fichier alloués mais non utilisés et le nombre maximal de descripteurs de fichiers. Linux 2.6 toujours indique 0 comme le nombre de handles de fichiers libres - ce n'est pas une erreur , cela signifie simplement que le nombre de handles de fichiers alloués correspond exactement au nombre de descripteurs de fichiers utilisés.

Tentatives d'attribuer plus de descripteurs de fichier que fichier-max sont signalé avec printk, recherchez "VFS: limite de fichier-max atteint".

EDIT: l'erreur sous-jacente n'est probablement pas le système qui manque de filedescripteurs globaux, mais seulement votre processus. Il semble probable que le problème est l'maximum size limit of select.

5

Il ne semble pas que vous atteigniez la limite de descripteur de fichier système. See this answer.

Peut-être que votre processus serveur utilise select et est donc limité à 1024 descripteurs? Si vous passez à un autre mécanisme, par ex. poll vous ne serez plus limité à 1024 descripteurs.

select() travaille avec fd_set s

This is from the POSIX documentation of select.h:

Ce qui suit est définie comme une macro:

FD_SETSIZE

Maximum number of file descriptors in an fd_set structure. 

Essayez de trouver ou de sortie FD_SETSIZE sur votre système. Si vous trouvez que FD_SETSIZE est trop faible pour vous, je préférerais essayer de m'éloigner de select plutôt que d'essayer d'augmenter FD_SETSIZE, ce qui est généralement plus difficile.

+0

select est limité par 1024 descripteurs? Pouvez-vous expliquer plus loin? – erotsppa

+0

n'a rien à voir avec FD_SETSIZE – unbeli

+3

@unbeli J'ai vu FD_SETSIZE sur des serveurs en utilisant select et encore. S'il vous plaît expliquer ce qui arrive à erotsppa à votre avis. –

0

Quelle erreur obtenez-vous de accept() dans ces circonstances? Vérifiez errno et signalez-le en conséquence. Selon la page de manuel, accept() donnera EMFILE ou ENFILE si la limite par descripteur de fichier ou par processus a été atteinte, il serait utile de savoir lequel (ou s'il y avait quelque chose d'autre).

Il existe une limite de descripteur de fichier par processus souvent définie sur 1024, mais elle peut facilement être augmentée.