So steigern Sie Ihre Web-Performance um das Dreifache, indem Sie einen Parameter in Nginx aktivieren

So steigern Sie Ihre Web-Performance um das Dreifache, indem Sie einen Parameter in Nginx aktivieren

1. Einige aufgetretene Probleme

Ich erinnere mich, dass wir für unsere Leistungstests im Jahr 2008 sieben neue Lenovo 4-Core 4G-Server gekauft haben.

Zu dieser Zeit waren die Ressourcen knapp und auf allen sieben Servern waren Dualsysteme (Win2003/CentOS5) installiert und sie wurden im Leerlauf als Testmaschinen (Stresstest-Agenten) verwendet.

Damals habe ich eine Reihe von Tests mit Nginx durchgeführt und was mich am meisten beeindruckt hat, war der Stresstest der Nginx-Statusseite auf dieser Gruppe von Maschinen.

Für kurze Verbindungen liegt der beste QPS-Wert bei etwa 40.000, für lange Verbindungen liegt der höchste QPS-Wert bei etwa 130.000.

Ungefähr drei Jahre später interessierte sich niemand mehr für diese Lenovo-Server und sie konnten nur noch als Zombie-Maschinen verwendet werden.

Ein versehentlicher Test ergab jedoch, dass die beste QPS bei kurzen Verbindungen unabhängig von der Leistung des Servers nicht viel höher sein wird. Darüber hinaus sind die Ressourcen der Testmaschine nicht erschöpft, die Ressourcen des getesteten Servers sind nicht erschöpft und es gibt keinen Netzwerkengpass.

Die Serverressourcenauslastung ist gering, die Reaktion ist jedoch einfach nicht schnell genug.

Schließlich stellten wir fest, dass der Engpass am Eingang der Überwachung lag! Ist es möglich, die Leistung des Listener-Eintrags zu verbessern? Ist eine Port-Wiederverwendung möglich? Schließlich haben wir SO_REUSEPORT gefunden.

SO_REUSEPORT unterstützt die Bindung mehrerer Prozesse oder Threads an denselben Port und verbessert so die Leistung des Serverprogramms.

2. Lösung

Testumgebung

  Dell PowerEdge M620 Intel(R)Xeon(R)CPU E5–2620v2@2,10GHz
Linux3.16.0–4–amd64#1 SMP Debian 3.16.7-ckt11-1+deb8u3 (04.08.2015) x86_64 GNU/Linux
Ethernet-Controller: Broadcom Corporation NetXtreme II BCM5781010Gigabit Ethernet (rev10)

Kompilierungsparameter anzeigen

Die Nginx-Konfiguration ist wie folgt:

Beachten Sie, dass es einen reuse_port-Parameter gibt

Benutzer-WWW-Daten;
Arbeiterprozesse automatisch;
pid/ausführen/nginx.pid;
Ereignisse{
verwendenepoll;
multi_accept ein;
Wiederverwendungsport ein;
Arbeiterverbindungen 1048576;
}
dso{# Funktionsmodul /usr/share/nginx/modules dynamisch laden
lade ngx_http_memcached_module.so;
lade ngx_http_limit_conn_module.so;
lade ngx_http_empty_gif_module.so;
lade ngx_http_scgi_module.so;
lade ngx_http_upstream_session_sticky_module.so;
lade ngx_http_user_agent_module.so;
lade ngx_http_referer_module.so;
lade ngx_http_upstream_least_conn_module.so;
lade ngx_http_uwsgi_module.so;
lade ngx_http_reqstat_module.so;
lade ngx_http_browser_module.so;
lade ngx_http_limit_req_module.so;
lade ngx_http_split_clients_module.so;
lade ngx_http_upstream_ip_hash_module.so;
}
http{
/etc/nginx/mime.types einschließen;
Standardtyp Text/Plain;
Zugriff_Abmeldung;
sendfile an;
tcp_nopush ein;
tcp_nodelay ein;
Server-Tokens aus;
KeepAlive-Timeout 120;
Servernamen_Hash_Bucket_Größe512;
Servername_in_Redirect aus;
fastcgi_connect_timeout3s;
fastcgi_send_timeout3s;
fastcgi_read_timeout3s;
fastcgi_buffer_size128k;
fastcgi_buffers8128k;
fastcgi_busy_buffers_size256k;
fastcgi_temp_file_write_size256k;
maximale Hash-Größe von Variablen: 1024;
setze_reale_IP_von10.0.0.0/8;
setze_reale_IP_von172.28.0.0/16;
setze_reale_IP_von192.168.0.0/16;
real_ip_headerX–Weitergeleitet–Für;
gzip aus;
gzip_disable "msie6";
gzip_min_Länge1k;
gzip_buffers1664k;
gzip_http_version1.1;
gzip_comp_level6;
gzip_types Text/Klartext/CSS-Anwendung/JSON-Anwendung/Javascript-Text/XML-Anwendung/XML-Anwendung/XML+RSS-Text/Javascript;
gzip_vary ein;
ssl_protocols TLSv1 TLSv1.1TLSv1.2;# SSLv3 wird gelöscht, Ref.: POODLE
ssl_prefer_server_ciphers ein;
Zugriffsprotokoll/var/log/nginx/access.log;
Fehlerlog/var/log/nginx/error.log;
Server{
hören Sie 80backlog=65535;
Zeichensatz UTF-8;
location/{# Tengine-Statusseite drucken stub_status on;# Statusseite öffnen, auf http_stub_status_module-Modul zurückgreifen access_log off;# Zugriffsvorgang nicht protokollieren}
location~^(.*)\/\.(svn|git|hg|bzr|cvs)\/{# Diese Verzeichnisse blockieren, alle verweigern;
Zugriff_Abmeldung;
log_not_found aus;
}
location~/\.{# Schützen Sie Verzeichnisse oder Dateien, die mit . beginnen, wie etwa .htaccess .bash_history
alles leugnen;
Zugriff_Abmeldung;
log_not_found aus;
}
Standort/nicht_löschen.html{
Zugriff_Abmeldung;
leeres_gif;
}
}
}

Stresstest reuse_port

Tengine unterstützt bereits reuse_port. Nachdem Sie reuse_port aktiviert haben, werden Sie feststellen, dass viele Prozesse gleichzeitig auf Port 80 lauschen:

Nachdem Sie Druck ausgeübt haben, werden Sie feststellen, dass Sie die Serverleistung steigern können:

Beim Vergleich der Ergebnisse des reuse_port-Tests waren die Freunde schockiert (die QPS der kurzen Verbindung überstieg 240.000)!

Jetzt, da die Wahrheit ans Licht gekommen ist, worauf warten Sie noch?

Finde es heraus

Während des Tests traten zahlreiche Fehler aufgrund von erhöhtem TCP auf: Mögliches SYN-Flooding auf Port 80.

Daher wurde die Parallelität auf 60.000 net.core.somaxconn = 65535 reduziert.

Schauen wir uns nach dem Schließen von reuse_port die Situation von perf top an:

Öffnen Sie dann reuse_port und vergleichen Sie die Ergebnisse von perf top:

Zoomen Sie nun in das von Nginx überwachte Backlog, um die Ressourcennutzung anzuzeigen:

Schauen wir uns die Warteschlangensituation zu diesem Zeitpunkt an (es gibt mehr als 10.000 Einträge):

Dann testen wir 300.000 gleichzeitige Verbindungen (MTT ist die mittlere Antwortzeit (ms)):

Nach einer Reihe von Optimierungen trat das TCP-Problem „Mögliches SYN-Flooding auf Port 80“ in derselben Umgebung mit derselben Parallelität nicht mehr auf. Es kam jedoch zu einer geringen Anzahl von Verbindungstimeouts:

Der Test ist nun abgeschlossen. Das Einschalten von reuse_port kann die Leistung tatsächlich um das Dreifache verbessern. Warum probieren Sie es nicht einfach mal aus?

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Verwenden des X-Sendfile-Headers in Nginx, um die Download-Leistung von PHP-Dateien zu verbessern (für den Download großer Dateien)
  • Django verwendet Sellerie und NGINX, um statische Seiten zu generieren und so eine Leistungsoptimierung zu erreichen
  • Detaillierte Erläuterung der besten Konfiguration für Nginx zur Verbesserung von Sicherheit und Leistung
  • Tutorial zum Aufbau eines Hochleistungs-Load-Balancing-Clusters mit Nginx+Tomcat
  • So erstellen Sie mit Nginx+Tomcat einen Hochleistungs-Load-Balancing-Cluster
  • Beschleunigen Sie die Nginx-Leistung: Aktivieren Sie GZIP und Cache
  • Lösung zur Leistungsoptimierung der Nginx-Serverkonfiguration
  • Einige Vorschläge zur Verbesserung der Nginx-Leistung

<<:  Einführung in die MySQL-Methode zum Löschen von Tabellendaten mit Fremdschlüsseleinschränkungen

>>:  Was sind die Verwendungszwecke von Limits in MySQL (empfohlen)

Artikel empfehlen

Globale Aufrufimplementierung von Vue2.x Picker auf mobilen Endgeräten

Inhaltsverzeichnis Was ist die Picker-Komponente ...

So implementieren Sie Funktions-Currying und -Decurrying in Javascript

Funktion Currying (schwarzes Fragezeichen)? ? ? C...

Zusammenfassung gängiger Docker-Befehle (empfohlen)

1. Zusammenfassung: Im Allgemeinen können sie in ...

3 Möglichkeiten zum Hinzufügen von Links zu HTML-Auswahl-Tags

Der Erste : Code kopieren Der Code lautet wie folg...

MySQL Serie 12 Backup und Wiederherstellung

Inhaltsverzeichnis Tutorial-Reihe 1. Beschreibung...

WeChat-Applet implementiert Formularüberprüfung

Validierung des WeChat-Applets-Formulars. Zu Ihre...

Webdesign-Tutorial (7): Verbesserung der Webdesign-Effizienz

<br />Vorheriger Artikel: Webdesign-Tutorial...

Ubuntu installiert mehrere Versionen von CUDA und wechselt jederzeit

Ich werde nicht erklären, was CUDA ist, sondern d...

So zeigen Sie den Rahmen an, wenn td leer ist

Zuvor habe ich zusammengefasst, wie man mit CSS di...

Implementierung des Pushens von Docker-Images zum Docker Hub

Nachdem das Image erfolgreich erstellt wurde, kan...

Vollständige MySQL-Lernhinweise

Inhaltsverzeichnis MyISAM und InnoDB Gründe für L...

Über visuelles Design und Interaktionsdesign

<br />Im gesamten Produktdesignprozess liege...