2010-11-22 7 views
4

Ich habe eine kleine Rails-App entwickelt, die Rails 3.0.0 und Ruby 1.9.2 verwendet. Während des Tests auf meinem PC ist die Leistung in Ordnung. Ich habe es mit Apache und mod_rails auf mein VPS für die Produktion gelegt, und manchmal ist die Leistung schrecklich.Wie finde ich heraus, warum meine App rails 3 mit mod_rails so langsam ist?

Hier ist ein Beispiel aus dem production.log:

loszulegen "/ Tracker" für xx.xx.xx.xx bei 2010-11-21 21.49.56 -0500
Verarbeitung durch FleetsController # Index als HTML
Rendered Layouts/_stylesheets.html.haml (0,8 ms)
Rendered Layouts/_header.html.haml (1,0 ms)
Rendered Layouts/_footer.html.haml (0,0 ms)
Rendered pages/about.html.haml in Layouts/Anwendung (4.5ms)
Fertiggestellt 200 OK in 15ms (Aufrufe: 14.3ms | Active: 0,0 ms)

loszulegen "/ Tracker /" für xx.xx.xx.xx bei 2010-11-21 21:50:02 -0500
Verarbeitung von FleetsController # Index als HTML
Rendered Layouts /_stylesheets.html.haml (0,7 ms)
Tragenes Layouts/_header.html.haml (1,1 ms)
Tragenes Layouts/_footer.html.haml (0,0 ms)
Tragenes Flotten/index.html.haml innerhalb Layouts/application (7.8ms)
Fertig 200 OK in 1901ms (Aufrufe: 7,8ms | ActiveRecord: 1.5ms)

loszulegen "/ Tracker/Flotten/XXXXXXXXX" für xx.xx.xx.xx bei 2010-11-21 21.50.06 -0500
Verarbeitung von FleetsController # show als HTML
Parameter: { "id "=>" XXXXXXXXX "}
Tragenes Flotten/_details_inner.html.haml (1,2 ms)
Tragenes Flotten/_details.html.haml (2.1ms)
Tragenes Flotten/_summary.html.haml (3,5 ms)
Gerenderte Flotten/_scouts_inner.html.haml (1,3 ms)
Gerenderte Flotten/_scouts.html.haml (3,5 ms)
Gerenderte Berichte/_report.html.haml (0,5 ms)
Tragenes Flotten/_reports.html.haml (3,0 ms)
Tragenes Flotten/_recon_form.html.haml (39.9ms)
Tragenes Flotten/_recon.html.haml (40.8ms)
Tragenes Benutzer/_user.html .haml (1,2 ms)
Tragenes Flotten/_pilots.html.haml (1.9ms)
Tragenes Layouts/_stylesheets.html.haml (0,5 ms)
Tragenes Layouts/_header.html.haml (0.9ms)
Gerenderte Layouts/_footer.html.haml (0.0ms)
Gerenderte Flotten/show.html.haml in Layouts/Anwendung (60,2ms)
200 OK in 495ms abgeschlossen (Aufrufe: 59.1ms | ActiveRecord: 2,9 ms)

Der erste Treffer hatte keinen Datenbankzugriff. Die zweite hat einen Datenbankzugriff, aber die Ansichten benötigten nur 7,8 ms, und die Datenbank nur 1,5 ms, aber die gesamte Seite war fast 2 Minuten lang nicht vollständig!Dies ist ein ziemlich häufiges Beispiel, aber ich habe einige Protokolleinträge mit 14+ Sekunden für eine Seitenantwort. Und nein, das ist nicht während der ersten Rails laden nach einem Neustart.

Was könnte diese Zeit möglicherweise dauern?

1) Habe ich die ActiveRecord-Zeitberichte falsch interpretiert und das ist wirklich nur die Code-Zeit, aber die Echtzeit-Datenbank-Zeit ist, wo die Zeit läuft?

2) Ich benutze sqlite. Ich weiß, dass ich wahrscheinlich zu MySQL wechseln muss, da ich Nebenläufigkeitsprobleme haben werde, da (fast) jeder Seitentreffer eine Datenbank schreibt. Aber im Moment habe ich kaum Verkehr; höchstens vielleicht 15 Personen gleichzeitig auf der Baustelle. Im obigen Protokollbeispiel gab es jeweils nur einen Treffer mit 4-6 Sekunden zwischen jedem Treffer. Ich würde denken, sqlite könnte damit umgehen ...

3) Ich bin auf einem gemeinsamen VPS. Das bedeutet, es ist möglich, dass ein anderer Benutzer auf dem VPS zur gleichen Zeit etwas unternahm, was den Server verlangsamte. Meistens hat mein VPS eine sehr niedrige CPU-Last, aber es ist möglich, dass ich Pech hatte und in genau diesem Moment etwas passierte. Aber ich habe oft genug gesehen, dass ich das nicht als Antwort kaufe.

4) Das VPS hat nur 512 + 512 MB Speicher. Ich zeige, dass es 150MB frei gibt, aber ist es möglich, dass ich nur die Speichergrenzen betrachte und dies ist Seitenwechsel oder so?

5) Ich habe auch ein paar BusyException im Log gesehen. Ich erhöhte das database.ym-Timeout auf 15 Sekunden (von 5), um zu sehen, ob das hilft. Habe seither keinen wirklichen Test gemacht, um zu sehen, ob es passiert ist.

Ich weiß, dass ich wahrscheinlich nicht genug Informationen für Sie bereitgestellt habe, um mir zu sagen, was los ist, also ist die wirkliche Frage, wie beginne ich überhaupt zu versuchen, dies nachzuverfolgen?

+0

Sind alle von der gleichen IP-Adresse? –

+0

Ja, in diesem Beispiel stammten diese 3 Treffer vom selben Benutzer. Zwischen den Treffern waren auch keine anderen Benutzer. –

Antwort

1

So zwei Dinge ..

  1. Verwenden New Relic, um Code zu diagnostizieren, das langsam ist
  2. Basierend auf der Protokollierung, ich würde wetten, dass Sie einige Array Manipulation tun oder eine große Palette von Produkten Rückkehr in FleetsController # index ... es sieht so aus, als ob dein Anwendungscode dort Sachen macht.

http://www.newrelic.com/

Wenn das falsch aussieht, schreiben Sie den Code in FleetsController # Index. Aber NewRelic kann Ihnen helfen, herauszufinden, wo genau Sie Ihre Zyklen in langsamen Webanfragen verbringen.

+0

Ich schaue mir New Relic an. –

+0

Der Code ist auf Github unter: https://github.com/markpundsack/fleet-tracker/blob/master/app/controllers/fleets_controller.rb. –

+0

FleetsController # Index sollte nicht wirklich viel tun. Es gibt einen Aufruf, die Datenbank mit Informationen über den aktuellen Benutzer zu aktualisieren (was für alle Ansichten der Fall ist), und dann eine Suche, um zu sehen, auf welche Flotten sie Zugriff haben. Das .visible scope hat eine leicht gefaltete where-Klausel, aber die Menge der Daten ist nicht sehr groß. Normalerweise existieren nur 1-2 Flotten zu einer Zeit bis jetzt und nur vielleicht 40 Benutzer in der gesamten Datenbank. FleetsController # show hat mehr zu tun, was dazu führt, dass die Ansicht fast 10 mal länger verarbeitet wird als #index. –

0

SQLite macht überhaupt keine Nebenläufigkeit. Ich denke, dass Verbindungen in der Datenbank blockiert werden. Die tatsächlichen Abfragen sind in Ordnung, aber ich vermute, dass die SQLite-Datenbank-Datei gesperrt ist, während eine andere Abfrage ausgeführt wird.

Sie müssen wirklich zu einer tatsächlichen Server-Datenbank wie MySQL oder PostgreSQL verschieben.

+0

Ich bin bereit, bei Bedarf zu MySQL zu wechseln, aber im obigen Beispiel gab es noch keine Parallelität. Während dieser Zeit war ein einzelner Nutzer auf der Website. Anderswo habe ich ein Nebenläufigkeitsproblem bemerkt. Aber, mein Bauchgefühl sagt, dass etwas anderes falsch ist, und wenn ich das beheben kann, sollte die Menge der Datenbankzeit so klein sein, dass ich gegen Nebenläufigkeitsprobleme nicht stoßen werde, bis die Seite viel beschäftigter wird. –