Sospetto che il motivo principale del limite sia evitare un consumo eccessivo di memoria (ogni descrittore di file aperto utilizza la memoria del kernel). Serve anche come protezione contro applicazioni difettose che perdono descrittori di file e consumano risorse di sistema.
Ma data l'assurda quantità di RAM che hanno i sistemi moderni rispetto ai sistemi di 10 anni fa, penso che le impostazioni predefinite oggi siano piuttosto basse.
Nel 2011 il limite rigido predefinito per i descrittori di file su Linux è stato aumentato da 1024 a 4096.
Alcuni software (ad esempio MongoDB) utilizzano molti più descrittori di file rispetto al limite predefinito. La gente di MongoDB consiglia di aumentare questo limite a 64.000. Ho usato un rlimit_nofile
di 300.000 per determinate applicazioni.
Finché mantieni il limite flessibile al valore predefinito (1024), è probabilmente abbastanza sicuro aumentare il limite rigido. I programmi devono chiamare setrlimit()
al fine di aumentare il proprio limite al di sopra del limite flessibile e sono ancora limitati dal limite rigido.
Vedi anche alcune domande correlate:
- https://serverfault.com/questions/356962/where-are-the-default-ulimit-values-set-linux-centos
- https://serverfault.com/questions/773609/how-do-ulimit-settings-impact-linux
L'impatto non sarebbe normalmente osservabile, ma il modulo IO del kernel dovrà occuparsi di tutti quei descrittori di file aperti e potrebbero anche avere un impatto sull'efficienza della cache.
Tali limiti hanno il vantaggio di proteggere l'utente da errori propri (o di terzi). Ad esempio, se esegui un piccolo programma o uno script che esegue il fork indefinitamente, alla fine si bloccherà su uno dei ulimit
s e quindi prevenire un blocco del computer più intenso (possibilmente irrecuperabile).
A meno che tu non abbia motivi precisi per aumentare uno qualsiasi di questi limiti, dovresti evitarlo e dormire meglio.
È tecnicamente limitato al valore massimo di unsigned long (C Lang), ovvero 4.294.967.295
Riferimento:fs.h
file
/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
unsigned long nr_files; /* read only */
unsigned long nr_free_files; /* read only */
unsigned long max_files; /* tunable THIS IS OUR VALUE */
};