Ich teste verschiedene Optionen für den Lastausgleich und erhalte schlechte Ergebnisse mit Nginx, Haproxy und Lack. Ich habe einen 4 GB Load Balancer bei Rackspace, der auf 4x1 GB App-Server trifft.
Ich treffe eine URL namens "/ slow", die absichtlich 500 ms wartet, bevor sie antwortet. Wenn ich einen Anwendungsserver direkt anrufe, kann er eine Verbindungsrate von 1600-1800 pro Sekunde verarbeiten.
Wenn ich den Nginx Load Balancer drücke, kann er nur etwa 2000 Verbindungen verarbeiten. Ich hatte auf etwas gehofft, das näher an 4x1600 = 6000 liegt. Unten ist der Befehl, mit dem ich es teste. Dies wird parallel auf 40 Instanzen mit 256 MB ausgeführt. Ich setze num_call absichtlich auf 1, weil ich die Verbindungsleistung sehen möchte. Höher als das und ich bekomme viele Fehler.
httperf --server 50.56.80.227 --port 1555 --uri /slow --rate 50 --num-call 1 --num-conn 100 --timeout 5
Hier ist meine Nginx-Konfiguration: https://gist.github.com/1299501
Also, hier ist die seltsame Sache, egal ob ich Nginx, Haproxy oder Lack verwende, ich erhalte ungefähr die gleichen Ergebnisse. Ich habe jedoch die neuen Cloud-Balancer von Rackspace getestet und sie erzielen eine viel bessere Leistung (gut mit 7000 / s). Da nginx und die anderen alle auf einer von mir eingerichteten Instanz ausgeführt werden und der Rackspace-Balancer nicht, schätze ich, dass etwas an dem System nicht stimmt. Ich würde lieber einen Balancer verwenden, den ich kontrolliere, damit ich Caching, GZIP, SSL und andere Dinge hinzufügen kann.
Wie kann ich herausfinden, was der Engpass ist? Gibt es irgendetwas, das ich am System optimieren sollte, um die Leistung zu verbessern? Benötige ich mehr als 4 GB RAM? (Die Ram-Nutzung ist während des Tests nicht hoch). Irgendwelche anderen zufälligen Ideen?
Update: Ich habe gerade die Größe des Balancers auf 8 GB geändert und er hat eine viel bessere Leistung, bis zu 6000-7000 oder vergleichbar mit den Rackspace-Balancern. Dies macht keinen Sinn, da zuvor nicht der Arbeitsspeicher knapp wurde.
Update: Hier ist ein Beispiel für die Ausgabe von httperf, wenn ich den Balancer überlade (bei der 8-GB-Version also höher als zuvor, aber die Fehler sind ähnlich): https://gist.github.com/1299628