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
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:
|
<<: Einführung in die MySQL-Methode zum Löschen von Tabellendaten mit Fremdschlüsseleinschränkungen
>>: Was sind die Verwendungszwecke von Limits in MySQL (empfohlen)
Inhaltsverzeichnis Was ist die Picker-Komponente ...
Funktion Currying (schwarzes Fragezeichen)? ? ? C...
1. Zusammenfassung: Im Allgemeinen können sie in ...
Viele Websites verfügen oben über eine feste Navi...
Der Erste : Code kopieren Der Code lautet wie folg...
Inhaltsverzeichnis Tutorial-Reihe 1. Beschreibung...
Validierung des WeChat-Applets-Formulars. Zu Ihre...
1. readonly Nur-Lese-Attribut, so dass Sie den Wer...
<br />Vorheriger Artikel: Webdesign-Tutorial...
Inhaltsverzeichnis Vorwort Start Grundlegendes La...
Ich werde nicht erklären, was CUDA ist, sondern d...
Zuvor habe ich zusammengefasst, wie man mit CSS di...
Nachdem das Image erfolgreich erstellt wurde, kan...
Inhaltsverzeichnis MyISAM und InnoDB Gründe für L...
<br />Im gesamten Produktdesignprozess liege...