In cosa differiscono ulimit -n e / proc / sys / fs / file-max?


32

Ho notato che su una nuova immagine CentOS che ho appena avviato da EC2 che il valore predefinito di ulimit è 1024 file aperti, ma / proc / sys / fs / file-max è impostato su 761.408 e mi chiedo come funzionano questi due limiti insieme. Immagino che ulimit -n sia un limite per utente del numero di descrittori di file mentre / proc / sys / fs / file-max è a livello di sistema? In tal caso, supponiamo che io abbia effettuato l'accesso due volte come lo stesso utente - ogni utente che ha effettuato l'accesso ha un limite di 1024 sul numero di file aperti o è un limite di 1024 file aperti combinati tra ciascuno di questi registrati- negli utenti?

E c'è un grande impatto sulle prestazioni nell'impostare i descrittori di file max su un numero molto alto, se il tuo sistema non apre mai molti file?


Tag aggiunti: bash risorse del sistema kernel Linux
Warner

Risposte:


28

file-maxè il massimo descrittore di file (FD) applicato a livello di kernel, che non può essere superato da tutti i processi senza aumentare. La ulimitviene applicata su un livello di processo, che può essere inferiore al file-max.

Non vi è alcun rischio di impatto sulle prestazioni aumentando file-max. Le distribuzioni moderne hanno il set massimo di FD piuttosto alto, mentre in passato richiedevano la ricompilazione e la modifica del kernel per aumentare oltre il 1024. Non aumenterei a livello di sistema se non avessi bisogno tecnico.

La configurazione per processo spesso deve essere ottimizzata per servire un particolare demone, sia esso un database o un server Web. Se si rimuove del tutto il limite, quel demone potrebbe potenzialmente esaurire tutte le risorse di sistema disponibili; ciò significa che non saresti in grado di risolvere il problema se non premendo il pulsante di ripristino o il ciclo di accensione e spegnimento. Naturalmente, uno di questi probabilmente rischia di danneggiare i file aperti.


La mia comprensione è corretta, che i limiti per utente impostati usando ulimit sono gli stessi per tutti gli utenti? Esiste un modo per utilizzare valori diversi per utente o no?
Oliver,

Sì, le impostazioni possono essere impostate sia a livello globale che per utente.
Warner,

Se ricevo il tuo post giusto, questo non è vero. È per processo generato dall'utente xy, e questo è limitato dal massimo del filesystem definito in /etc/sysctl.conf
Jeredepp

3
Il ulimitlimite non è per utente, ma per processo! Vedi unix.stackexchange.com/questions/55319/…
Tonin

@Tonin - Sì, questa risposta è sbagliata.
Nemo,

11

La limitazione di ulimit è per utente unico. Quindi user1, indipendentemente da quante volte ha effettuato l'accesso o i processi in esecuzione, sarebbe limitato a 1024. È combinato.

Non sono sicuro di aver compreso appieno il significato di quella frase (l'inglese non è la mia lingua madre) Se quella frase indica che la configurazione ulimit per i descrittori di file non è una limitazione per processo, la risposta accettata (AFAIK) è errata.

Voglio dire, se un utente ha avviato 4 processi e la configurazione ulimit per FD è 1024, ogni processo può aprire 1024 FD. L'utente non sarà limitato a 1024 FD ma ai processi che vengono lanciati da quell'utente.

Per esempio:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

Ecco un esempio perl in cui raggiungiamo il limite (è un limite per processo):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Risultato:

FDs: 1021 Too many open files at ./test.pl line 8.

1021 perché c'erano 3 descrittori di file aperti prima di raggiungere il ciclo while (stdout, stdin e stderr)

Scusate se sbaglio completamente o ho frainteso la risposta.


Quindi hai ragione. La risposta di @ Warner è sbagliata in questo senso perché il limite è basato su una procedura per processo e non per utente
filipenf,
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.