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:
- Was sollte der optimale oder empfohlene Wert dafür sein?
- Was sind die Nachteile einer hohen Anzahl von Worker-Verbindungen?
Antworten:
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:
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:
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.
quelle
sendfile
), damit wir sie multiplizieren können Berechnen Sie, wie viel RAM benötigt würde, um eine bestimmte Anzahl von zu unterstützenworker_connections
.sysctl
Einstellungen festgelegt.ulimit -a
zeigt an, wie viele offene Dateien Ihr System für einen Prozess zulässt.Außerdem
net.ipv4.ip_local_port_range
setzt das gesamte Spektrum der Steckdosen pro IP zu ermöglichen.Sie
worker_connections
kö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_timeout
und 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, indemsysctl
Sie 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!
quelle
net.ipv4.ip_local_port_range
ist 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 .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
quelle
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:
Und kann bei an der Quelle-Code - Ebene bestätigt
event/ngx_event.c
auchquelle
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.
quelle
max_connections
es höher als das Standard- Softlimit ist.