2010-02-04 4 views
26

Ich habe gearbeitet, um eine relativ große Rails-App (Rails 2.3.5) zu implementieren und vor kurzem einige Belastungstests haben wir festgestellt, dass der Durchsatz für die Website ist weit unter dem erwarteten Verkehrsaufkommen.Passagier gehostet Rails App * schmerzhaft * langsam, aber der Server ist ein Biest

Wir waren auf einem Standard-32-Bit-Server, 3 GB RAM mit Centos, und wir haben Ruby Enterprise Edition (neueste Build), Passagier (neueste Build) und Nginx (neueste Build) - wenn nur ein oder zwei Benutzer die Website läuft gut (wie Sie erwarten würden) aber wenn wir versuchen, die Last auf ~ 50 gleichzeitige Anfragen zu erhöhen, stirbt es vollständig. (Apache Bench Bericht ~ 2.3 erf/s, das ist schrecklich)

Wir laufen RPM und zu versuchen, zu bestimmen, wo die Last Problem ist, aber es ist ziemlich gleichmäßig verteilt über Rails, SQL und Memcached, so dass wir mehr oder weniger durchgehen und die Codebasis optimieren.

Aus reiner Verzweiflung haben wir eine große EC2-Instanz (Ubuntu 9.10, 7.5GB RAM, 2 Compute Units/Cores) hochgefahren und die gleiche Konfiguration wie der ursprüngliche Server eingerichtet, und obwohl es mehr Ressourcen gab, sahen wir immer noch erbärmlich Ergebnisse.

Also, nach zu viel Zeit zu verbringen versuchen, zu optimieren, spielen mit Caching-Konfiguration usw. Ich beschloss, den Durchsatz einiger Mischlinge zu testen, und ta-da, sie sind viel besser als Passenger.

Derzeit ist die Konfiguration 15x Bastarde wird über Nginx Proxy ist, und wir scheinen nur Erfüllung unserer Lastanforderungen werden, aber es ist nicht ganz genug, um mich bequem mit going live zu machen ... Was ich frage mich, wenn jemand weiß, von einigen möglichen Ursachen dafür ...?

Meine Konfiguration für Fahrgast-/nginx war:

  • Nginx Arbeiter: versuchte, zwischen 1 und 10, obwohl in der Regel drei.
  • Passagier max Poolgröße: 10 - 30 (ja, diese Zahlen sind ziemlich hoch)
  • Passagier globale Warteschlangen: versucht sowohl an und aus.
  • Nginx GZIP auf: ja

Es könnte bezahlen zu beachten, dass wir die nginx max Client Körpergröße zu 200 m erhöht hatte für große Datei-Uploads zu ermöglichen.

Wie auch immer Vorschläge wäre wirklich geschätzt, während die Mischlinge funktionieren gut es ändert, wie wir die Dinge viel tun, und ich würde wirklich lieber Passagier verwenden - außerdem war es nicht zu erleichtern und besser zu machen ?

+4

Nur fyi hier ist die Erklärung: Der Unterschied ist, dass Mongrels getrennte Instanzen spawnen Ihrer App, so dass jede App ihren eigenen SQL-Pool hat, während der Passagier neue Instanzen aus einem einzigen vorinitialisierten App-Spawner abgibt (was viel schneller ist), also teilt er Ihren SQL-Pool. – hurikhan77

+0

Danke für die Erklärung - sobald wir die Änderungen an den Pools getestet haben (gut, sobald ich den Vorschlag gelesen habe) wurde es mir sehr klar - so weise Leute oft gesagt haben, manchmal braucht man nur ein anderes Augenpaar;) –

+0

Vielleicht möchten Sie Ihren Titel ändern, da dies als nicht-nginx-bezogene aufgelöst wird. Dies wird bei jeder Passagierbereitstellung auftreten, wenn Sie die Größe des SQL-Pools zu klein festlegen. – hurikhan77

Antwort

17

Vielleicht ist Ihre SQL-Pool-Größe zu klein? Dies begrenzt im Wesentlichen die Parallelität von Datenbank-Workloads in Ihrer Anwendung, die wiederum zu viel mehr Last aufbaut, sobald Sie Ihren App-Stack in Betrieb nehmen ...

+0

Wow, ich kann nicht glauben, dass ich nicht daran gedacht habe - wir haben den Pool auf eine höhere Nummer erhöht (gibt es so etwas wie 'zu hoch' ist 50 zu hoch?) Und der Unterschied ist * erstaunlich *. Vielen Dank für Ihren Vorschlag –

+0

Sie brauchen nicht mehr als Ihre Passagier-Pool-Größe ... Vielleicht geben Sie einen zusätzlichen Puffer von 4 oder 5. – hurikhan77

+0

@ Hurikhan77 - irgendwelche Vorschläge zu Passagier-Pool-Größen? Ich schätze 'es hängt von der Site, dem Server und den Anforderungen ab ...'? ;) –

2

Als einen ersten Schritt würde ich eine minimale "Hello World" Art Rails-Anwendung in Ihrer Umgebung implementieren und sehen, welchen Durchsatz Sie damit bekommen. Dadurch wissen Sie zumindest, ob Ihr Problem mit der Umgebung oder irgendwo in Ihrer Anwendung zusammenhängt.