comprensione dei descrittori di file max per linux e nginx e valore migliore per worker_rlimit_nofile


10

Ho avuto l'errore "troppi descrittori di file" apparentemente comune su nginx. Dopo molte ricerche, la soluzione è chiaramente quella di aumentare il numero di descrittori di file disponibili su nginx. Ma non ci sono abbastanza informazioni là fuori per farmi sentire a mio agio nel farlo in modo significativo e sicuro. Ecco i punti principali trattati dalla maggior parte dei thread di forum / e-mail:

  • il sistema operativo ha il proprio limite di descrittore di file totale (sul mio sistema, cat /proc/sys/fs/file-maxgenera "100678")
  • anche ogni utente può avere il proprio limite (ma sul mio sistema, funzionando ulimitcome qualsiasi utente produce "illimitato" vedi aggiornamento in fondo con maggiori dettagli )
  • alcune persone hanno detto qualcosa in linea con quanto affermato da questa persona : "Direttiva worker_rlimit_nofile non specifica" quante ", è il limite del sistema operativo che lo fa. La direttiva worker_rlimit_nofile consente solo un modo rapido e sporco di ampliare questo limite se non è sufficiente. " Quindi suppongo che l'implicazione sia che è "meglio" impostare il limite per l'utente del sistema operativo nginx anziché nella configurazione?

Posso semplicemente inserire un valore worker_rlimit_nofile maggiore del numero di connessioni per lavoratore e chiamarlo un giorno, ma sento di non sapere davvero cosa sta succedendo qui.

  • perché il limite per lavoratore dovrebbe essere inferiore al limite del sistema operativo?
  • Come faccio a sapere qual è il mio limite ora?

aggiornamento : sia per utenti root che normali, output ulimit "illimitato", MA ulimit -Hned ulimit -Snentrambi output 1024

Risposte:


10

worker_rlimit_nofileimposterà il limite per i descrittori di file per i processi di lavoro rispetto all'utente che esegue nginx. Se altri programmi in esecuzione sotto questo utente non saranno in grado di gestire con grazia l'esaurimento dei descrittori di file, è necessario impostare questo limite leggermente inferiore rispetto a ciò che è per l'utente.

Innanzitutto, cosa sta usando i tuoi descrittori di file?

  1. Ogni connessione attiva a un client
  2. Usi proxy_pass? Ciò aprirà un socket per l'host: porta che gestisce queste richieste
  3. Usi proxy_pass su una porta locale? Questo è un altro socket aperto. (Per il proprietario di quel processo)
  4. file statici forniti da nginx

Perché il limite per lavoratore dovrebbe essere inferiore al limite del sistema operativo?

Questo è controllato dal sistema operativo perché il lavoratore non è l'unico processo in esecuzione sulla macchina. Per modificarlo per l'utente che esegue nginx, vedere di seguito. Sarebbe molto brutto se i tuoi dipendenti usassero tutti i descrittori di file disponibili per tutti i processi, non impostare i tuoi limiti in modo che sia possibile.

#/etc/sysctl.conf
#This sets the value you see when running cat  /proc/sys/fs/file-max
fs.file-max = 65536"


#/etc/security/limits.conf
#this sets the defaults for all users
* soft nofile 4096
* hard nofile 4096

#This overrides the default for user `usernamehere`
usernamehere soft nofile 10240
usernamehere hard nofile 10240

Dopo queste modifiche ai limiti di sicurezza, credo di dover ancora aumentare il limite per l'utente che lo utilizza ulimit.

Come faccio a sapere qual è il mio limite ora?

ulimit -a Visualizzerà tutti i limiti associati all'utente con cui lo esegui.


1
Grazie - ora che ho superato il limite del descrittore di file, sto finendo le connessioni. Forse puoi aiutarmi anche in questo :) serverfault.com/questions/209014/…
John Bachir

1
Nota per gli utenti CentOS / Fedora, se hai SELinux abilitato, dovrai eseguirlo in setsebool -P httpd_setrlimit 1modo che nginx disponga delle autorizzazioni per impostare il suo limite.
Jarrett,

2

Devo controllare la fonte per essere onesti, ma è abbastanza basso.

Ho usato worker_rlimit_nofile 15000;e non ho avuto problemi, puoi tranquillamente aumentarlo, tuttavia, la possibilità di rimanere senza descrittori di file è minima.

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.