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?
Sind alle von der gleichen IP-Adresse? –
Ja, in diesem Beispiel stammten diese 3 Treffer vom selben Benutzer. Zwischen den Treffern waren auch keine anderen Benutzer. –