2016-03-26 14 views
4

In den letzten Monaten hatte meine Website (auf Rails 4 mit Heroku) keine Probleme. Der Verkehr war stabil und Reaktionszeiten unter 500 ms.Verstehen, warum meine Rails 4 App nach dem Zufallsprinzip läuft

Nach dem Zufallsprinzip heute, Reaktionszeiten bis zu 20.000 ms +.

Heroku response times

Wenn in meinen Logs suchen, bemerkte ich Active ungewöhnlich lange dauert ein SELECT DISTINCT COUNT zu laufen. Dies schien in der Tat die langsamen Lasten zu verursachen.

(5029.1ms) SELECT DISTINCT COUNT(DISTINCT "impressions"."session_hash") FROM "impressions" WHERE "impressions"."impressionable_id" = $1 AND "impressions"."impressionable_type" = $2 [["impressionable_id", 826], ["impressionable_type", "Article"]] 

Ich möchte, dies sagen ist durch die impressionistische Edelstein- und meinen Gegen Cache verursacht wird, dass ich Artikel Zählung anzuzeigen bin, aber ich bin nicht sicher.

ich jetzt bin auch diesen Fehler in meinem Logs zum ersten Mal zu sehen:

PG::DuplicatePstatement: ERROR: prepared statement "a9" already exists 

Jede Hilfe zu verstehen, was fantastisch wäre passiert. Ich kann keine Dokumentation zu diesem Problem finden. Sehr merkwürdig, dass meine App seit Monaten solide läuft und gerade heute beschließt sie, bergab zu gehen.

Ich verwende auch das Rack Timeout-Juwel mit Heroku. Ich habe gehört, dass dieser Edelstein direkt oder indirekt den oben genannten Fehler verursachen kann, aber ich kann nur meinen Kopf darum drehen, warum das alles passiert. Lassen Sie es mich wissen, wenn es weitere Informationen oder Messwerte gibt, die ich bereitstellen kann.

Eintages Später Update:

Ansprechzeiten normal ging zurück auf ihre eigenen (< 500 ms). Kann nicht herausfinden, warum so eine zufällige Spitze.

Und gerade als Referenz, wurde die obige SELECT DISTINCT COUNT Abfrage von diesem Code in meinem Artikel anzeigen Seite ausgeführt wird, die einfach ist, die Eindrücke einzigartig für die Sitzung zu zählen:

<%= @article.impressionist_count(filter: :session_hash) %> 
+1

laufen zu lassen Verwenden Sie die kostenpflichtige Version von Heroku oder kostenlos? – CheeseFry

+0

Bezahlt ... läuft auf einer Standard 2X Dyno und Hobby Basic DB (mit 10m Zeilen) @CheeseFry – Kathan

+0

Können Sie den Ruby Code posten, der diese Abfrage generiert? – spickermann

Antwort

0

Dieser Fehler PG::DuplicatePstatement: ERROR: prepared statement "a9" already exists weil Sie vorbereitet haben, passiert Anweisungen aktiviert. Ich weiß nicht, was die genaue Ursache dieses Fehlers ist. Ich sah es zufällig während meiner Test-Builds und an einigen anderen Orten. Ich würde Ihnen im Allgemeinen empfehlen, vorbereitete Anweisungen zu deaktivieren, da Sie dadurch echte Probleme vermeiden können. Wenn Sie mehr Traffic erhalten und versuchen, Ihre Dynos zu skalieren, können Sie Fehler von pg gem aus dem Speicher erkennen.

So deaktivieren Sie einfach diese

production: 
    adapter: postgresql 
    prepared_statements: false 

Sie können auch deaktivieren für andere Umgebungen zu Ihrem database.yml hinzuzufügen.

Zurück zum Anfang Problem, in der Regel COUNT Abfragen sind langsam in Postgres vor allem mit DISTINCT so sollten Sie wahrscheinlich versuchen, es zu optimieren. Aber da es ein zufälliger Spike ist, würde ich wetten, dass es durch AUTOVACUUM verursacht wurde. Wenn Sie nicht vertraut sind, ist AUTOVACUUM wie ein Garbage Collector, der gelöschte Zeilen von der Festplatte entfernt, sammelt Statistiken usw. Wenn es ausgeführt wird, erzeugt es eine Menge IO-Verkehr, der andere Abfragen verlangsamt. Standardmäßig wird es aufgerufen, nachdem sich 20% der Zeilen in der Tabelle geändert haben und Sie können nicht genau vorhersagen, wann dies geschehen wird. Es ist möglich, es manuell während der Nachtstunden oder nur während des niedrigen Verkehrs zu laufen. Geben Sie einfach VACUUM ANALYZE table_name; in psql ein.

Sie können auch die Datenbank-Statistiken sehen, die sich auf autovacuum beziehen (letztes Mal wurde es ausgeführt, wie viele Zeilen geändert usw.). Der einfachste Weg ist, https://github.com/heroku/heroku-pg-extras zu installieren und heroku pg:vacuum-stats

Verwandte Themen