Optimieren von nginx worker_process, um 100.000 Treffer pro Minute zu erzielen

114

Wir haben einen Server, der eine HTML-Datei bereitstellt.

Derzeit verfügt der Server über 2 CPUs und 2 GB RAM. Von blitz.io erhalten wir ungefähr 12.000 Verbindungen pro Minute und 200 Zeitüberschreitungen in diesen 60 Sekunden mit 250 gleichzeitigen Verbindungen pro Sekunde.

worker_processes  2;

events {
 worker_connections 1024;
}

Wenn ich das Timeout erhöhe, steigt die Reaktionszeit über eine Sekunde hinaus an.

Was kann ich noch tun, um mehr Saft daraus zu pressen?

ablemike
quelle

Antworten:

186

Konfigurationsdatei:

worker_processes  4;  # 2 * Number of CPUs

events {
    worker_connections  19000;  # It's the key to high performance - have a lot of connections available
}

worker_rlimit_nofile    20000;  # Each connection needs a filehandle (or 2 if you are proxying)


# Total amount of users you can serve = worker_processes * worker_connections

Weitere Informationen: Optimierung von Nginx für hohe Verkehrslasten

Bulat
quelle
14
Ich denke, die Gleichung für die Gesamtzahl der Benutzer pro Sekunde ist falsch. Stattdessen sollte die durchschnittliche Anzahl der Benutzer, die pro Sekunde bedient werden, = worker_processes * worker_connections / (keepalive_timeout * 2) sein. Daher kann die obige conf-Datei ~ 7,6 KB Verbindungen pro Sekunde verarbeiten, was weit über den Anforderungen von @ablemike liegt. Worker_rlimit_nofile ist jedoch eine gute Anweisung, wenn ulimit restriktiv ist und Sie es nicht ändern möchten.
Ethan
2
@Ethan, warum sollte es durch 2 geteilt werden? Wenn wir jede Sekunde 100 neue Verbindungen erhalten und das Zeitlimit 5 beträgt, und dann mit der sechsten Sekunde, haben wir ständig 5 * 100 Verbindungen, die auf der Serverseite immer noch nicht beendet werden. Wir können weniger haben, wenn einige Benutzer Verbindungen selbst abgebrochen werden
Bulat
3
Diese Formel funktioniert nicht, wenn Keepalive auf 0s (deaktiviert) gesetzt ist
Tilo
5
Jede Verbindung benötigt 2 Dateihandles, auch für statische Dateien wie images / JS / CSS. Dies ist 1 für die Verbindung des Clients und 2 für das Öffnen der statischen Datei. Daher ist es sicherer, worker_rlimit_nofile = 2 * worker_connections zu ändern.
Ethan
4
Verwenden Sie worker_rlimit_nofile, aber Sie sollten auch 'ulimit -n' aufrufen, um den Wert für die Anzahl der geöffneten Dateien pro Prozess festzulegen. Dies geschieht besser im Init-Skript.
Ethan