2010-10-21 12 views
12

Mi è stato detto che il mio server ha rifiutato di accettare le connessioni di rete del client a una porta specifica a causa della mancanza di descrittori di file. Alzai gli occhi ciò che questo è tutto e letto su di esso qui: http://www.netadmintools.com/art295.htmlCome funzionano i limiti del descrittore di file linux?

Così ho provato il mio sistema e ho ottenuto questo:

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

Cosa significa? Il mio limite è abbastanza alto eppure ho 0 descrittori di file disponibili? perché? Come posso risolvere questo per il mio server?

La seconda colonna rimane effettivamente a 0 anche dopo aver spento il mio server, rimane anche a 0 anche a destra dopo un avvio!

+0

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

+0

Hai nuovi risultati per il tuo problema? Qualcuna delle risposte è stata di aiuto? –

risposta

11

si vuole guardare in/proc/sys/fs/file-max, invece

Da recenti linux/Documentation/sysctl/fs.txt:

file-max & di file-nr:

Il kernel alloca dinamicamente gli handle di file, ma non lo ha ancora liberato da .

Il valore in file-max indica il numero massimo di handle di file allocati dal kernel di Linux. Quando ricevi un sacco di messaggi di errore relativi all'esaurimento degli handle di file, potresti voler aumentare questo limite.

Storicamente, i tre valori nel file-nr indicavano il numero di handle di file allocati , il numero di handle di file allocati ma non utilizzati e il numero massimo di handle di file. Linux 2.6 sempre segnala 0 come numero di handle di file liberi - questo non è un errore , significa solo che il numero di file allocati gestisce corrisponde esattamente al numero di handle di file utilizzati.

I tentativi di allocare più descrittori di file rispetto a file-max sono segnalati con printk, cercare "VFS: limite file-file raggiunto".

MODIFICA: l'errore sottostante non è probabilmente il sistema che sta esaurendo gli archivi elettronici globali, ma solo il processo. Sembra probabile che il problema sia il maximum size limit of select.

5

Non sembra che si stia colpendo il limite del descrittore del file di sistema. See this answer.

Forse il processo del server utilizza select ed è quindi limitato a 1024 descrittori? Se passi a un altro meccanismo, ad es. poll non sarai più limitato a 1024 descrittori.

select() opere con fd_set s

This is from the POSIX documentation of select.h:

Il testo seguente è definito come una macro:

FD_SETSIZE

Maximum number of file descriptors in an fd_set structure. 

cercare di trovare o uscita FD_SETSIZE sul tuo sistema.

Se trovi FD_SETSIZE troppo basso per te, preferirei provare ad allontanarmi da select piuttosto che provare ad aumentare FD_SETSIZE che è in genere più difficile.

+0

select è limitato da 1024 descrittori? Puoi spiegare ulteriormente? – erotsppa

+0

non ha nulla a che fare con FD_SETSIZE – unbeli

+3

@unbeli Ho visto colpire FD_SETSIZE nei server usando select time e again. Per favore, spiega cosa succede a erotsppa secondo te. –

0

Quale errore si ottiene da accept() in queste circostanze? Controlla errno e segnalalo di conseguenza.

In base alla pagina man, accept() restituirà EMFILE o ENFILE se il limite del descrittore di file per processo o generale è stato raggiunto, sarebbe utile sapere quale (o se c'era qualcos'altro).

C'è un limite di descrittore di file per processo che è spesso impostato su 1024 - ma può essere facilmente aumentato.

Problemi correlati