Ich erstelle ein Analysepaket und laut Projektanforderungen muss ich 1 Milliarde Zugriffe pro Tag unterstützen. Ja, "Milliarden". Mit anderen Worten, nicht weniger als 12.000 Treffer pro Sekunde und vorzugsweise etwas Platz zum Platzen. Ich weiß, dass ich dafür mehrere Server benötige, aber ich versuche, die maximale Leistung jedes Knotens herauszuholen, bevor ich "mehr Hardware draufbringe".
Im Moment habe ich den Teil zur Verfolgung von Treffern fertiggestellt und gut optimiert. Ich speichere die Anfragen so ziemlich nur direkt in Redis (für die spätere Verarbeitung mit Hadoop). Die Anwendung ist Python / Django mit einem Gunicorn für das Gateway.
Mein Ubuntu 10.04-Rackspace-Server mit 2 GB (keine Produktionsmaschine) kann ungefähr 1200 statische Dateien pro Sekunde verarbeiten (mit Apache AB als Benchmark für ein einzelnes statisches Asset). Zum Vergleich: Wenn ich den statischen Dateilink gegen meinen Tracking-Link austausche, erhalte ich immer noch ungefähr 600 Anfragen pro Sekunde. Ich denke, dies bedeutet, dass mein Tracker gut optimiert ist, da er nur um den Faktor 2 langsamer ist, als dasselbe statische Asset zu liefern wiederholt.
Wenn ich jedoch mit Millionen von Treffern vergleiche, bemerke ich ein paar Dinge -
- Keine Datenträgerverwendung - dies wird erwartet, da ich alle Nginx-Protokolle deaktiviert habe und mein benutzerdefinierter Code nichts anderes tut, als die Anforderungsdetails in Redis zu speichern.
- Nicht konstante Speichernutzung - Vermutlich aufgrund der Speicherverwaltung von Redis steigt meine Speichernutzung allmählich an und fällt dann wieder ab, aber das war noch nie mein Engpass.
- Die Systemlast schwankt zwischen 2 und 4, das System reagiert auch bei meinen schwersten Benchmarks noch und ich kann http://mysite.com/tracking/pixel mit geringer sichtbarer Verzögerung manuell anzeigen, während mein (anderer) Server 600 Anforderungen pro ausführt zweite.
- Wenn ich einen kurzen Test durchführe, sagen wir 50.000 Treffer (dauert etwa 2 m), erhalte ich stabile und zuverlässige 600 Anfragen pro Sekunde. Wenn ich einen längeren Test durchführe (bis jetzt bis zu 3,5 m ausprobiert), verringert sich mein R / S auf etwa 250.
Meine Fragen --
ein. Schaut es so aus, als würde ich diesen Server schon ausreizen? Ist die Nginx-Leistung von statischen Dateien mit 1.200 / s mit der Leistung anderer vergleichbar?
b. Gibt es gängige Nginx-Tunings für solche Großserienanwendungen? Ich habe Worker-Threads auf 64 und Gunicorn-Worker-Threads auf 8 gesetzt, aber das Optimieren dieser Werte scheint mir nicht viel zu helfen oder zu schaden.
c. Gibt es irgendwelche Linux-Level-Einstellungen, die meine eingehenden Verbindungen einschränken könnten?
d. Was kann dazu führen, dass sich meine Leistung bei Langzeittests auf 250 U / s verschlechtert? Auch hier ist der Speicher während dieser Tests nicht voll, und die Festplattennutzung ist gleich Null.
Danke im Voraus an alle :)
BEARBEITEN Hier ist meine Nginx-Konfiguration - http://pastie.org/1450749 - es handelt sich hauptsächlich um Vanille mit offensichtlich abgeschnittenem Fett.