Ich habe ein kleines VPS-Setup mit Nginx. Ich möchte so viel Leistung wie möglich daraus ziehen, also habe ich mit Optimierung und Lasttests experimentiert.
Ich verwende Blitz.io, um Lasttests durchzuführen, indem ich eine kleine statische Textdatei erhalte und auf ein seltsames Problem stoße, bei dem der Server TCP-Resets zu senden scheint, sobald die Anzahl der gleichzeitigen Verbindungen ungefähr 2000 erreicht. Ich weiß, dass dies ein sehr großes Problem ist große Menge, aber durch die Verwendung von htop hat der Server immer noch viel Zeit und Arbeitsspeicher zu sparen. Daher möchte ich die Ursache dieses Problems herausfinden, um zu sehen, ob ich es noch weiter vorantreiben kann.
Ich verwende Ubuntu 14.04 LTS (64-Bit) auf einem 2 GB Linode VPS.
Ich habe nicht genug Ruf, um dieses Diagramm direkt zu veröffentlichen. Hier ist ein Link zum Blitz.io-Diagramm:
Hier sind Dinge, die ich getan habe, um die Ursache des Problems herauszufinden:
- Der Nginx-Konfigurationswert
worker_rlimit_nofile
ist auf 8192 festgelegt - haben
nofile
auf 64000 für harte und weiche Grenzwerte fürroot
undwww-data
Benutzer (als was nginx läuft) in eingestellt/etc/security/limits.conf
Es gibt keine Anzeichen dafür, dass etwas schief geht
/var/log/nginx.d/error.log
(normalerweise druckt nginx Fehlermeldungen, wenn Sie auf Dateideskriptor-Grenzwerte stoßen).Ich habe ufw Setup, aber keine Regeln zur Ratenbegrenzung. Das ufw-Protokoll zeigt an, dass nichts blockiert wird, und ich habe versucht, ufw mit demselben Ergebnis zu deaktivieren.
- Es gibt keine indikativen Fehler in
/var/log/kern.log
- Es gibt keine indikativen Fehler in
/var/log/syslog
Ich habe die folgenden Werte hinzugefügt
/etc/sysctl.conf
und siesysctl -p
ohne Wirkung geladen :net.ipv4.tcp_max_syn_backlog = 1024 net.core.somaxconn = 1024 net.core.netdev_max_backlog = 2000
Irgendwelche Ideen?
EDIT: Ich habe einen neuen Test durchgeführt und auf 3000 Verbindungen in einer sehr kleinen Datei (nur 3 Bytes) hochgefahren. Hier ist das Blitz.io-Diagramm:
Laut Blitz sind alle diese Fehler "TCP Connection Reset" -Fehler.
Hier ist das Linode-Bandbreitendiagramm. Beachten Sie, dass dies ein 5-Minuten-Durchschnitt ist, sodass der Tiefpass etwas gefiltert wird (die momentane Bandbreite ist wahrscheinlich viel höher), aber dennoch ist dies nichts:
ZENTRALPROZESSOR:
E / A:
Hier ist gegen htop
Ende des Tests:
Ich habe auch einen Teil des Datenverkehrs mit tcpdump in einem anderen (aber ähnlich aussehenden) Test erfasst und die Erfassung gestartet, als die Fehler auftraten:
sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80
Hier ist die Datei, wenn jemand sie sich ansehen möchte (~ 20 MB): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing
Hier ist ein Bandbreitendiagramm von Wireshark:
(Zeile ist alle Pakete, blaue Balken sind TCP-Fehler)
Aus meiner Interpretation des Captures (und ich bin kein Experte) geht hervor, dass die TCP-RST-Flags von der Lasttestquelle und nicht vom Server stammen. Unter der Annahme, dass auf der Seite des Lasttestdienstes etwas nicht stimmt, kann man dann davon ausgehen, dass dies das Ergebnis einer Art Netzwerkverwaltung oder DDOS-Minderung zwischen dem Lasttestdienst und meinem Server ist?
Vielen Dank!
net.core.netdev_max_backlog
bis 2000 eingerichtet haben? Einige Beispiele, die ich gesehen habe, haben es um eine Größenordnung höher für Gigabit- (und 10Gig-) Verbindungen.