Limiti al numero di descrittori di file


34

Sto cercando di installare 389-ds, e mi dà questo avviso:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

Comprendo i descrittori di file, ma non capisco i limiti soft e hard.

Quando corro cat /proc/sys/fs/file-max, torno 590432. Ciò dovrebbe implicare che posso aprire fino a 590432 file (ovvero avere fino a 590432 file descrittori.

Ma quando corro ulimit, mi dà risultati diversi:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

Ma quali sono i limiti hard / soft ulimite in che modo sono correlati al numero memorizzato /proc/sys/fs/file-max?

Risposte:


39

Secondo la documentazione del kernel , /proc/sys/file-maxè il numero massimo, totale e globale di descrittori di file che il kernel assegnerà prima di soffocare. Questo è il limite del kernel, non dell'utente attuale. Quindi puoi aprire 590432, purché tu sia solo su un sistema inattivo (modalità utente singolo, nessun daemon in esecuzione).

Si noti che la documentazione non è aggiornata: il file è in uso proc/sys/fs/file-maxda molto tempo. Grazie a Martin Jambon per averlo segnalato.

La differenza tra limiti soft e hard viene data risposta qui, su SE . È possibile aumentare o ridurre un limite software come un normale utente, a condizione che non si superi il limite massimo. Puoi anche abbassare un limite rigido (ma non puoi rialzarlo di nuovo per quel processo). Come superutente, puoi aumentare o diminuire i limiti sia hard che soft. Lo schema a doppio limite viene utilizzato per applicare i criteri di sistema, ma consente anche agli utenti ordinari di impostare limiti temporanei per se stessi e successivamente modificarli.

Nota che se provi a ridurre un limite rigido al di sotto del limite flessibile (e non sei il superutente), EINVALtornerai indietro (Argomento non valido).

Quindi, nel tuo caso particolare, ulimit(che è lo stesso di ulimit -Sf) dice che non hai un limite morbido sulla dimensione dei file scritti dalla shell e dai suoi sottoprocessi . (questa è probabilmente una buona idea nella maggior parte dei casi)

L'altra tua chiamata, ulimit -Hnriporta il -nlimite (numero massimo di descrittori di file aperti), non il -flimite, motivo per cui il limite flessibile sembra superiore al limite effettivo. Se entri ulimit -Hfotterrai anche "illimitato".


14
Su Linux 4.4.0, il percorso file-max è /proc/sys/fs/file-max.
Martin Jambon,

per favore, il limite rigido ulimit -Hn mira al limite stesso del sistema alle capacità di descrittore di file allocate?
Webwoman,

2
@Webman: no, non lo fa. ulimitinfluisce solo sui limiti per il processo corrente . I limiti dell'attuale processo sono legati anche ai processi secondari, ma ogni processo ha un conteggio separato. Ad esempio ulimit -Hn 10, puoi aprire solo 10 descrittori di file alla volta. Ogni processo figlio creato può contenere anche fino a 10 descrittori di file. Solo il superutente può aumentare un limite una volta impostato. Se si imposta uno troppo basso, l'unica opzione potrebbe essere quella di terminare il processo della shell e avviarne uno nuovo.
Alessio,

0

La chiamata di sistema "select" è una delle tante terribili decisioni di progettazione morte del cervello di unix che rende Windows 95 ancora così bello in confronto.

Avrebbe dovuto essere vietato 20 anni fa e quindi potremmo ormai avere la possibilità di gestire un numero illimitato di gestori di file senza problemi.

Puoi aumentare facilmente il numero di descrittori di file con la configurazione del kernel e ulimit MA ricorda che se una libreria usa una chiamata di sistema "select" il tuo programma diventerà instabile (danneggiamento della memoria) e fallirà.

Select può gestire solo descrittori di file da 0 a 1023 e se ne nutri uno con un valore più alto, esso verrà inserito casualmente nella memoria e la selezione non ripeterà mai il descrittore come funzionante. Sfortunatamente molte librerie usano select.


Il tuo commento è un utile avvertimento, ma invece di prendere un tono rantolante, sarebbe stato molto più utile aver citato la fd_set(3)pagina man e da dove viene il limite FD_SETSIZE. E il migliore sarebbe stato il suggerimento di una chiamata sostitutiva come poll(3), come in questa risposta
Davor Cubranic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.