Verständnis der maximalen Dateideskriptoren für Linux und Nginx und des besten Werts für worker_rlimit_nofile

10

Ich habe den scheinbar häufigen Fehler "zu viele Dateideskriptoren" auf nginx erhalten. Nach langem Suchen besteht die Lösung eindeutig darin, die Anzahl der für nginx verfügbaren Dateideskriptoren zu erhöhen. Aber es gibt nicht genug Informationen, damit ich mich auf sinnvolle und sichere Weise wohl fühle. Hier sind die wichtigsten Punkte, die in den meisten Forum- / E-Mail-Threads behandelt werden:

  • Das Betriebssystem hat eine eigene Gesamtbeschreibung für Dateideskriptoren (auf meinem System wird cat /proc/sys/fs/file-max"100678" ausgegeben).
  • Jeder Benutzer kann auch sein eigenes Limit haben (aber auf meinem System, ulimitwenn jeder Benutzer "unbegrenzt" ausgibt, siehe Update unten mit mehr Details )
  • Einige Leute sagten etwas in Anlehnung an das, was diese Person sagte: 'Die Richtlinie worker_rlimit_nofile gibt nicht "wie viele" an, sondern das Betriebssystemlimit, das dies tut. Die Richtlinie worker_rlimit_nofile ermöglicht nur eine schnelle und schmutzige Möglichkeit, diese Grenze zu vergrößern, wenn dies nicht ausreicht. ' Ich denke also, die Implikation ist, dass es "besser" ist, das Limit für den Nginx OS-Benutzer anstatt in der Konfiguration festzulegen?

Ich kann einfach einen worker_rlimit_nofile-Wert eingeben, der größer ist als die Anzahl der Verbindungen pro Worker, und ihn einen Tag nennen, aber ich habe das Gefühl, dass ich nicht wirklich weiß, was hier vor sich geht.

  • Warum sollte das Limit pro Worker unter dem OS-Limit liegen?
  • Wie finde ich heraus, wo mein Limit jetzt liegt?

Update : Sowohl für Root als auch für einen normalen Benutzer gibt ulimit "unbegrenzt" aus, ABER ulimit -Hnund ulimit -Snbeide geben 1024 aus

John Bachir
quelle

Antworten:

10

worker_rlimit_nofilelegt das Limit für Dateideskriptoren für die Arbeitsprozesse fest, im Gegensatz zu dem Benutzer, der nginx ausführt. Wenn andere Programme, die unter diesem Benutzer ausgeführt werden, nicht in der Lage sind, das Auslaufen von Dateideskriptoren ordnungsgemäß zu handhaben, sollten Sie diese Grenze etwas niedriger als für den Benutzer festlegen.

Was verwenden Ihre Dateideskriptoren?

  1. Jede aktive Verbindung zu einem Client
  2. Proxy_pass verwenden? Dadurch wird ein Socket für den Host geöffnet: Port, der diese Anforderungen verarbeitet
  3. Verwenden Sie proxy_pass für einen lokalen Port? Das ist eine andere offene Steckdose. (Für den Eigentümer dieses Prozesses)
  4. statische Dateien, die von Nginx bereitgestellt werden

Warum sollte das Limit pro Worker unter dem OS-Limit liegen?

Dies wird vom Betriebssystem gesteuert, da der Worker nicht der einzige Prozess ist, der auf dem Computer ausgeführt wird. Informationen zum Ändern für den Benutzer, der nginx ausführt, finden Sie unten. Es wäre sehr schlecht, wenn Ihre Mitarbeiter alle für alle Prozesse verfügbaren Dateideskriptoren verbrauchen würden. Setzen Sie Ihre Grenzen nicht so, dass dies möglich ist.

#/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

Nach diesen Änderungen der Sicherheitsbeschränkungen musste ich meines Erachtens immer noch das Softlimit für den Benutzer erhöhen ulimit.

Wie finde ich heraus, wo mein Limit jetzt liegt?

ulimit -a Zeigt alle Grenzwerte an, die dem Benutzer zugeordnet sind, als den Sie es ausführen.

Dan R.
quelle
1
Vielen Dank - jetzt, da ich das Dateideskriptor-Limit erhöht habe, gehen mir die Verbindungen aus. Vielleicht kannst du mir auch dabei helfen :) serverfault.com/questions/209014/…
John Bachir
1
Hinweis für CentOS / Fedora-Benutzer: Wenn Sie SELinux aktiviert haben, müssen Sie es ausführen, setsebool -P httpd_setrlimit 1damit nginx über die Berechtigung zum Festlegen des Grenzwerts verfügt.
Jarrett
2

Ich muss die Quelle überprüfen, um ehrlich zu sein, aber sie ist ziemlich niedrig.

Ich habe verwendet worker_rlimit_nofile 15000;und hatte keine Probleme, Sie können es sicher erhöhen, aber die Wahrscheinlichkeit, dass die Dateideskriptoren ausgehen, ist winzig.

Martin Fjordvald
quelle