Optimaler Wert für Nginx worker_connections


25

Nginx worker_connections"legt die maximale Anzahl gleichzeitiger Verbindungen fest, die von einem Worker-Prozess geöffnet werden können. Diese Anzahl umfasst alle Verbindungen (z. B. Verbindungen mit Proxy-Servern ua), nicht nur Verbindungen mit Clients. Eine weitere Überlegung ist, dass die tatsächliche Anzahl gleichzeitiger Verbindungen kann das aktuelle Limit für die maximale Anzahl offener Dateien nicht überschreiten ". Ich habe einige Fragen dazu:

  1. Was sollte der optimale oder empfohlene Wert dafür sein?
  2. Was sind die Nachteile einer hohen Anzahl von Worker-Verbindungen?

+1, gute Frage!
7.

Antworten:


31

Nehmen wir den pragmatischen Ansatz.

All diese Grenzen sind Dinge, die im vergangenen Jahrhundert, als Hardware langsam und teuer war, fest programmiert und entworfen wurden. Wir sind jetzt im Jahr 2016, ein durchschnittlicher Wall-Mart-Toaster kann mehr Anfragen als die Standardwerte verarbeiten.

Die Standardeinstellungen sind tatsächlich gefährlich. Hunderte von Benutzern auf einer Website zu haben, ist nichts Beeindruckendes.

worker_process

Eine verwandte Einstellung, lassen Sie es uns erklären, während wir uns mit dem Thema befassen.

Nginx als Load Balancer:

  • 1 Worker für den HTTP-Lastenausgleich.
  • 1 Worker pro Core für den HTTPS-Lastenausgleich.

Nginx als Webserver:

Dieser ist schwierig.

Einige Anwendungen / Frameworks / Middleware (z. B. php-fpm) werden außerhalb von Nginx ausgeführt. In diesem Fall ist 1 Nginx-Worker ausreichend, da in der Regel die externe Anwendung die umfangreiche Verarbeitung und den Ressourcenverbrauch übernimmt.

Einige Anwendungen / Frameworks / Middleware können jeweils nur eine Anforderung verarbeiten, und es kommt zu einem Fehlschlag, wenn sie überlastet werden.

Im Allgemeinen ist ein Arbeiter immer eine sichere Wette.

Andernfalls können Sie einen Arbeiter pro Kern einsetzen, wenn Sie wissen, was Sie tun. Ich würde diesen Weg als eine Optimierung betrachten und ein richtiges Benchmarking und Testen empfehlen.

worker_connections

Die Gesamtzahl der Verbindungen beträgt worker_process * worker_connections. Die Hälfte im Lastausgleichsmodus.

Jetzt erreichen wir den Toasterteil. Es gibt viele stark unterschätzte Systemgrenzen:

  • ulimits ist 1k max offene Dateien pro Prozess unter Linux (1k soft, 4k hard bei einigen Distributionen)
  • systemd limits entspricht in etwa ulimits.
  • Nginx Standard ist 512 Verbindungen pro Worker.
  • Es könnte mehr geben: SELinux, sysctl, supervisord (jede Distribution + Version ist etwas anders)

1k worker_connections

Die sichere Voreinstellung ist, überall 1k zu setzen.

Es ist hoch genug, um mehr als die meisten internen und unbekannten Websites jemals zu sein. Es ist niedrig genug, um keine anderen Systemgrenzen zu überschreiten.

10k worker_connections

Es ist sehr verbreitet, Tausende von Kunden zu haben, insbesondere für eine öffentliche Website. Ich habe aufgehört, die Anzahl der Websites zu zählen, die aufgrund der geringen Standardeinstellungen gesunken sind.

Das für die Produktion akzeptable Minimum beträgt 10.000. Zugehörige Systemgrenzen müssen erhöht werden, um dies zu ermöglichen.

Es gibt kein zu hohes Limit (ein Limit hat einfach keine Wirkung, wenn es keine Benutzer gibt). Ein zu niedriges Limit ist jedoch eine sehr reale Sache, die abgelehnte Benutzer und eine tote Site zur Folge hat.

Mehr als 10k

10k ist schön und einfach.

Wir könnten ein willkürliches Limit von 1000kk setzen (es ist immerhin nur ein Limit), aber das ergibt praktisch keinen Sinn, wir bekommen diesen Traffic nie und können es trotzdem nicht aushalten.

Bleiben wir bei 10k als vernünftige Einstellung. Die Dienste, die mehr wollen (und können), erfordern ein spezielles Tuning und Benchmarking.

Spezialszenario: Erweiterte Verwendung

Manchmal wissen wir, dass der Server nicht über viele Ressourcen verfügt, und wir erwarten Spitzen, gegen die wir nicht viel tun können. Wir lehnen Benutzer lieber ab, als es zu versuchen. Legen Sie in diesem Fall ein angemessenes Verbindungslimit fest und konfigurieren Sie nützliche Fehlermeldungen und Vorgehensweisen.

Manchmal funktionieren die Back-End-Server gut und gut, aber nur bis zu einer gewissen Auslastung , und alles geht schnell nach Süden. Wir möchten lieber langsamer fahren, als dass die Server abstürzen. Konfigurieren Sie in diesem Fall die Warteschlangen mit strengen Grenzwerten, und lassen Sie Nginx die gesamte Wärme puffern, während die Anforderungen in einem begrenzten Tempo ausgeführt werden.


Ich mag die Antwort, aber um wirklich zu erraten, wie hoch man das einstellen sollte, müssen wir anscheinend ungefähr wissen, wie viel RAM eine Verbindung benötigt (z. B. um eine normale statische Datei mit zu speichern sendfile), damit wir sie multiplizieren können Berechnen Sie, wie viel RAM benötigt würde, um eine bestimmte Anzahl von zu unterstützen worker_connections.
nh2

1
Du kannst bis zu 10k machen, ohne zu viel zu tunen. Die Verbindungspuffer werden in den sysctlEinstellungen festgelegt.
user5994461

10

ulimit -a zeigt an, wie viele offene Dateien Ihr System für einen Prozess zulässt.

Außerdem net.ipv4.ip_local_port_rangesetzt das gesamte Spektrum der Steckdosen pro IP zu ermöglichen.

Sie worker_connectionskönnen also nicht mehr als diese sein, oder Ihre Client-Verbindungen werden in der Warteschlange bleiben, bisnet.core.netdev_max_backlog - die Gesamtgröße der TCP-Warteschlange erreicht ist.

Beachten Sie, dass bei Verwendung von Nginx als Reverse-Proxy zwei Sockets pro Verbindung verwendet werden. Möglicherweise möchten Sie ein wenig mit net.ipv4.tcp_fin_timeoutund anderen kernel-tcp-bezogenen Timeouts spielen, um zu versuchen, den Status der Sockets schnell zu ändern. Eine andere Sache, die Sie beachten sollten, ist, dass jeder Socket den Speicher des TCP-Speicherstapels zuweist. Sie können auch einige Grenzen des TCP-Speicherstapels festlegen, indem sysctlSie mehr Druck auf den RAM ausüben, solange Sie über eine CPU und genügend Datei-Handler verfügen.

Zu Ihrer Information: Wenn genügend Rechenressourcen zur Verfügung stehen, ist es möglich, einen Server mit ca. 32 GB RAM und einige virtuelle Netzwerkschnittstellen für die gleichzeitige Bearbeitung von 1-MM-Verbindungen mit einigen Kernel-Optimierungen mithilfe von sysctl zu haben. Während meiner Tests mit mehr als 1MM und einer Nutzlast von ca. 700Byte benötigte der Server ca. 10 Sekunden, um ca. 1,2MM simultane Clients zu aktualisieren. Als nächstes sollte die Netzwerkbandbreite erhöht werden, indem einige zusätzliche Netzwerkkarten verbunden und virtuelle Netzwerkkarten über Bord geworfen wurden. Aufgrund der Nutzlast, der Bandbreite und der angemessenen Zeit für die Aktualisierung aller Clients ist eine pseudo-echtzeitnahe Kommunikation mit mehr als 1,2 Millionen Clients möglich.

Viel Spaß beim Stimmen!


Bitte korrigieren Sie den Befehl auf ulimit not ulimits
Ali.MD

Hinweis net.ipv4.ip_local_port_rangeist nur für ausgehende Verbindungen relevant , nicht für eingehende Verbindungen (wie es bei nginx z. B. an den Ports 80 und 443 üblich ist); siehe hier .
nh2

@ nh2 aber wenn man nginx als Reverse-Proxy verwendet, sind mindestens 2 Sockets pro Client-Verbindung offen, und dann ist es wichtig, an wie viele lokale Ports der Kernel Sockets binden lassen kann.
Marcel

Ja das ist richtig.
nh2

0

Die geeignete Größe kann durch Testen ermittelt werden, da sie von der Art des von Nginx verarbeiteten Datenverkehrs abhängt.

Theoretisch kann nginx Folgendes verarbeiten: max clients = worker_processes * worker_connections (* = multiplizieren) und worker_processes = Anzahl der Prozessoren

Verwenden Sie zum Ermitteln der Prozessoren Folgendes: grep processor / proc / cpuinfo | wc -l


Tatsächlich mit Reverse Proxy: max_clients = (worker_processes * worker_connections) / (X * 2), wobei X jedoch viele gleichzeitige Verbindungen zwischen diesen Clients und Ihnen darstellt. Außerdem werden Verbindungsstrukturen für Listen-Sockets, interne Steuer-Sockets zwischen Nginx-Prozessen und für Upstream-Verbindungen verwendet. Diese max clients = worker_processes * worker_connections funktionieren nicht, da wir nicht wissen, dass viele Verbindungen in internen Kontrollsockets verwendet werden.
Aarti

0

Das Festlegen von Untergrenzen kann nützlich sein, wenn Sie möglicherweise über eingeschränkte Ressourcen verfügen. Bei einigen Verbindungen handelt es sich beispielsweise um Keep-Alive-Verbindungen (nicht nur zu den Clients, sondern auch zu den Upstream-Servern) ), verschwenden effektiv Ihre Ressourcen (auch wenn nginx sehr effizient ist, was es ist) und sind für diese nicht erforderlich den ordnungsgemäßen Betrieb eines Allzweckservers, dh, sie können sicher gelöscht werden, um mehr Ressourcen für den Rest des Betriebs verfügbar zu machen.

Ein niedrigeres Ressourcenlimit würde daher für Nginx bedeuten, dass möglicherweise nur noch wenige physische Ressourcen zur Verfügung stehen. Die verfügbaren Ressourcen sollten neuen Verbindungen zugewiesen werden, anstatt den inaktiven Keep-Alive-Verbindungen auf Kosten neuerer Verbindungen zu dienen, bei denen Probleme beim Herstellen von Verbindungen auftreten bediene die dringlicheren Bedürfnisse.

Was ist der empfohlene Wert? Dies ist die Standardeinstellung.

Die Standardeinstellungen sind alle in der Dokumentation dokumentiert:

Voreinstellung: worker_connections 512;

Und kann bei an der Quelle-Code - Ebene bestätigtevent/ngx_event.c auch

13 # DEFAULT_CONNECTIONS definieren 512


0

Die Antwort von Marcel muss wirklich positiv bewertet werden! Wenn ulimits auf einen Standardwert von ungefähr 1 KB eingestellt ist, sollte max_connections auf den gleichen Wert eingestellt werden, da sonst die Einstellung von max_connections auf 10 KB keinen Vorteil bringt.

Sie erhalten eine Anfrage in der Warteschlange und Sockets, die auf nginx geschlossen werden, wenn "Ihre worker_connections nicht mehr als eine dieser Verbindungen sein können, oder Ihre Client-Verbindungen werden in die Warteschlange eingereiht, bis net.core.netdev_max_backlog - die Gesamtgröße der TCP-Warteschlange."

Ein einzelner Prozess kann ebenso wie die Verbindung geöffnet werden, wie es die Grenzen zulassen. num_workers * max_connections ist die Formel, aber außerhalb von Loadbalancer / Proxy müssen max-Verbindungen und -Ulimits berücksichtigt werden, um vernünftige Werte zu erhalten. Das Setzen von max_connection auf einen wirklich hohen Wert kann nach hinten losgehen, da Begrenzungen ein begrenzender Faktor sind.


1
Das ist sachlich falsch. Das Softlimit für Desktop-Linux beträgt 1 KB, verhindert jedoch nicht, dass Prozesse mehr als das von ihnen angeforderte Limit (32 KB oder mehr) verwenden. nginx erhöht das ulimit automatisch, wenn max_connectionses höher als das Standard- Softlimit ist.
user5994461
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.